Hadoop MapReduce - 如何改善并行性

时间:2016-02-03 07:19:10

标签: java hadoop mapreduce

我遇到了问题。我有一个数据集(CSV文件),其中包含机场和航班信息,如机场代码,航班代码,航班到达的日期和时间,航班应该到达的日期和时间等。现在,我有数据集只有两年 - 2006年和2007年。我使用java mapreduce API作为解决方案。

我必须找出两年内每个机场的平均航班延误,并将输出存储在两个单独的文件中 - 一个用于2006年,另一个用于2007年。输出也应按airportCode排序。

我的方法是这样的:

Full Dataset ->
map(<lineNumber , lineText>) ->
<(year,airportCode) , flightDelay> ->
custom Partitioner to partition only by year ->
reduce((year,airportCode) , flightDelaysList) ->
output (year, airportname, averagedelay)

这是有效的,因为同一年的所有中间输出都将被发送到同一个Reduce任务,而具有相同(year,airportCode)组合的任务将转到相同的reduce()方法。

然而,在我的案例中,因为仅存在两年 - 2006年,2007年,所以只会产生两个减速器任务。这似乎是一种不好的做法,因为如果我有10个任务跟踪器来完成我的工作,我只使用两个用于我的减少阶段。

有人可以提出一个解决方案,其中生成多个Reducer以完成工作,之后,某种合并可能会合并一年的文件,我们仍然有两个输出文件 - 一个用于2006年,另一个用于2007年?希望我能很好地解释这个问题。如有任何澄清,请随时发表评论。

2 个答案:

答案 0 :(得分:1)

您的方法很好,随着更多数据进入图片(更多年),它将实现良好的并行性。

如果您希望自己的方法利用最大数量的reduce插槽来实现并行性,那么可以确保通过在分区器中进行必要的更改来创建许多必要数量的分区。 而且你需要处理在单个排序文件中合并同年文件的开销。

答案 1 :(得分:1)

为了提高工作绩效和并列性,我建议采取以下改进措施:

  • 添加一个组合器,用于累积每个映射器的所有延迟和条目
  • 使用年份和机场的复合键来增加缩减器的数量并节省编写自定义分区器的时间
  • 现在有两种选择:1)使用tez作为地图 - &gt;减少 - &gt;减少或2)每个机场和年份写一个文件,然后用HDFS utils
  • 合并它们