Some Questions about MapReduce

一、MapReduce作业在计算过程中会使用和产生哪些数据?这些数据是如何存储的,目前MapReduce提供哪些安全机制保护这些数据的机密性和完整性?

使用源数据,产生MR中间结果数据,以及每次RDD操作中持久化的数据。

如何存储:源数据数据和最终的结果都保存在HDFS上,中间结果存在本地中间结果使用完就会被删除;

通过hdfs的块本分机制和RDD的依机制来保证完整性,当发生错误的时候可以及时恢复。在机密性方面,Hadoop在用户和hadoop服务之间的RPC连接上采用了KerberosRPC认证,通过访问控制列表来控制用户组队HDFS上文件的访问,采用访问控制令牌控制用户对数据块的访问,以及网络加密等手段来保证安全性;

二、MapReduce Map任务的划分与输入数据大小的关系如何?Map任务的节点分配与输入数据的位置有什么关系?请简述任务调度过程中的代码、数据互定位策略。

Hadoop中任务所包含的数据数量的大小主要由下面三种情况决定的

  1. InputFormat在默认情况下回根据DFS块的大小自动对数据块进行分片
  2. 通过设置mapred.min.split.size参数设置每个map任务的分片大小
  3. mapred.map.tasks设置tabks数量,然后用数据块的大小除以该参数得到每个map处理数据量的大小

Map任务分配的节点一般与输入数据的节点是同一个节点或者尽可能相近,这样可以避免网络开销,让计算跟 着数据走;

代码、数据互定位策略:

为了减少数据通信,一个基本原则是本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向数据的迁移;当无法进行这种本地化数据处理时,再寻找其他可用节点并将数据从网络上传送给该节点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻找可用节点以减少通信延迟。

三、MapReduce的Partition划分与Reduce数量的关系如何?

一般情况下有多少个Partition就对应多少个Reduce

四、Shuffle过程主要任务是什么?如何减少Shuffle过程带宽的消耗以及磁盘I/O?

Shuffler是MR作业中的一个特定阶段,当Mapper的输出结果需要被Reducer使用时,输出的结果会根据key进行哈希,Shuffle的任务就是将这些结果分发到各个Reducer上。

减少shuffle带宽和IO消耗的方法;

  1. 提前对RDD进行分区,这样在shuffle的过程中相同的key对应的数据可能仍在一个RDD或一个节点上中,从而避免的跨节点的shuffle操作
  2. 在正确的时机使用正确的算子操作,比如在适当的时候用reduceBykey来代替groupByKey
  3. 在Mapper和Reducer上选择适合的缓冲区大小数量,Mapper上不同的Task作业可以根据Partition进行公用从而避免的Reducer在Mapper进行数据拉取时进行频繁和大量的IO;在Reducer上也可使用适当的缓冲区,Reducer拉取到一定量的数据时再写到磁盘上,这样也避免了频繁的IO操作。
  4. Reducer尽可能从与其邻近的Reducer上拉取数据,避免数据传输中的网络开销;
  5. 在Mapper上使用Combiner函数,在Mapper上先进行Reducer减少网络传输

五、MapReduce作业在计算过程中如何监测节点的失效情况?如果发生节点失效情况,它又如何处理节点上的计算任务?

各个节点通过心跳机制向mater汇报自己节点的健康情况,发生节点失效时,在其他节点上重新执行在失效节点上已经执行完和还未执行完的任务。

六、MapReduce作业完成情况取决于最慢执行的任务,最慢任务产生的原因是什么?如何监控这种状态?又该如何处理这种情况?

原因可能是该任务所在的节点其他job占用了资源,或者磁盘损坏或者软件错误导致数据传输很慢;通过心跳机制监控,分发任务后如果指定时间内没有返回结果,就可以判定该节点是执行缓慢的节点;

解决办法:任务接近结束时,在其他节点上生成备份任务,谁先完成就用谁的结果。

猜你喜欢

转载自blog.csdn.net/dpengwang/article/details/81261573