当前位置: 首页 > news >正文

离线数仓搭建_03_Hadoop的配置与优化测试

文章目录

    • 4.2 Hadoop安装(P30-P47)
      • 4.2.1 项目经验之HDFS存储多目录(了解)
      • 4.2.2 集群数据均衡
      • 4.2.3 项目经验之支持LZO压缩配置
      • 4.2.4 项目经验之LZO创建索引
      • 4.2.5 项目经验之基准测试
      • 4.2.6 项目经验之Hadoop参数调优

上文访问:离线数仓搭建_02_服务器配置与数据生产
下文访问:尽请期待!


4.2 Hadoop安装(P30-P47)

关于Hadoop的安装这里不做详细叙述:如需获取文档教程可访问:

https://blog.csdn.net/m0_58022371/article/details/126440789

image-20220903105925352

image-20220903110817339

image-20220903110332455

image-20220903110428214

4.2.1 项目经验之HDFS存储多目录(了解)

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

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

(2)生产环境服务器磁盘情况

image-20220903110859213

(3)在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>

  注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,不需要分发

4.2.2 集群数据均衡

1)节点间数据均衡
(1)开启数据均衡命令

start-balancer.sh -threshold 10

对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。
(2)停止数据均衡命令

stop-balancer.sh

注意:于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以尽量不要在NameNode上执

行start-balancer.sh

所以尽量不要在NameNode上执行start-balancer.sh,而是找一台比较空闲的机器。

2)磁盘间数据均衡
(1)生成均衡计划(我们只有一块磁盘,不会生成计划)
hdfs diskbalancer -plan hadoop103
(2)执行均衡计划
hdfs diskbalancer -execute hadoop103.plan.json
(3)查看当前均衡任务的执行情况
hdfs diskbalancer -query hadoop103
(4)取消均衡任务
hdfs diskbalancer -cancel hadoop103.plan.json

4.2.3 项目经验之支持LZO压缩配置

1)hadoop-lzo编译
   hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件。hadoop-lzo需依赖hadoop和lzo进行编译,编译步骤如下。

2)将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop-3.1.3/share/hadoop/common/

[atguigu@hadoop102 common]$ pwd
/opt/module/hadoop-3.1.3/share/hadoop/common
[atguigu@hadoop102 common]$ ls
hadoop-lzo-0.4.20.jar

3)同步hadoop-lzo-0.4.20.jar到hadoop103、hadoop104

[atguigu@hadoop102 common]$ xsync hadoop-lzo-0.4.20.jar

4)core-site.xml增加配置支持LZO压缩

<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

[atguigu@hadoop102 hadoop]$ xsync core-site.xml

6)启动及查看集群

[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

7)测试-数据准备

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /input
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put README.txt /input

8)测试-压缩

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.output.fileoutputformat.compress=true -Dmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec  /input /output

4.2.4 项目经验之LZO创建索引

​   创建索引的原因是,由于LZO是压缩格式,HDFS在传输运算过程过程中无法 进行切片,创建索引后,则会进行切片。

测试

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

[atguigu@hadoop102 module]$ hadoop fs -mkdir /input
[atguigu@hadoop102 module]$ hadoop fs -put bigtable.lzo /input

(2)执行wordcount程序

[atguigu@hadoop102 module]$ 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

image-20220903175406127

(3)对上传的LZO文件建索引

[atguigu@hadoop102 module]$ 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

(4)再次执行WordCount程序

[atguigu@hadoop102 module]$ 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

image-20220903175425515

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>

4.2.5 项目经验之基准测试

​    在企业中非常关心每天从Java后台拉取过来的数据,需要多久能上传到集群?消费者关心多久能从HDFS上拉取需要的数据?

  为了搞清楚HDFS的读写性能,生产环境上非常需要对集群进行压测

image-20220903175610282

​    HDFS的读写性能主要受网络和磁盘影响比较大。为了方便测试,将hadoop102、hadoop103、hadoop104虚拟机网络都设置为100mbps。
​   100Mbps单位是bit;10M/s单位是byte ; 1byte=8bit,100Mbps/8=12.5M/s。

image-20220903175703339

测试网速:

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

&emsp;&emsp;[atguigu@hadoop102 software]$ python -m SimpleHTTPServer

(2)在Web页面上访问

hadoop102:8000

1)测试HDFS写性能
(1)写测试底层原理

image-20220903175728958

(2)测试内容:向HDFS集群写10个128M的文件

[atguigu@hadoop102 mapreduce]$ 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

2021-02-09 10:43:16,853 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:             Date & time: Tue Feb 09 10:43:16 CST 2021
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:         Number of files: 10
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:  Total MBytes processed: 1280
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:       Throughput mb/sec: 1.61
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:  Average IO rate mb/sec: 1.9
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:   IO rate std deviation: 0.76
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:      Test exec time sec: 133.05
2021-02-09 10:43:16,854 INFO fs.TestDFSIO:

