Benchmark Job(hadoop测试)
Hadoopbenchmark测试及调参,在对本集群测试的过程中,我们用到了hadoop自带的测试函数,其中主要包括Teragen和Terasort两个方法。
Teragen
该方法是用来生成随机数据的,其触发指令为:
$hadoop jarxxx/xxx/benchmark.jar teragen -Dmapred.map.tasks=5 100000input_path其中:
·teragen:为触发的方法名称
·-Dmapred.map.tasks:用来设置map任务的个数,默认值为2,即有两个map
·100000:代表所要生成数据的行数,其中生成的数据形式为
·input_path:指定存放在hdfs中的位置
Terasort
该方法是用来对数据进行排序的,它可以用来对hadoop的数据处理能力进行有效的测试,其触发指令为:
$hadoop jarxxx/xxx/benchmark.jar terasort -Dmapred.reduce.tasks=5 input_pathoutput_path其中:
·terasort:为触发的方法名称
·-Dmapred.reduce.tasks:用来设置reduce任务的个数,默认值为1,即有一个reduce
·input_path:指定所要排序的数据在hdfs中存放的位置
·output_path:指定对排序后的数据在hdfs中的存放位置
TeraSort排序是对key值进行排序,该方法主要的流程是:先进行采样操作,根据采样的结果我们估算出数据的大致分布,然后我们将 sample[i-1]<= key < sample[i] 的数据传送到reduce i并对数据进行排序,这样可以保证reduce i-1中的所有数据都小于reduce i中的数据。
自动化执行脚本:
import os import sys #参数的声明以及赋值主要包括:jar包路径,生成数据的文件名,排序后数据的文件名,生成数据数量,map,reduce的个数 path = '/home/users/laipeng.han/workjar/' jar_path = 'benchmark.jar' first_class = 'teragen' last_class = 'terasort' input_path = '' output_path = '' num = '0' map_num = '2' reduce_num = '1' #修改路径,路径指向jar包运行位置 os.chdir(path) #判断输入的参数是否正确 if len(sys.argv) < 6: print '-----------------------------------------------' print 'Some of the necessary parameters:' print 'input_path(*):input the path to generate data' print 'output_path(*):output the sort result path' print 'num(*):the number of data to generate' print 'map_num(*):the map number ingenerating' print 'reduce_num(*):the reduce number in sorting' print '-----------------------------------------------' exit(0) input_path = sys.argv[1] output_path = sys.argv[2] num = sys.argv[3] map_num = sys.argv[4] reduce_num = sys.argv[5] #指令 print 'start generate data' cmd_gen = 'hadoop jar' +' '+ jar_path +' '+ first_class +' '+ '-Dmapred.map.tasks=' + map_num +' '+ num +' '+ input_path cmd_sort = 'yarn jar' +' '+ jar_path +' '+ last_class +' '+ '-Dmapred.reduce.tasks=' + reduce_num +' '+ input_path +' '+ output_path #执行指令 os.system(cmd_gen) print 'start sort data' os.system(cmd_sort)
参数
|
含义 |
配置及说明 |
Node Memory |
分给每个node节点中所有container的内存 |
集群中设置为总内存大小的80%,这是因为该节点主要做MR计算,所以分配的内存可以多一些,其他的需要分配给HDFS、Hbase等其他部分 |
Container Memory |
每个节点中的每个container的内存大小 |
集群中设置为最小格为3.5G,最大为100.25G(也就是Node Memory的大小),当一个Map 所需的内存大于3.5G的时候,集群会分配多个最小的格,直到满足要求,eg:一个map需要10G,那么集群就会分配3个3.5G的内存格,只要不超过最大值即可 |
Node CPU |
分给每一个node节点的Cpu个数(物理内核的个数) |
集群中设置的总内存的大小为85%,和内存的大小对应,这是因为该节点主要做MR计算,所以CPU核数可以多一些,其他的需要分配给HDFS、Hbase等其他部分 |
Node Vcore |
每一个node节点上的虚拟内核的个数 |
集群中设置的Vcore的个数为14,这是因为每一个map/reduce任务对应1个Vcore,一个node节点内存最大为100.25G,一般情况下一个map/reduce任务占用7G,所以一个node节点最多可以启动起来14个map/reduce任务,所以这里Vcore设置为14个 |
Container CPU |
每个节点中的每个container的Vcore |
集群中设置最小为1个Vcore,最多为14个,也就是说一个container中最少分配一个Vcore,也就是1个map/reduce任务,最多分配14个Vcore,也就是14个map/reduce任务。 |
MapReduce
参数 |
含义 |
配置及说明 |
Map memory |
每一个Map任务所需要的内存个数 |
集群中设置为5G(这是一般情况,在这种情况下并行度最高),但是由于5 > 3.5,所以在运行的时候集群会给每一个Map任务分配两个最小内存格满足要求,即7G |
Reduce memory |
每一个Reduce任务所需要的内存个数 |
配置和解释同上 |
提示: 如果一个Map或Reduce任务大于7G的时候,可以在提交任务的时候使用如下指令:
–D mapreduce.map(reduce).memory.mb=10240(即map或reduce所需内存的大小即可)