1、谈谈Hadoop序列化和反序列化及自定义bean对象实现序列化?
1)序列化和反序列化
(1)序列化就是把内存中的对象,转换成字节序列(或其余数据传输协定)以便于存储(长久化)和网络传输。
(2)反序列化就是将收到字节序列(或其余数据传输协定)或者是硬盘的长久化数据,转换成内存中的对象。
(3)Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额定的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop本人开发了一套序列化机制(Writable),精简、高效。
2)自定义bean对象要想序列化传输步骤及注意事项:
(1)必须实现Writable接口
(2)反序列化时,须要反射调用空参构造函数,所以必须有空参结构
(3)重写序列化办法
(4)重写反序列化办法
(5)留神反序列化的程序和序列化的程序完全一致
(6)要想把结果显示在文件中,须要重写toString(),且用"\t"离开,不便后续用
(7)如果须要将自定义的bean放在key中传输,则还须要实现comparable接口,因为mapreduce框中的shuffle过程肯定会对key进行排序

2、FileInputFormat切片机制(☆☆☆☆☆)
job提交流程源码详解
waitForCompletion()
submit();
// 1、建设连贯
connect();
// 1)创立提交job的代理
new Cluster(getConfiguration());
// (1)判断是本地yarn还是近程
initialize(jobTrackAddr, conf);
// 2、提交job
submitter.submitJobInternal(Job.this, cluster)
// 1)创立给集群提交数据的Stag门路
Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
// 2)获取jobid ,并创立job门路
JobID jobId = submitClient.getNewJobID();
// 3)拷贝jar包到集群
copyAndConfigureFiles(job, submitJobDir);
rUploader.uploadFiles(job, jobSubmitDir);
// 4)计算切片,生成切片布局文件
writeSplits(job, submitJobDir);
maps = writeNewSplits(job, jobSubmitDir);
input.getSplits(job);
// 5)向Stag门路写xml配置文件
writeConf(conf, submitJobFile);
conf.writeXml(out);
// 6)提交job,返回提交状态
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());

3、在一个运行的Hadoop 工作中,什么是InputSplit?(☆☆☆☆☆)
FileInputFormat源码解析(input.getSplits(job))
(1)找到你数据存储的目录。
(2)开始遍历解决(布局切片)目录下的每一个文件。
(3)遍历第一个文件ss.txt。
a)获取文件大小fs.sizeOf(ss.txt);。
b)计算切片大小computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M。
c)默认状况下,切片大小=blocksize。
d)开始切,造成第1个切片:ss.txt—0:128M 第2个切片ss.txt—128:256M 第3个切片ss.txt—256M:300M(每次切片时,都要判断切完剩下的局部是否大于块的1.1倍,不大于1.1倍就划分一块切片)。
e)将切片信息写到一个切片布局文件中。
f)整个切片的外围过程在getSplit()办法中实现。
g)数据切片只是在逻辑上对输出数据进行分片,并不会再磁盘上将其切分成分片进行存储。InputSplit只记录了分片的元数据信息,比方起始地位、长度以及所在的节点列表等。
h)留神:block是HDFS上物理上存储的存储的数据,切片是对数据逻辑上的划分。
(4)提交切片布局文件到yarn上,yarn上的MrAppMaster就能够依据切片布局文件计算开启maptask个数。

4、如何断定一个job的map和reduce的数量?
1)map数量
splitSize=max{minSize,min{maxSize,blockSize}}
map数量由解决的数据分成的block数量决定default_num = total_size / split_size;
2)reduce数量
reduce的数量job.setNumReduceTasks(x);x 为reduce的数量。不设置的话默认为 1。

5、 Maptask的个数由什么决定?
一个job的map阶段MapTask并行度(个数),由客户端提交job时的切片个数决定。

6、MapTask和ReduceTask工作机制(☆☆☆☆☆)(也可答复MapReduce工作原理)
MapTask工作机制

