2. TeraSort在Hadoop分布式集群中的运行

2. TeraSort

**1TB排序通常用于衡量分布式数据处理框架的数据处理能力。**Terasort是Hadoop中的的一个排序作业,在2008年,Hadoop在1TB排序基准评估中赢得第一名,耗时209秒。

运行环境

  1. CentOS-7.6-Minimal * 3 由Vmware平台搭建

三台主机对应IP地址:192.168.239.100 hadoop100

​ 192.168.239.101 hadoop101

​ 192.168.239.102 hadoop102

环境:hadoop-2.7.7 + JDK-8-251

  1. 三台虚拟机上节点分配:

hadoop100:DataNode NameNode NodeManager

hadoop200: ResourceManager NodeManager DataNode

hadoop300:NodeManager DataNode JobHistoryServer

  1. 程序的开发验证由PC机实现

Intellij IDEA 2018.4 + hadoop-2.7.7 + JDK-8-251 + Maven-3.3.9

  1. 三个验证实验:
2.1 算法思想
  • 解决大规模数据排序问题首先想到的是分而治之的策略,但是这在Hadoop中并不适用,因为,尽管map可以并行,但是这在reduce阶段并不能做到,于是Hadoop官方提出了TeraSort排序算法,这个算法在Hadoop的源码中。
  • 为了提高reduce阶段的并行度,TeraSort作业对分而治之的算法进行如下改进:在map阶段,每个map task都会将数据划分成R个数据块(R为reduce task个数),其中第i(i>0)个数据块的所有数据都会比第i+1个中的数据大;在reduce阶段,第i个reduce task处理(进行排序)所有map task的第i块,这样第i个reduce task产生的结果均会比第i+1个大,最后将1~R个reduce task的排序结果顺序输出,即为最终的排序结果。
  • 这种设计思路很明显比第一种高效,但实现难度较大,它需要解决以下两个技术难点:第一,如何确定每个map task数据的R个数据块的范围? 第二,对于某条数据,如果快速的确定它属于哪个数据块?答案分别为【采样】和【trie树】。
2.2 算法流程
  • 对于Hadoop的Terasort排序算法,主要由3步组成:采样 –>> map task对于数据记录做标记 –>> reduce task进行局部排序。
  • 数据采样在JobClient端进行,首先从输入数据中抽取一部分数据,将这些数据进行排序,然后将它们划分成R个数据块,找出每个数据块的数据上限和下线(称为“分割点”),并将这些分割点保存到分布式缓存中。
  • 在map阶段,每个map task首先从分布式缓存中读取分割点,并对这些分割点建立trie树(两层trie树,树的叶子节点上保存有该节点对应的reduce task编号)。然后正式开始处理数据,对于每条数据,在trie树中查找它属于的reduce task的编号,并保存起来。
  • 在reduce阶段,每个reduce task从每个map task中读取其对应的数据进行局部排序,最后将reduce task处理后结果按reduce task编号依次输出即可。
2.3 在hadoop分布式集群上运行TeraSort

Hadoop源代码中包含了TeraSort,打包在hadoop-2.7.7\share\hadoop\mapreduce包:hadoop-mapreduce-examples-2.7.7.jar

使用teragen产生数据

使用Teragen来产生数据,示例如下:

hadoop jar hadoop-*-examples.jar teragen 参数1 参数2

teragen的参数解释:

  • 参数1:表示要产生的数据的行数。Teragen每行数据的大小是100B
    要产生1T的数据,需要的行数=102410241024*1024/100=10995116277行
  • 参数2 : 产生的数据放置的文件夹地址

默认的teragen的启动的map数比较少,只有2个,如果要指定map数可以加-Dmapred.map.tasks=map数的方式。比如我们来产生1T的数据

# 产生数据:1000000标定数据大小
$ hadoop jar /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar teragen -Dmapred.map.tasks=100 1000000 /output

ls一下目录是否产出

$ hadoop fs -ls /output
# 1 + 100 个条目会在命令执行后展出
[hadoop1@hadoop100 application]$ hadoop fs -ls /output
Found 101 items
-rw-r--r--   3 hadoop1 supergroup          0 2020-06-09 06:10 /output/_SUCCESS
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00000
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00001
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00002
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00003
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00004
......

使用Terasort排序

使用terasort对刚才使用teragen产生的数据进行排序,排序结果输出到/output_rst。
默认的reduce数目是1,会导致任务跑得非常慢。通过-Dmapred.reduce.tasks指定reduce数目,这里我们设置50个

$ hadoop jar /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar terasort -Dmapred.reduce.tasks=50 /output /output_rst
# 2 + 50 条数据  50条数据对应50个reduce产生的结果
[hadoop1@hadoop100 application]$ hadoop fs -ls /output_rst
Found 52 items
-rw-r--r--   1 hadoop1 supergroup          0 2020-06-09 06:29 /output_rst/_SUCCESS
-rw-r--r--  10 hadoop1 supergroup        539 2020-06-09 06:24 /output_rst/_partition.lst
-rw-r--r--   1 hadoop1 supergroup    1947700 2020-06-09 06:29 /output_rst/part-r-00000
-rw-r--r--   1 hadoop1 supergroup    2015000 2020-06-09 06:29 /output_rst/part-r-00001
-rw-r--r--   1 hadoop1 supergroup    2035900 2020-06-09 06:29 /output_rst/part-r-00002
-rw-r--r--   1 hadoop1 supergroup    1990400 2020-06-09 06:29 /output_rst/part-r-00003
-rw-r--r--   1 hadoop1 supergroup    1967000 2020-06-09 06:29 /output_rst/part-r-00004
......

启动Teragen之后,会提交mapre reduce任务来,产生TeraSort需要的数据

使用Teravalidate 进行验证

使用TeraValidate 对Terasort的结果进行验证:

$ hadoop jar /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar teravalidate /output_rst /validate
# 提示成功
20/06/09 06:38:04 INFO mapreduce.Job: Job job_1591628181590_0007 completed successfully

最终运算的时长:数据大小为100M (非标准1024算的) 运行时间:Gen: 1’50" Sort:5’4"
在这里插入图片描述

注意

  • 在树莓派的实验中,这里的参数需要进行相应的调整,比如跑10个map,跑1个reduce
2.4 参考
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值