概况
技术选型
图片来自尚硅谷。
服务器规划
服务名称 | 子服务 | hadoop102 | hadoop103 | hadoop104 |
---|---|---|---|---|
HDFS | NameNode | + | ||
HDFS | DataNode | + | + | + |
HDFS | SecondaryNameNode | + | ||
Yarn | NodeManager | + | + | + |
Yarn | ResourceManager | + | ||
Zookeeper | Zookeeper Server | + | + | + |
Flume(日志) | Flume | + | + | |
Kafka | Kafka | + | + | + |
Flume(消费) | Flume | + | ||
Hive | Hive | + | ||
MySQL | MySQL | + | ||
Sqoop | Sqoop | + | ||
Presto | Coordinator | + | ||
Presto | Worker | + | + | |
Azkaban | Azkaban WebServer | + | ||
Azkaban | AzkabanExecutorServer | + | ||
Druid | Druid | + | + | + |
Kylin | + | |||
HBase | HMaster | + | ||
HBase | HRegionServer | + | + | + |
Superset | + | |||
Atlas | + | |||
Solr | Jar | + | ||
Griffin | + |
准备工作
先搭建好集群,确保hadoop各个模块可以启动。
安装LZO
下载包hadoop-lzo-0.4.20.jar,放在/opt/module/hadoop-2.8.2/share/hadoop/common目录下,然后用脚本分发到103、104 。
[root@hadoop102 common]# xsync hadoop-lzo-0.4.20.jar
core-site.xml 增加配置支持 LZO 压缩
[root@hadoop103 hadoop-2.8.2]# cd etc/hadoop/
[root@hadoop103 hadoop]# vim core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
</configuration>
分发
[root@hadoop102 hadoop]# xsync core-site.xml
真正使用时还需要对上传文件创建索引
[root@hadoop102 module]# hadoop jar /opt/module/hadoop-2.8.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /input/filename.lzo
其中,/input是hdfs中文件所在目录。
参数调优
NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发 的元数据操作。 对于大集群或者有大量客户端的集群来说,通常需要增大参数。
dfs.namenode.handler.count 的默认值10,当参数值为20*math.log(n)时最优,n是机器的台数。
修改hdfs-site.xml
<property>
<name>dfs.namenode.handler.count</name>
<value>21</value>
</property>
安装Zookeeper
详见Zookeeper,这里主要介绍Zookeeper的集群启动脚本,脚本一般存放在102的/root/bin目录下。
脚本如下
#! /bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
done
};;
esac
之后给与权限
[root@hadoop102 bin]# chmod 777 zk.sh
日志生成
将日志包log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar拷贝到102和103上。
执行java命令,打印日志到指定文件
[root@hadoop104 module]# java -classpath log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar com.atguigu.appclient.AppMain >/opt/module/test.log
也可以不输出
[root@hadoop102 module]# java -classpath log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar com.atguigu.appclient.AppMain 1>/dev/null 2>/dev/null
这里/dev/null是黑洞,所有进入的内容都会消失。
-
标准输入 0:从键盘获得输入 /proc/self/fd/0
-
标准输出 1:输出到屏幕(即控制台) /proc/self/fd/1
-
错误输出 2:输出到屏幕(即控制台) /proc/self/fd/2
最后,在/tmp/log目录下可以看到日志。
下面写日志集群脚本lg.sh,脚本在/root/bin目录下
for i in hadoop102 hadoop103
do
echo ---------------$i生成日志---------------
ssh $i "java -classpath /opt/module/log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar com.atguigu.appclient.AppMain $1 $2 >/dev/null 2>&1 &"
done
授权
[root@hadoop102 bin]# chmod 777 lg.sh
时间同步
时间同步脚本dt.sh
#! /bin/bash
for i in hadoop102 hadoop103 hadoop104
do
echo ---------------$i同步时间---------------
ssh $i "sudo date -s $1"
done
授权
[root@hadoop102 bin]# chmod 777 dt.sh
Linux环境变量
Linux有两种Shell,登录式和非登录式(SSH连接)。登录式会自动加载/etc/profile,非登录式会自动加载~/.bashrc
/etc/profile里面的环境变量是对系统内所有用户有效,~/.bashrc只对某一特定用户有效。
所以,要把/etc/profile的环境变量追加到~/.bashrc确保SSH访问时不会出错。
[root@hadoop102 ~]# cat /etc/profile >> ~/.bashrc
[root@hadoop103 ~]# cat /etc/profile >> ~/.bashrc
[root@hadoop104 ~]# cat /etc/profile >> ~/.bashrc
状态查询脚本
统一查询状态
#! /bin/bash
for i in hadoop102 hadoop103 hadoop104
do
echo ---------------$i状态查询---------------
ssh $i "$*"
done
安装Flume(日志)
采集日志的Flume安装在102、103上,104后面安装消费Flume。
安装包解压缩后,修改flume-env.sh.template文件名称为flume-env.sh,文件路径在/opt/module/flume-1.7.0/conf下
[root@hadoop102 conf]# mv flume-env.sh.template flume-env.sh
然后修改flume-env.sh文件的JAVA_HOME。
再同步分发到103、104(这里也要,后面104也要上flume),这样就安装完成。
Flume有两个组件Source、Channel
- Source:包括Taildir Source、Exec Source、Spooling Source,这里使用Taildir Source,Taildir Source可以断点续传、多目录。
- Channel:这里采用Kafka Channel,省去了Sink,提高了效率。
下面是具体配置,配置目录在/opt/module/flume-1.7.0/conf,新建file-flume-kafka.conf文件,名字可以自定义(见名知意即可)。
a1.sources=r1 #组件定义
a1.channels=c1 c2
#configure source
a1.sources.r1.type = TAILDIR #taildir方式读数据
a1.sources.r1.positionFile = /opt/module/flume-1.7.0/test/log_position.json #记录日志读取位置
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /tmp/logs/app.+ #读取日志位置
a1.sources.r1.fileHeader = true
a1.sources.r1.channels = c1 c2
#interceptor
a1.sources.r1.interceptors = i1 i2
a1.sources.r1.interceptors.i1.type = com.hxr.flume.interceptor.LogETLInterceptor$Builder #ETL拦截器
a1.sources.r1.interceptors.i2.type = com.hxr.flume.interceptor.LogTypeInterceptor$Builder #日志类型拦截器
a1.sources.r1.selector.type=multiplexing #根据日志类型分数据
a1.sources.r1.selector.header=topic
a1.sources.r1.selector.mapping.topic_start=c1
a1.sources.r1.selector.mapping.topic_event=c2
#configure channel
a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
a1.channels.c1.kafka.topic = topic_start #start类型的发往c1
a1.channels.c1.parseAsFlumeEvent=false
a1.channels.c1.kafka.consumer.group.id = flume-consumer
a1.channels.c2.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c2.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
a1.channels.c2.kafka.topic = topic_event #event类型的发往c2
a1.channels.c2.parseAsFlumeEvent=false
a1.channels.c2.kafka.consumer.group.id = flume-consumer
将配置分发到103、104上。
下面接着实现拦截器,拦截器打包后放在/flume-1.7.0/lib目录下,然后分发到103、104。
在102、103上打开Flume
[root@hadoop102 flume-1.7.0]# bin/flume-ng agent --name a1 --conf-file conf/file-flume-kafka.conf &
[root@hadoop103 flume-1.7.0]# bin/flume-ng agent --name a1 --conf-file conf/file-flume-kafka.conf &
为了快速启动多台服务器,可以使用脚本
#! /bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103
do
echo ---------------启动$i采集flume---------------
ssh $i "nohup /opt/module/flume-1.7.0/bin/flume-ng agent --name a1 --conf-file /opt/module/flume-1.7.0/conf/file-flume-kafka.conf
-Dflume.root.logger=