使用Hadoop Map reduce处理和拆分大数据



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

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

Brute Force方法解决我的问题:
1) 编写map reduce作业以查找每列的差异,并选择差异最大的列
2) 以(列名、方差值)为输入,编写另一个map reduce作业,将输入数据拆分为两部分。1部分的所有行的值都小于给定列名的输入值,第二部分的所有行都大于输入值
3) 对于每个零件,重复步骤1和步骤2,继续该过程,直到每个零件中剩下500个值

列名,方差值构成了我的树的一个节点。因此,对于高度为10的树,我需要运行1024个map reduce作业。

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

请帮忙。。。

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

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

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

相关内容

  • 没有找到相关文章

最新更新