2014-10-20 47 views
0

我在文本文件(1,000,000行)中有大量数据。每行有128列。使用Hadoop Map处理和分割大量数据reduce?

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

我的问题暴力方法:
1)写一个映射精简工作,发现每列的方差,并选择与拍摄最高方差
2)(列名,方差值的列)作为输入写另一个地图减少了将输入数据分成两部分的工作。 1部分具有给定列名称的值小于输入值的所有行,第二部分具有大于输入值的所有行。
3)对于每个零件重复步骤1和步骤2,继续该过程,直到每个零件剩下500个值。

列名,方差值为我的树形成单个节点。所以用高度为10的树的蛮力方法,我需要运行1024个地图缩减作业。

我的问题:
1)有什么办法,我可以通过运行更少的地图减少就业人数提高了工作效率?
2)我每次都读取相同的数据。有什么办法可以避免吗?
3)是否有任何其他框架,如猪,蜂巢等这些任务有效吗?
4)我可以将数据保存到数据存储并轻松检索数据的任何框架?

普莱斯帮助...

回答

2

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

+0

嗨,感谢您的回复。你能解释一下2行这个场景中spark如何有用吗? – user3716835 2014-10-20 05:40:48

+0

因为您正在读取所有mapreduce作业中的相同数据,spark可以将此数据加载到整个群集的内存中,并且第一次迭代后的处理将显着加快 – Amar 2014-10-20 05:50:32

+0

它会更快但迭代次数相同。我想要知道会减少迭代次数的东西 – user3716835 2014-10-20 05:54:47

1

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

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