说明: 这个参数调优借鉴之尚硅谷课程
1. 配置hdfs存储多目录
生产环境的磁盘情况
问题: 需要增加的磁盘? 如何进行存储
说明:
HDFS的DataNode节点保存数据的路径由dfs.datanode.data.dir参数决定,其默认值为
file://${hadoop.tmp.dir}/dfs/data
,若服务器有多个磁盘,必须对该参数进行修改。如服务器磁盘如上图所示,则该参数应修改为如下的值。
hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///dfs/data1,
file:///**hd2**/dfs/data2, <!--注意这个目录的位置data1就是本地, hd2,hd3,hd4都是挂载的磁盘-->
file:///**hd3**/dfs/data3,
file:///**hd4**/dfs/data4</value>
</property>
注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,不需要分发
2. 集群数据均衡
问题: 有时候因为新添加的节点,或者是因为副本分配问题出现了数据不均衡问题
1)节点间数据均衡
开启数据均衡命令:
start-balancer.sh -threshold 10
对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不 超过10%,可根据实际情况进行调整。
(2)停止数据均衡命令:
stop-balancer.sh
注意:由于启动数据均衡命令比较耗费资源, 最好找一台比较空闲的机器进行执行, 防止namenode 宕机
3. 集群配置LZO压缩
- hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件。hadoop-lzo需依赖hadoop和lzo进行编译.这个编译是有点麻烦的,大家可以自己到网上去找一下和hadoop对应版本编译好的lZO
- 将编译好的jar包放到 hadoop/share/hadoop/common/下
- 在core-site.xml添加以下支持
<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>
- 上面就已经添加好LZO的支持了,LZO虽然支持切片,但是如果想要进行使用切片,还得创建索引文件
例:
hadoop jarLZOjar包
com.hadoop.compression.lzo.DistributedLzoIndexer目标lzo文件路径
4.参数调优
4.1 hdfs-site.xml:
NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>
计算方式:
dfs.namenode.handler.count=20 X log e 服务器个数
,比如集群规模(DataNode台数)为8台时,此参数设置为20 X log e 8 = 41。
4.2 yarn-site.xml
(1)情景描述:总共7台机器,每天几亿条数据,数据源->Flume->Kafka->HDFS->Hive
面临问题:数据统计主要用HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的JVM重用,而且IO没有阻塞,内存用了不到50%
。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。
(2)解决办法:
内存利用率不够
。这个一般是Yarn的2个配置造成的
,单个任务可以申请的最大内存大小
和Hadoop单个节点可用内存大小
。调节这两个参数能提高系统内存的利用率。
(a)
yarn.nodemanager.resource.memory-mb:
表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。
(b)yarn.scheduler.maximum-allocation-mb:
单个任务可申请的最多物理内存量,默认是8192(MB)。
hdfs读写性能测试:
写性能测试:
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
读性能测试:
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB
将读写性能测试产生的数据进行删除:
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -clean
参数解析:
-write : 写
-read: 读
-nrFiles : 文件的个数
-filesize: 每个文件的大小