(1)Read阶段:Map Task通过用户编写的RecordReader,从输出InputSplit中解析出一个个key/value。
(2)Map阶段:该节点次要是将解析出的key/value交给用户编写map()函数解决,并产生一系列新的key/value。大数据培训
(3)Collect收集阶段:在用户编写map()函数中,当数据处理实现后,个别会调用OutputCollector.collect()输入后果。在该函数外部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。
(4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。须要留神的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
(5)Combine阶段:当所有数据处理实现后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。

ReduceTask工作机制

(1)Copy阶段:ReduceTask从各个MapTask上近程拷贝一片数据,并针对某一片数据,如果其大小超过肯定阈值,则写到磁盘上,否则间接放到内存中。
(2)Merge阶段:在近程拷贝数据的同时,ReduceTask启动了两个后盾线程对内存和磁盘上的文件进行合并,以避免内存应用过多或磁盘上文件过多。
(3)Sort阶段:依照MapReduce语义,用户编写reduce()函数输出数据是按key进行汇集的一组数据。为了将key雷同的数据聚在一起,Hadoop采纳了基于排序的策略。 因为各个MapTask曾经实现对本人的处理结果进行了部分排序,因而,ReduceTask只需对所有数据进行一次归并排序即可。
(4)Reduce阶段:reduce()函数将计算结果写到HDFS上。

7、形容mapReduce有几种排序及排序产生的阶段(☆☆☆☆☆)
1)排序的分类:
(1)局部排序:
MapReduce依据输出记录的键对数据集排序。保障输入的每个文件外部排序。
(2)全排序:
如何用Hadoop产生一个全局排序的文件?最简略的办法是应用一个分区。但该办法在解决大型文件时效率极低,因为一台机器必须解决所有输入文件,从而齐全丢失了MapReduce所提供的并行架构。
代替计划:首先创立一系列排好序的文件;其次,串联这些文件;最初,生成一个全局排序的文件。次要思路是应用一个分区来形容输入的全局排序。例如:能够为待剖析文件创建3个分区,在第一分区中,记录的单词首字母a-g,第二分区记录单词首字母h-n, 第三分区记录单词首字母o-z。
(3)辅助排序:(GroupingComparator分组)
Mapreduce框架在记录达到reducer之前按键对记录排序,但键所对应的值并没有被排序。甚至在不同的执行轮次中,这些值的排序也不固定,因为它们来自不同的map工作且这些map工作在不同轮次中实现工夫各不相同。一般来说,大多数MapReduce程序会防止让reduce函数依赖于值的排序。然而,有时也须要通过特定的办法对键进行排序和分组等以实现对值的排序。
(4)二次排序:
在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。
2)自定义排序WritableComparable
bean对象实现WritableComparable接口重写compareTo办法,就能够实现排序
@Override
public int compareTo(FlowBean o) {
// 倒序排列,从大到小
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}
3)排序产生的阶段:
(1)一个是在map side产生在spill后partition前。
(2)一个是在reduce side产生在copy后 reduce前。

8、形容mapReduce中shuffle阶段的工作流程,如何优化shuffle阶段(☆☆☆☆☆)

分区,排序,溢写,拷贝到对应reduce机器上,减少combiner,压缩溢写的文件。

9、形容mapReduce中combiner的作用是什么,个别应用情景,哪些状况不须要,及和reduce的区别?
1)Combiner的意义就是对每一个maptask的输入进行部分汇总,以减小网络传输量。
2)Combiner可能利用的前提是不能影响最终的业务逻辑,而且,Combiner的输入kv应该跟reducer的输出kv类型要对应起来。
3)Combiner和reducer的区别在于运行的地位。
Combiner是在每一个maptask所在的节点运行;
Reducer是接管全局所有Mapper的输入后果。

10、如果没有定义partitioner,那数据在被送达reducer前是如何被分区的?
如果没有自定义的 partitioning,则默认的 partition 算法,即依据每一条数据的 key 的 hashcode 值摸运算(%)reduce 的数量,失去的数字就是“分区号“。

11、MapReduce 呈现单点负载多大,怎么负载平衡? (☆☆☆☆☆)
通过Partitioner实现

12、MapReduce 怎么实现 TopN? (☆☆☆☆☆)
能够自定义groupingcomparator,对后果进行最大值排序,而后再reduce输入时,管制只输入前n个数。就达到了topn输入的目标。

13、Hadoop的缓存机制(Distributedcache)(☆☆☆☆☆)
分布式缓存一个最重要的利用就是在进行join操作的时候,如果一个表很大,另一个表很小,咱们就能够将这个小表进行播送解决,即每个计算节点上都存一份,而后进行map端的连贯操作,通过我的试验验证,这种状况下解决效率大大高于个别的reduce端join,播送解决就使用到了分布式缓存的技术。
DistributedCache将拷贝缓存的文件到Slave节点在任何Job在节点上执行之前,文件在每个Job中只会被拷贝一次,缓存的归档文件会被在Slave节点中解压缩。将本地文件复制到HDFS中去,接着Client会通过addCacheFile() 和addCacheArchive()办法通知DistributedCache在HDFS中的地位。当文件寄存到文地时,JobClient同样取得DistributedCache来创立符号链接,其模式为文件的URI加fragment标识。当用户须要取得缓存中所有无效文件的列表时,JobConf 的办法 getLocalCacheFiles() 和getLocalArchives()都返回一个指向本地文件门路对象数组。

14、如何应用mapReduce实现两个表的join?(☆☆☆☆☆)
1)reduce side join : 在map阶段,map函数同时读取两个文件File1和File2,为了辨别两种起源的key/value数据对,对每条数据打一个标签(tag),比方:tag=0 示意来自文件File1,tag=2 示意来自文件File2。
2)map side join : Map side join 是针对以下场景进行的优化:两个待连贯表中,有一个表十分大,而另一个表十分小,以至于小表能够间接寄存到内存中。这样,咱们能够将小表复制多份,让每个map task 内存中存在一份(比方寄存到hash table 中),而后只扫描大表:对于大表中的每一条记录key/value,在hash table 中查找是否有雷同的key 的记录,如果有,则连贯后输入即可。

15、什么样的计算不能用mr来提速?
1)数据量很小。
2)繁冗的小文件。
3)索引是更好的存取机制的时候。
4)事务处理。
5)只有一台机器的时候。

16、ETL是哪三个单词的缩写
Extraction-Transformation-Loading的缩写,中文名称为数据提取、转换和加载。