8.配置历史服务器
8.1 配置 mapred-site.xml
cd $HADOOP_HOME/etc/hadoop
vim mapred-site.xml在该文件里面增加如下配置:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>8.2 分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml9.配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer。
开启日志聚集功能具体步骤如下:
9.1 配置 yarn-site.xml
cd $HADOOP_HOME/etc/hadoop
vim yarn-site.xml在该文件里面增加如下配置:
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>9.2.分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml10.Hadoop 群起脚本
10.1 Hadoop 集群启停脚本
(包含 HDFS,Yarn,Historyserve):myhadoop.sh
cd /home/duan/bin
vim myhadoop.sh输入如下内容:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac保存后退出,然后赋予脚本执行权限
chmod 777 myhadoop.sh启动集群
停止集群
2.查看三台服务器 Java 进程脚本:jpsall
cd /home/duan/bin
vim jpsall输入如下内容:
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done保存后退出,然后赋予脚本执行权限:
chmod 777 jpsall3.分发/home/atguigu/bin 目录
保证自定义脚本在三台机器上都可以使用
xsync /home/duan/bin/11. 项目经验
11.1 HDFS 存储多目录
给 Linux 系统新增加一块硬盘
参考:https://www.cnblogs.com/yujianadu/p/10750698.html
在 hdfs-site.xml 文件中配置多目录,注意新挂载磁盘的访问权限问题
HDFS 的 DataNode 节点保存数据的路径由 dfs.datanode.data.dir 参数决定,其默认值为 file://${hadoop.tmp.dir}/dfs/data,若服务器有多个磁盘,必须对该参数进行修改。如服务器磁盘如上图所示,则该参数应修改为如下的值。
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value>
</property>注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,不需要分发
11.2 集群数据均衡
1.节点间数据均衡
开启数据均衡命令
start-balancer.sh -threshold 10对于参数 10,代表的是集群中各个节点的磁盘空间利用率相差不超过 10%,可根据实际情况进行调整。
停止数据均衡命令
stop-balancer.sh注意:于 HDFS 需要启动单独的 Rebalance Server 来执行 Rebalance 操作,所以尽量不要在 NameNode 上执行 start-balancer.sh,而是找一台比较空闲的机器。
2.磁盘间数据均衡
生成均衡计划(我们只有一块磁盘,不会生成计划)
hdfs diskbalancer -plan hadoop103执行均衡计划
hdfs diskbalancer -execute hadoop103.plan.json查看当前均衡任务的执行情况
hdfs diskbalancer -query hadoop103取消均衡任务
hdfs diskbalancer -cancel hadoop103.plan.json11.3 LZO 压缩配置
1.hadoop-lzo 编译
hadoop 本身并不支持 lzo 压缩,故需要使用 twitter 提供的 hadoop-lzo 开源组件。hadoop-lzo 需依赖 hadoop 和 lzo 进行编译
编译好的 hadoop-lzo-0.4.20.jar:
2.将编译好后的 hadoop-lzo-0.4.20.jar 放入 hadoop-3.1.3/share/hadoop/common/
pwd
/opt/module/hadoop-3.1.3/share/hadoop/common
ls
hadoop-lzo-0.4.20.jar3.同步 hadoop-lzo-0.4.20.jar 到 hadoop103、hadoop104
xsync hadoop-lzo-0.4.20.jar4.core-site.xml 增加配置支持 LZO 压缩
cd /opt/module/hadoop-3.1.3/etc/hadoop/
vim core-site.xml 添加以下配置:
<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>5. 同步 core-site.xml 到 hadoop103、hadoop104
xsync core-site.xml6.重启集群
myhadoop.sh stop
myhadoop.sh start11.4LZO 创建索引
1.创建 LZO 文件的索引
LZO 压缩文件的可切片特性依赖于其索引,故我们需要手动为 LZO 压缩文件创建索引。若无索引,则 LZO 文件的切片只有一个。
2.测试
将 bigtable.lzo(200M)上传到集群的根目录
hadoop fs -mkdir /input
hadoop fs -put bigtable.lzo /input执行 wordcount 程序
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat /input /output1 对上传的 LZO 文件建索引
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /input/bigtable.lzo再次执行 WordCount 程序
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat /input /output23.注意:如果以上任务,在运行过程中报如下异常
Container [pid=8468,containerID=container_1594198338753_0001_01_000002] is running 318740992B beyond the 'VIRTUAL' memory limit. Current usage: 111.5 MB of 1 GB physical memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1594198338753_0001_01_000002 :解决办法:
在 hadoop102 的/opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml 文件中增加如下配置,然后分发到 hadoop103、hadoop104 服务器上,并重新启动集群。
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>11.5 基准测试
在企业中非常关心每天从 Java 后台拉取过来的数据,需要多久能上传到集群?消费者关心多久能从 HDFS 上拉取需要的数据?
为了搞清楚 HDFS 的读写性能,生产环境上非常需要对集群进行压测。
1.虚拟机网络带宽设置
HDFS 的读写性能主要受 网络和磁盘 影响比较大。为了方便测试,将 hadoop102、hadoop103、hadoop104 虚拟机网络都设置为 100mbps。
测试网速:
来到 hadoop102 的/opt/module 目录,创建一个
cd cd /opt/software/ python -m SimpleHTTPServer在 Web 页面上访问
随便点击一个文件下载,速度大致为 10MB/s
2. 测试 HDFS 写性能
写测试底层原理

