上篇:用户行为数据采集 第7 节 Kafka压力测试、消费数据flume
1、项目经验之Flume内存优化
- 问题描述:如果启动消费Flume抛出如下异常?
ERROR hdfs.HDFSEventSink: process failed
java.lang.OutOfMemoryError: GC overhead limit exceeded
解决方案步骤:
(1) 在hadoop1.x服务器的flume/conf/flume-env.sh文件中增加如下配置
export JAVA_OPTS="-Xms100m -Xmx2000m -Dcom.sun.management.jmxremote"
(2) 同步配置到hadoop2.x、hadoop3.x服务器
[root@hadoop1 conf]# xsync flume-env.sh
- Flume内存参数设置及优化
JVM heap一般设置为4G或更高,部署在单独的服务器上(4核8线程16G内存)
-Xmx与-Xms最好设置一致,减少内存抖动带来的性能影响,如果设置不一致容易导致频繁fullgc。
2、项目经验之Flume组件
-
FileChannel和MemoryChannel区别
MemoryChannel传输数据速度更快,但因为数据保存在JVM的堆内存中,Agent进程挂掉会导致数据丢失,适用于对数据质量要求不高的需求。
FileChannel传输速度相对于Memory慢,但数据安全保障高,Agent进程挂掉也可以从失败中恢复数据。 -
FileChannel优化
通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量。
官方说明如下:
Comma separated list of directories for storing log files. Using
multiple directories on separate disks can improve file channel
peformance
checkpointDir和backupCheckpointDir也尽量配置在不同硬盘对应的目录中,保证checkpoint坏掉后,可以快速使用backupCheckpointDir恢复数据
-
Sink:HDFS Sink
(1)HDFS存入大量小文件,有什么影响?
元数据层面:每个小文件都有一份元数据,其中包括文件路径,文件名,所有者,所属组,权限,创建时间等,这些信息都保存在Namenode内存中。所以小文件过多,会占用Namenode服务器大量内存,影响Namenode性能和使用寿命
计算层面:默认情况下MR会对每个小文件启用一个Map任务计算,非常影响计算性能。同时也影响磁盘寻址时间。(2)HDFS小文件处理
官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount
基于以上hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0,hdfs.roundValue=10,hdfs.roundUnit= second几个参数综合作用,效果如下:
(1)tmp文件在达到128M时会滚动生成正式文件
(2)tmp文件创建超3600秒时会滚动生成正式文件
举例:在2018-01-01 05:23的时侯sink接收到数据,那会产生如下tmp文件:
/atguigu/20180101/atguigu.201801010620.tmp
即使文件内容没有达到128M,也会在06:23时滚动生成正式文件
3、采集通道启动/停止脚本
- 在/home/MrZhou/bin目录下创建脚本cluster.sh
[root@hadoop1 bin]# vim cluster.sh
//在脚本中填写如下内容
#! /bin/bash
case $1 in
"start"){
echo " -------- 启动 集群 -------"
echo " -------- 启动 hadoop集群 -------"
/usr/local/etc/hadoop/module/hadoop-2.7.2/sbin/start-dfs.sh
ssh hadoop2.x " /usr/local/etc/hadoop/module/hadoop-2.7.2/sbin/start-yarn.sh "
#启动 Zookeeper集群
./zk.sh start
sleep 4s;
#启动 Flume采集集群
./f1.sh start
#启动 Kafka采集集群
./kf.sh start
sleep 6s;
#启动 Flume消费集群
./f2.sh start
#启动 KafkaManager
./km.sh start
};;
"stop"){
echo " -------- 停止 集群 -------"
#停止 KafkaManager
./km.sh stop
#停止 Flume消费集群
./f2.sh stop
#停止 Kafka采集集群
./kf.sh stop
sleep 6s;
#停止 Flume采集集群
./f1.sh stop
#停止 Zookeeper集群
./zk.sh stop
echo " -------- 停止 hadoop集群 -------"
ssh hadoop2.x "/usr/local/etc/hadoop/module/hadoop-2.7.2/sbin/stop-yarn.sh"
/usr/local/etc/hadoop/module/hadoop-2.7.2/sbin/stop-dfs.sh
};;
esac
- 增加脚本执行权限
[root@hadoop1 bin]# chmod 777 cluster.sh
- cluster集群启动脚本
[root@hadoop1 bin]# ./cluster.sh start
-------- 启动 集群 -------
-------- 启动 hadoop集群 -------
Starting namenodes on [hadoop1.x]
hadoop1.x: starting namenode, logging to /usr/local/etc/hadoop/module/hadoop-2.7.2/logs/hadoop-root-namenode-hadoop1.x.out
localhost: starting datanode, logging to /usr/local/etc/hadoop/module/hadoop-2.7.2/logs/hadoop-root-datanode-hadoop1.x.out
Starting secondary namenodes [hadoop1.x]
hadoop1.x: starting secondarynamenode, logging to /usr/local/etc/hadoop/module/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-hadoop1.x.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/etc/hadoop/module/hadoop-2.7.2/logs/yarn-root-resourcemanager-hadoop2.x.out
localhost: starting nodemanager, logging to /usr/local/etc/hadoop/module/hadoop-2.7.2/logs/yarn-root-nodemanager-hadoop2.x.out
JMX enabled by default
Using config: /usr/local/etc/hadoop/module/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /usr/local/etc/hadoop/module/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /usr/local/etc/hadoop/module/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
--------启动 hadoop1.x 采集flume-------
--------启动 hadoop2.x 采集flume-------
--------启动 hadoop1.x Kafka-------
--------启动 hadoop2.x Kafka-------
--------启动 hadoop3.x Kafka-------
--------启动 hadoop3.x 消费flume-------
-------- 启动 KafkaManager -------
查看集群进程
[root@hadoop1 bin]# ./xcall.sh jps
--------- hadoop1.x ----------
17088 Jps
16113 NameNode
16417 SecondaryNameNode
16977 ProdServerStart
16899 Kafka
16246 DataNode
16553 QuorumPeerMain
16591 Application
--------- hadoop2.x ----------
10929 Jps
10370 NodeManager
10862 Kafka
10447 QuorumPeerMain
--------- hadoop3.x ----------
11079 Jps
10683 QuorumPeerMain
10942 Kafka
- cluster集群停止脚本
[root@hadoop1 bin]# ./cluster.sh stop