使用Hadoop Map处理和拆分大数据减少?

时间:2014-10-20 01:02:57

标签: hadoop mapreduce hive apache-pig bigdata

我在文本文件中有大量数据(1,000,000行)。每行有128列。

现在我正在尝试用这个大数据构建一个kd树。我想使用map reduce进行计算。

我的问题的蛮力方法:
1)编写一个map reduce作业来查找每列的方差,并选择方差最大的列
2)取(列名,方差值)作为输入写入另一个映射reduce作业,将输入数据分成2部分。 1部分的所有行的值小于给定列名称的输入值,第二部分的所有行都大于输入值。
3)对于每个部分重复步骤1和步骤2,继续该过程,直到每个部分留下500个值。

列名称,方差值构成了我的树的单个节点。因此,对于高度为10的树的蛮力方法,我需要运行1024个地图减少作业。

我的问题:
1)有没有什么办法可以通过少量的地图减少工作来提高效率? 2)我每次都在阅读相同的数据。我有什么办法可以避免这种情况吗? 3)是否有其他框架如猪,蜂巢等对这类任务有效? 4)我可以使用哪些框架将数据保存到数据存储中并轻松检索数据?

请求帮助......

2 个答案:

答案 0 :(得分:2)

为什么不尝试在这里使用Apache Spark(https://spark.apache.org/)?...这似乎是火花的完美用例

答案 1 :(得分:1)

对于树的每个节点的MR作业,您有O(n)= 2 ^ n个作业数(其中n是树的高度),这对YARN的开销不利。但是通过简单的编程技巧,您可以将其降低到O(n)= n。 以下是一些想法:

  1. 在密钥前面添加额外的分区列,此列为nodeID(树中的每个节点都有唯一的ID)。这将创建独立的数据流,并确保来自树的不同分支的密钥不会混合,并且对于每个节点层,所有差异都在wave中的nodeID的上下文中计算。这将消除每个节点具有MR作业的必要性,代码变化非常小,并确保您有O(n)= n个作业而不是O(n)= 2 ^ n;
  2. 数据未按分割值排序,而从父列表中拆分元素必须前往其目标子列表,并且群集节点之间将存在网络流量。因此,使用多台计算机缓存集群上的整个数据集可能不会带来显着的改进;
  3. 在计算了树的几个级别之后,可能存在某些nodeID具有可以放入映射器或reducer的内存中的行数的情况,然后您可以继续完全处理该子树内存并避免昂贵的MR作业,这可以减少MR作业的数量,当你到达树的底部或减少数据量,因为处理接近底部;
  4. 另一个优化是编写单个MR作业,在映射器中对每个节点的选定值进行拆分并通过MultipleOutputs输出它们,并将具有下一个树级别的子nodeID的键发送到reducer以计算子列表中列的方差。因为第一次运行没有拆分值,但所有后续运行都有多个拆分值,每个子节点ID一个。