java - Hadoop MapReduce - 如何提高并行性

标签 java hadoop mapreduce

我遇到了一个问题。我有一个数据集(CSV 文件),其中包含机场和航类信息,例如机场代码、航类代码、航类到达的日期和时间、航类应该到达的日期和时间等。目前,我有以下数据集只有两年 - 2006 年和 2007 年。我使用 java mapreduce API 来解决该问题。

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

我的方法是这样的:

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

这是可行的,因为具有相同年份的所有中间输出将被发送到相同的Reduce任务,并且具有相同(年份,airportCode)组合的中间输出将转到相同的reduce()方法。

但是,就我而言,由于仅存在两年(2006 年、2007 年),因此只会生成两个 reducer 任务。这似乎是一个不好的做法,因为如果我有 10 个任务跟踪器来完成我的工作,那么我在归约阶段只使用两个任务跟踪器。

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

最佳答案

为了提高工作的性能和并行性,我建议进行以下改进:

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

关于java - Hadoop MapReduce - 如何提高并行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35170766/

相关文章:

hadoop - 是否可以在 Hadoop Mapreduce 中为单个作业打印 Mapper 和 reducer 输出

java - 如何使用合并函数将元素添加到 HashMap<K, List<V>>

hadoop - hive :无法访问数据库

mapreduce - 使用 map reduce 技术获取 Java8 中多个类字段的摘要

hadoop - Hive中Avro文件格式与bz2压缩之间的区别

generics - 引用具有原始类型约束的基本类型

hadoop - 运行Yarn Jar MRAppMaster NoSuchMethodERror时出错

java - 图像未在带渲染器的 Jtable 中显示

java - 计算几何中 double 相等性测试的一般策略

java - 单复选框节点树中的两种类型的节点