基于Hadoop生态SparkStreaming的大数据实时流处理平台的搭建
随着公司业务发展,对大数据的获取和实时处理的要求就会越来越高,日志处理、用户行为分析、场景业务分析等等,传统的写日志方式根本满足不了业务的实时处理需求,所以本人准备开始着手改造原系统中的数据处理方式,重新搭建一个实时流处理平台,主要是基于hadoop生态,利用Kafka作为中转,SparkStreaming框架实时获取数据并清洗,将结果多维度的存储进HBase数据库。
整个平台大致的框架如下:
操作系统:Centos7
用到的框架:
1. Flume1.8.0
2. Hadoop2.9.0
3. kafka2.11-1.0.0
4.Spark2.2.1
5.HBase1.2.6
6. ZooKeeper3.4.11
7. maven3.5.2
整体的开发环境是基于JDK1.8以上以及Scala,所以得提前把java和Scala的环境给准备好,接下来就开始着手搭建基础平台:
一、配置开发环境
下载并解压JDK1.8,、下载并解压Scala,配置profile文件:
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SCALA_HOME=/usr/local/scala-2.11.12
export PATH=$PATH:$SCALA_HOME/bin
source /etc/profile
二、配置zookeeper、maven环境
下载并解压zookeeper以及maven并配置profile文件
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
tar -zxvf apache-maven-3.5.2-bin.tar.gz -C /usr/local
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
tar -zxvf zookeeper-3.4.11.tar.gz -C /usr/local
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.5.2
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
zookeeper的配置文件配置一下:
cp /usr/local/zookeeper-3.4.11/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.11/conf/zoo.cfg
然后配置一下zoo.cfg里面的相关配置,指定一下dataDir目录等等
启动zookeeper:
/usr/local/zookeeper-3.4.11/bin/zkServer.sh start
如果不报错,jps看一下是否启动成功
三、安装配置Hadoop
Hadoop的安装配置在之前文章中有说过(传送门),为了下面的步骤方便理解,这里只做一个单机版的简单配置说明:
下载hadoop解压并配置环境:
wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.9.0/hadoop-2.9.0.tar.gz
tar -zxvf hadoop-2.9.0.tar.gz -C /usr/local
vim /etc/profile
export HADOOP_HOME=/usr/local/hadoop-2.9.0
export PATH=$PATH:$HADOOP_HOME/bin
source /etc/profile
配置hadoop 进入/usr/local/hadoop-2.9.0/etc/hadoop目录
cd /usr/local/hadoop-2.9.0/etc/hadoop
首先配置hadoop-env.sh、yarn-env.sh,修改JAVA_HOME到指定的JDK安装目录/usr/local/java/jdk1.8.0_144
创建hadoop的工作目录
mkdir /opt/data/hadoop
编辑core-site.xml、hdfs-site.xml、yarn-site.xml等相关配置文件,具体配置不再阐述请看前面的文章,配置完成之后记得执行hadoop namenode -format,否则hdfs启动会报错,启动完成后不出问题浏览器访问50070端口会看到hadoop的页面。
想学习大数据或者想学习大数据的朋友,我整理了一套大数据的学习视频免费分享给大家,从入门到实战都有,大家可以加微信:Lxiao_28获取,还可以入微信群交流!(备注领取资料,真实有效)。
四、安装配置kafka
还是一样,先下载kafka,然后配置:
wget http://mirrors.hust.edu.cn/apache/kafka/1.0.0/kafka_2.11-1.0.0.tgz
tar -zxvf kafka_2.11-1.0.0.tgz -C /usr/local
vim /etc/profile
export KAFKA_HOME=/usr/local/kafka_2.11-1.0.0
export PATH=$KAFKA_HOME/bin:$PATH
source /etc/profile
进入kafka的config目录,配置server.properties,指定log.dirs和zookeeper.connect参数;配置zookeeper.properties文件中zookeeper的dataDir,配置完成后启动kafka
kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties
可以用jps查看有没有kafka进程,然后测试一下kafka是否能够正常收发消息,开两个终端,一个用来做producer发消息一个用来做consumer收消息,首先,先创建一个topic
kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic testTopic
kafka-topics.sh --describe --zookeeper localhost:2181 --topic testTopic
如果不出一下会看到如下输出:
Topic:testTopic PartitionCount:1 ReplicationFactor:1 Configs:
Topic: testTopic Partition: 0 Leader: 0 Replicas: 0 Isr: 0
然后在第一个终端中输入命令:
kafka-console-producer.sh –broker-list localhost:9092 –topic testTopic
在第二个终端中输入命令:
kafka-console-consumer.sh –zookeeper 127.0.0.1:2181 –topic testTopic
如果启动都正常,那么这两个终端将进入阻塞监听状态,在第一个终端中输入任何消息第二个终端都将会接收到。
五、安装配置HBase
下载并解压HBase:
wget http://mirrors.hust.edu.cn/apache/hbase/1.2.6/hbase-1.2.6-bin.tar.gz
tar -zxvf hbase-1.2.6-bin.tar.gz -C /usr/local/
vim /etc/profile
export HBASE_HOME=/usr/local/hbase-1.2.6
export PATH=$PATH:$HBASE_HOME/bin
source /etc/profile
修改hbase下的配置文件,首先修改hbase-env.sh,主要修改JAVA_HOME以及相关参数,这里要说明一下HBASE_MANAGES_ZK这个参数,因为采用了自己的zookeeper,所以这里设置为false,否则hbase会自己启动一个zookeeper
cd /usr/local/hbase-1.2.6/conf
vim hbase-env.sh
export JAVA_HOME=/usr/local/java/jdk1.8.0_144/
HBASE_CLASSPATH=/usr/local/hbase-1.2.6/conf
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=256m -XX:MaxPermSize=1024m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=256m -XX:MaxPermSize=1024m"
export HBASE_PID_DIR=/opt/data/hbase
export HBASE_MANAGES_ZK=false
然后修改hbase-site.xml,我们设置hbase的文件放在hdfs中,所以要设置hdfs地址,其中tsk1是我安装hadoop的机器的hostname,hbase.zookeeper.quorum参数是安装zookeeper的地址,这里的各种地址最好用机器名
vim hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://tsk1:9000/hbase</value>
</property>
<property>
<name>hbase.master</name>
<value>tsk1:60000</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.70.135</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/data/zookeeper</value>
</property>
<property>
<name>hbase.master.info.bindAddress</name>
<value>tsk1</value>
</property>
</configuration>
配置完成后启动hbase,输入命令:
start-hbase.sh
完成后查看日志没有报错的话测试一下hbase,用hbase shell进行测试:
hbase shell
hbase(main):001:0>create 'myTestTable','info'
0 row(s) in 2.2460 seconds
=> Hbase::Table - myTestTable
hbase(main):003:0>list
TABLE
testTable
1 row(s) in 0.1530 seconds => ["myTestTable"]
至此,hbase搭建成功,访问以下hadoop的页面,查看file system(菜单栏Utilities->Browse the file system),这时可以看见base的相关文件已经载hadoop的文件系统中。
六、安装spark
下载spark并解压
wget http://mirrors.hust.edu.cn/apache/spark/spark-2.2.1/spark-2.2.1-bin-hadoop2.7.tgz
tar -zxvf spark-2.2.1-bin-hadoop2.7.tgz -C /usr/local
vim /etc/profile
export SPARK_HOME=/usr/local/spark-2.2.1-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
source /etc/profile
七、测试
至此,环境基本搭建完成,以上搭建的环境仅是服务器生产环境的一部分,涉及服务器信息、具体调优信息以及集群的搭建就不写在这里了,下面我们写一段代码整体测试一下从kafka生产消息到spark streaming接收到,然后处理消息并写入HBase。先写一个HBase的连接类HBaseHelper:
public class HBaseHelper {
private static HBaseHelper ME;
private static Configuration config;
private static Connection conn;
private static HBaseAdmin admin; public static HBaseHelper getInstances() {
if (null == ME) {
ME = new HBaseHelper();
config = HBaseConfiguration.create();
config.set("hbase.rootdir", "hdfs://tsk1:9000/hbase");
config.set("hbase.zookeeper.quorum", "tsk1");
config.set("hbase.zookeeper.property.clientPort", "2181");
config.set("hbase.defaults.for.version.skip", "true");
}
if (null == conn) {
try {
conn = ConnectionFactory.createConnection(config);
admin = new HBaseAdmin(config);
} catch (IOException e) {
e.printStackTrace();
}
}
return ME;
} public Table getTable(String tableName) {
Table table = null;
try {
table = conn.getTable(TableName.valueOf(tableName));
} catch (Exception ex) {
ex.printStackTrace();
} return table;
} public void putAdd(String tableName, String rowKey, String cf, String column, Long value) {
Table table = this.getTable(tableName);
try {
table.incrementColumnValue(rowKey.getBytes(), cf.getBytes(), column.getBytes(), value);
System.out.println("OK!");
} catch (IOException e) {
e.printStackTrace();
} }
//......以下省略
}
再写一个测试类KafkaRecHbase用来做spark-submit提交
package com.test.spark.spark_test; import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.SparkConf;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka.KafkaUtils; import scala.Tuple2; public class KafkaRecHbase {
private static final Pattern SPACE = Pattern.compile(" "); public static void main(String[] args) throws Exception {
Logger.getLogger("org").setLevel(Level.ERROR);
SparkConf sparkConf = new SparkConf();
sparkConf.setAppName("kafkaRecHbase");
sparkConf.setMaster("local[2]");
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(5));
int numThreads = Integer.parseInt(args[3]);
Map<String, Integer> topicMap = new HashMap<>();
String[] topics = args[2].split(",");
for (String topic : topics) {
topicMap.put(topic, numThreads);
}
JavaPairReceiverInputDStream<String, String> kafkaStream =
KafkaUtils.createStream(ssc, args[0], args[1], topicMap);
JavaDStream<String> lines = kafkaStream.map(Tuple2::_2);
JavaDStream<String> lineStr = lines.map(line -> {
if (null == line || line.equals("")) {
return "";
}
String[] strs = SPACE.split(line);
if (strs.length < 1) {
return "";
}
try {
for (String str : strs) {
HBaseHelper.getInstances().putAdd("myTestTable", str, "info", "wordCunts", 1l);
}
return "strs:" + line;
} catch (Exception ex) {
System.out.println(line);
return "报错了:" + ex.getMessage();
}
});
lineStr.print();
ssc.start();
System.out.println("spark 启动!!!");
ssc.awaitTermination();
}
}
编译提交到服务器,执行命令:
spark-submit --jars $(echo /usr/local/hbase-1.2.6/lib/*.jar | tr ' ' ',') --class com.test.spark.spark_test.KafkaRecHbase --packages org.apache.spark:spark-streaming-kafka-0-8_2.11:2.2.1 /opt/FileTemp/streaming/spark-test-0.1.1.jar tsk1:2181 test testTopic 1
没报错的话执行kafka的producer,输入几行数据在HBase内就能看到结果了!
八、装一个Flume实时采集Nginx日志写入Kafka
Flume是一个用来日志采集的框架,安装和配置都比较简单,可以支持多个数据源和输出,具体可以参考Flume的文档,写的比较全 传送门
下载Flume并配置环境
wget http://mirrors.hust.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz
tar -zxvf apache-flume-1.8.0-bin.tar.gz -C /usr/local
vim /etc/profile
export FLUME_HOME=/usr/local/apache-flume-1.8.0-bin/
export PATH=$FLUME_HOME/bin:$PATH
source /etc/profile
写一个Flume的配置文件在flume的conf目录下:
vim nginxStreamingKafka.conf
agent1.sources=r1
agent1.channels=logger-channel
agent1.sinks=kafka-sink agent1.sources.r1.type=exec
agent1.sources.r1.deserializer.outputCharset= UTF-8
agent1.sources.r1.command=tail -F /opt/data/nginxLog/nginxLog.log agent1.channels.logger-channel.type=memory agent1.sinks.kafka-sink.type=org.apache.flume.sink.kafka.KafkaSink
agent1.sinks.kafka-sink.topic = flumeKafka
agent1.sinks.kafka-sink.brokerList = tsk1:9092
agent1.sinks.kafka-sink.requiredAcks = 1
agent1.sinks.kafka-sink.batchSize = 20 agent1.sources.r1.channels=logger-channel
agent1.sinks.kafka-sink.channel=logger-channel
kafka创建一个名为flumeKafka的topic用来接收,然后启动flume:
flume-ng agent --name agent1 --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/nginxStreamingKafka.conf -Dflume.root.logger=INFO,console
如果没有报错,Flume将开始采集opt/data/nginxLog/nginxLog.log中产生的日志并实时推送给kafka,再按照上面方法写一个spark streaming的处理类进行相应的处理就好。
基于Hadoop生态SparkStreaming的大数据实时流处理平台的搭建的更多相关文章
- 使用Oracle Stream Analytics 21步搭建大数据实时流分析平台
概要: Oracle Stream Analytics(OSA)是企业级大数据流实时分析计算平台.它可以通过使用复杂的关联模式,扩充和机器学习算法来自动处理和分析大规模实时信息.流式传输的大数据可以源 ...
- 大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图
http://edu.51cto.com/roadmap/view/id-29.html http://my.oschina.net/infiniteSpace/blog/308401 大数据实时计算 ...
- 基于Ambari构建自己的大数据平台产品
目前市场上常见的企业级大数据平台型的产品主流的有两个,一个是Cloudera公司推出的CDH,一个是Hortonworks公司推出的一套HDP,其中HDP是以开源的Ambari作为一个管理监控工具,C ...
- Storm大数据实时计算
大数据也是构建各类系统的时候一种全新的思维,以及架构理念,比如Storm,Hive,Spark,ZooKeeper,HBase,Elasticsearch,等等 storm,在做热数据这块,如果要做复 ...
- Storm 实战:构建大数据实时计算
Storm 实战:构建大数据实时计算(阿里巴巴集团技术丛书,大数据丛书.大型互联网公司大数据实时处理干货分享!来自淘宝一线技术团队的丰富实践,快速掌握Storm技术精髓!) 阿里巴巴集团数据平台事业部 ...
- Druid:一个用于大数据实时处理的开源分布式系统——大数据实时查询和分析的高容错、高性能开源分布式系统
转自:http://www.36dsj.com/archives/28590 Druid 是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分 ...
- 一文让你彻底了解大数据实时计算引擎 Flink
前言 在上一篇文章 你公司到底需不需要引入实时计算引擎? 中我讲解了日常中常见的实时需求,然后分析了这些需求的实现方式,接着对比了实时计算和离线计算.随着这些年大数据的飞速发展,也出现了不少计算的框架 ...
- Impala简介PB级大数据实时查询分析引擎
1.Impala简介 • Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. • 基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 ...
- MaxCompute,基于Serverless的高可用大数据服务
摘要:2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,阿里巴巴高级技术专家吴永明为大家分享了 ...
随机推荐
- vue常用的修饰符
v-model修饰符 <template> <div id="demo14"> <p>-----------------模板语法之修饰符---- ...
- Swift 循环
循环类型 Swift 语言提供了以下几种循环类型.点击链接查看每个类型的详细描述: 循环类型 描述 for-in 遍历一个集合里面的所有元素,例如由数字表示的区间.数组中的元素.字符串中的字符. fo ...
- Python 调用outlook发送邮件(转 )
单账号: import win32com.client as win32 def send_mail(): outlook = win32.Dispatch('Outlook.Application' ...
- Servlet 的三种跳转方式
1.Forword request.getRequestDispatcher (“url”).forword (request,response) 是请求转发,也就是说,一个 Servlet 向当前的 ...
- C++ remove remove_if erase
#include <iostream>#include <algorithm>#include <list>#include <vector>#incl ...
- Centos7.4.1708安装Jumpserver
Jumpserver 环境要求:硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低)操作系统: Linux 发行版 x86_64Python = 3.6.xMysql Server ≥ 5 ...
- haproxy配置文件实例
[root@kube-node1 ~]# cat /etc/haproxy/haproxy.cfg global log /dev/log local0 log /dev/log local1 not ...
- antd二级联动异步加载
/** * Created by Admin on 2016/9/19. * 批量导入 */ import React, {Component, PropTypes} from "react ...
- 分布式开发之:id生成器
一般分布式系统开发中不建议使用数据库自带的自增ID做id. 理由: 1.不方便分库分表.(TIDB时代待商榷) 2.不利于多机房多活部署. 那么如果不使用数据库的id.那怎么生成id呢. 1. Twi ...
- Java异步调用转同步的5种方式
1.异步和同步的概念 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 2 .异步转为同步的概率 需要 ...