map-reduce体系结构
map-reduce运行流程
讲一下Mapreduce或者hdfs的原理和机制。map读取数据分片。
shuffle 是什么? 怎么调优?
在Map端的shuffle过程是对Map的结果进行分区(partition)、排序(sort)和分割(spill),然后将属于同一个划分的输出合并在一起
shuffle 和reduce的区别
对调度怎么理解.? 用什么工具吗?
用kettle 这种工具还是 自己写程序? 你们公司是怎么做的?
你们数据中心开发周期是多长?
你们hbase里面是存一些什么数据。
Mapreduce 的 map 数量 和 reduce 数量 怎么确定 ,怎么配置
map的数量由数据块决定,reduce数量随便配置。
说说Mapreduce?一整个过程的理解。讲一下。
Map—combiner—partition—sort—copy—sort—grouping—reduce
map数量的计算过程
分片:splits
默认情况下,map数量等于 split数量 totalSize/splitSize = totalSize/blockSize
引入几个中间概念
goalSize
blockSize
minSize
影响参数
mapred.map.tasks
由用户设置的tasks 先计算用户期望的片大小 ,goalSize,与blockSize 谁小以谁为依据,如果
goalSize > blockSize,则实际上用户设置的tasks数并没有其作用
有没有可能一个map计算多个数据块呢?
mapred.min.split.size
mapred.max.split.size
long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
mapred-default.xml文件中mapred.min.split.size=0,所以job.getLong(“mapred.min.split.size”,1)=0
minSplitSize 是 FileInputFormat 一个数据成员 默认值为1,所以minSize =1 其目的就是得到配置中的最小值
但如果 minSize 大于(goalSize,blockSize中的最小值),则会出现一个map处理多个数据块的情况
|
|
由InputFormat这个接口来定义的,其中有个getSplits方法。这里有一个新的概念:fileSplit。每个map处理一个fileSplit,所以有多少个fileSplit就有多少个map(map数并不是单纯的由用户设置决定的)。
map数量和分区数量是一样的吗?
在进行MapReduce计算时,有时候需要把最终的输出数据分到不同的文件中,比如按照省份划分的话,需要把同一省份的数据放到一个文件中;按照性别划分的话,需要把同一性别的数据放到一个文件中。我们知道最终的输出数据是来自于Reducer任务。那么,如果要得到多个文件,意味着有同样数量的Reducer任务在运行。Reducer任务的数据来自于Mapper任务,也就说Mapper任务要划分数据,对于不同的数据分配给不同的Reducer任务运行。Mapper任务划分数据的过程就称作Partition。负责实现划分数据的类称作Partitioner。
mapper 数量 ,分区数量 ,reducer数量(用户设置)
num(mapper) == num(partition)
hadoop中Combiner的作用?
combiner是reduce的实现,在map端运行计算任务,减少map端的输出数据。
作用就是优化。
但是combiner的使用场景是mapreduce的map和reduce输入输出一样。
简述hadoop的调度器
FIFO schedular:默认,先进先出的原则
Capacity schedular:计算能力调度器,选择占用最小、优先级高的先执行,依此类推
Fair schedular:公平调度,所有的job具有相同的资源。
combiner和partition的作用
combiner是reduce的实现,在map端运行计算任务,减少map端的输出数据。作用就是优化。但是combiner的使用场景是mapreduce的map
输出结果和reduce输入输出一样。
partition的默认实现是hashpartition,是map端将数据按照reduce个数取余,进行分区,不同的reduce来copy自己的数据。partition
的作用是将数据分到不同的reduce进行计算,加快计算效果。
用mapreduce怎么处理数据倾斜问题?
数据倾斜:map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,
这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,
从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
用hadoop程序进行数据关联时,常碰到数据倾斜的情况,这里提供一种解决方法。
自己实现partition类,用key和value相加取hash值:
方式1:
源代码:
方式2:
方式3:
重新设计key