​    注意: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集z群

(3)测试结果分析

​ ①由于副本1就在本地,所以该副本不参与测试

image-20220903175921560

  一共参与测试的文件:10个文件 * 2个副本 = 20个
  压测后的速度:1.61
  实测速度:1.61M/s * 20个文件 ≈ 32M/s
  三台服务器的带宽:12.5 + 12.5 + 12.5 ≈ 30m/s
  所有网络资源都已经用满。
  如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘或者增加磁盘个数。
   ②如果客户端不在集群节点,那就三个副本都参与计算

image-20220903175943628

2)测试HDFS读性能
(1)测试内容:读取HDFS集群10个128M的文件

[atguigu@hadoop102 mapreduce]$ 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

2021-02-09 11:34:15,847 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
2021-02-09 11:34:15,847 INFO fs.TestDFSIO:             Date & time: Tue Feb 09 11:34:15 CST 2021
2021-02-09 11:34:15,847 INFO fs.TestDFSIO:         Number of files: 10
2021-02-09 11:34:15,847 INFO fs.TestDFSIO:  Total MBytes processed: 1280
2021-02-09 11:34:15,848 INFO fs.TestDFSIO:       Throughput mb/sec: 200.28
2021-02-09 11:34:15,848 INFO fs.TestDFSIO:  Average IO rate mb/sec: 266.74
2021-02-09 11:34:15,848 INFO fs.TestDFSIO:   IO rate std deviation: 143.12
2021-02-09 11:34:15,848 INFO fs.TestDFSIO:      Test exec time sec: 20.83

(2)删除测试生成数据

[atguigu@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean

(3)测试结果分析:为什么读取文件速度大于网络带宽?由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。z

image-20220903180030164

3)使用Sort程序评测MapReduce
(1)使用RandomWriter来产生随机数,每个节点运行10个Map任务,每个Map产生大约1G大小的二进制随机数

[atguigu@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar randomwriter random-data

(2)执行Sort程序

[atguigu@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar sort random-data sorted-data

(3)验证数据是否真正排好序了

[atguigu@hadoop102 mapreduce]$ 
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar testmapredsort -sortInput random-data -sortOutput sorted-data

4.2.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=img比如集群规模为8台时,此参数设置为41。可通过简单的python代码计算该值,代码如下。

[atguigu@hadoop102 ~]$ 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%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。

(2)解决办法:

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

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

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

相关文章:

  • 【设计模式】Java设计模式 - 命令模式
  • openstack-mitaka(二) 基于vmware的搭建
  • 【Vue2】VantUI项目入门教程
  • 痛苦与反思:想提升自己,却不知道该如何做
  • C++和QML混合编程_C++端后台多线程处理
  • Math 对象+JS数组求和的常用方法+ indexOf+js计算数组中每个元素出现的次数+while循环语句死循环
  • 用ARM进行汇编语言编程(7)HelloWorld和gdb调试Arm程序
  • 【Vue 基础知识】控制元素显示隐藏的方法和区别
  • 终于拿到了爆火全网的进一线大厂程序员必看的1700道java面试题
  • Redis事务操作与原理剖析
  • 北京十大靠谱律师事务所排名(口碑榜单)
  • Linux基础 常见问题-添加桌面快捷方式链接shell脚本
  • Vue动态样式绑定
  • 搭建简易SpringFrame-ioc框架
  • Git --》如何玩转Gitee?
  • 2018一半小结一波
  • 4. 路由到控制器 - Laravel从零开始教程
  • css布局,左右固定中间自适应实现
  • download使用浅析
  • E-HPC支持多队列管理和自动伸缩
  • gcc介绍及安装
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • in typeof instanceof ===这些运算符有什么作用
  • Js基础知识(一) - 变量
  • MySQL-事务管理(基础)
  • Selenium实战教程系列(二)---元素定位
  • vagrant 添加本地 box 安装 laravel homestead
  • 机器学习学习笔记一
  • 技术:超级实用的电脑小技巧
  • 前端js -- this指向总结。
  • 在Mac OS X上安装 Ruby运行环境
  • 正则与JS中的正则
  • 自定义函数
  • 容器镜像
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (3)(3.5) 遥测无线电区域条例
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (BFS)hdoj2377-Bus Pass
  • (C++17) optional的使用
  • (done) 两个矩阵 “相似” 是什么意思?
  • (TOJ2804)Even? Odd?
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (一)appium-desktop定位元素原理
  • (译) 函数式 JS #1:简介
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .Family_物联网
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net Signalr 使用笔记