Hadoop实操-3

8.配置历史服务器 8.1 配置 mapred-site.xml  cd $HADOOP_HOME/etc/hadoop  vim mapred-site.xml 在该文件里面增加如下配置:  <!-- 历史服务器端地址 -->  <

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.xml

9.配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 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.xml

10.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 jpsall

3.分发/home/atguigu/bin 目录

保证自定义脚本在三台机器上都可以使用

xsync /home/duan/bin/

11. 项目经验

11.1 HDFS 存储多目录

  1. 给 Linux 系统新增加一块硬盘

参考:https://www.cnblogs.com/yujianadu/p/10750698.html

  1. 在 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.json

11.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.jar
3.同步 hadoop-lzo-0.4.20.jar 到 hadoop103、hadoop104
xsync hadoop-lzo-0.4.20.jar
4.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.xml
6.重启集群
myhadoop.sh stop
myhadoop.sh start

11.4LZO 创建索引

1.创建 LZO 文件的索引

LZO 压缩文件的可切片特性依赖于其索引,故我们需要手动为 LZO 压缩文件创建索引。若无索引,则 LZO 文件的切片只有一个。

2.测试
  1. 将 bigtable.lzo(200M)上传到集群的根目录

hadoop fs -mkdir /input
hadoop fs -put bigtable.lzo /input
  1. 执行 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   
  1. 对上传的 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
  1. 再次执行 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 /output2
3.注意:如果以上任务,在运行过程中报如下异常
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。

测试网速:

  1. 来到 hadoop102 的/opt/module 目录,创建一个

     cd
     cd /opt/software/
     python -m SimpleHTTPServer
  2. 在 Web 页面上访问

Directory listing for /

随便点击一个文件下载,速度大致为 10MB/s

2. 测试 HDFS 写性能
  1. 写测试底层原理

  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 -write -nrFiles 10 -fileSize 128MB
  1. 测试结果分析

注意: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 -clean
4.使用 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 =

20\times{log}_e^{Cluster\ Size}


比如集群规模为 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

  1. 情景描述:总共 7 台机器,每天几亿条数据,数据源-> Flume-> Kafka-> HDFS-> Hive

面临问题:数据统计主要用 HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的 JVM 重用,而且 IO 没有阻塞,内存用了不到 50%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。

  1. 解决办法:

NodeManager 内存和服务器实际内存配置尽量接近,如服务器有 128g 内存,但是 NodeManager 默认内存 8G,不修改该参数最多只能用 8G 内存。NodeManager 使用的 CPU 核数和服务器 CPU 核数尽量接近。

  • yarn.nodemanager.resource.memory-mb NodeManager 使用内存数

  • yarn.nodemanager.resource.cpu-vcores NodeManager 使用 CPU 核数

Comment