测试内容:向 HDFS 集群写 10 个 128M 的文件
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB测试结果分析
注意:nrFiles n 为生成 mapTask 的数量,生产环境一般可通过 hadoop103:8088 查看 CPU 核数,设置为(CPU 核数 - 1)
Number of files: 生成 mapTask 数量,一般是集群中(CPU 核数 - 1),我们测试虚拟机就按照实际的物理内存-1 分配即可。(目标,让每个节点都参与测试)
Total MBytes processed: 单个 map 处理的文件大小
Throughput mb/sec: 单个 mapTak 的吞吐量
计算方式:处理的总文件大小/每一个 mapTask 写数据的时间累加
集群整体吞吐量:生成 mapTask 数量*单个 mapTak 的吞吐量
Average IO rate mb/sec: 平均 mapTak 的吞吐量
计算方式:每个 mapTask 处理文件大小/每一个 mapTask 写数据的时间全部相加除以 task 数量
IO rate std deviation: 方差、反映各个 mapTask 处理的差值,越小越均衡
注意:如果测试过程中,出现异常:
① 可以在 yarn-site.xml 中设置虚拟内存检测为 false
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>② 分发配置并重启 Yarn 集群
3. 测试 HDFS 读性能
(1)测试内容:读取 HDFS 集群 10 个 128M 的文件
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB(2)删除测试生成数据
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean4.使用 Sort 程序评测 MapReduce——本实验虚拟机 4G 内存,性能不足以测试
11.6 Hadoop 参数调优
1.HDFS 参数调优 hdfs-site.xml
The number of Namenode RPC server threads that listen to requests from clients. If dfs.namenode.servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes.
NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大参数 dfs.namenode.handler.count 的默认值 10。
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>参数计算公式:dfs.namenode.handler.count =
比如集群规模为 8 台时,此参数设置为 41,可通过简单的 python 代码计算该值,代码如下:
python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> print int(20*math.log(8))
41
>>> quit()2.YARN 参数调优 yarn-site.xml
情景描述:总共 7 台机器,每天几亿条数据,数据源-> Flume-> Kafka-> HDFS-> Hive
面临问题:数据统计主要用 HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的 JVM 重用,而且 IO 没有阻塞,内存用了不到 50%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。
解决办法:
NodeManager 内存和服务器实际内存配置尽量接近,如服务器有 128g 内存,但是 NodeManager 默认内存 8G,不修改该参数最多只能用 8G 内存。NodeManager 使用的 CPU 核数和服务器 CPU 核数尽量接近。
yarn.nodemanager.resource.memory-mb NodeManager 使用内存数
yarn.nodemanager.resource.cpu-vcores NodeManager 使用 CPU 核数