使用 Hadoop Map reduce 处理和拆分大数据?
Posted
技术标签:
【中文标题】使用 Hadoop Map reduce 处理和拆分大数据?【英文标题】:Processing and splitting large data using Hadoop Map reduce? 【发布时间】:2014-10-20 01:02:57 【问题描述】:我在文本文件中有大量数据(1,000,000 行)。每行有 128 列。
现在我正在尝试用这些大数据构建一个 kd 树。我想使用 map reduce 进行计算。
蛮力解决我的问题: 1) 编写一个 map reduce 作业来查找每列的方差并选择方差最高的列 2)将(列名,方差值)作为输入编写另一个map reduce作业,将输入数据分成2部分。 1 部分的所有行的值都小于给定列名的输入值,第二部分的所有行都大于输入值。 3) 对于每个部分,重复第 1 步和第 2 步,继续该过程,直到每个部分剩下 500 个值。
列名、方差值构成了我的树的单个节点。所以对于高度为 10 的树的蛮力方法,我需要运行 1024 个 map reduce 作业。
我的问题: 1 ) 有什么方法可以通过运行更少的 map reduce 作业来提高效率? 2) 我每次都在读取相同的数据。有什么办法可以避免吗? 3 ) 是否有其他框架如 pig 、 hive 等对此类任务有效? 4 ) 我可以使用哪些框架将数据保存到数据存储中并轻松检索数据?
请帮助...
【问题讨论】:
【参考方案1】:您为什么不在这里尝试使用 Apache Spark (https://spark.apache.org/)?...这似乎是 spark 的完美用例
【讨论】:
您好,感谢您的回复。你能用两行解释一下 spark 对这个场景有什么用处吗? 由于您在所有 mapreduce 作业中读取相同的数据,spark 可以将这些数据加载到整个集群的内存中,并且第一次迭代后的处理速度将大大加快 会更快但是迭代次数是一样的。我想知道一些会减少迭代次数的事情【参考方案2】:对于树的每个节点都有一个 MR 作业,您有 O(n) = 2^n 个作业(其中 n 是树的高度),这不利于 YARN 的开销。但是通过简单的编程技巧,您可以将其降低到 O(n) = n。 以下是一些想法:
-
在你的键前面添加额外的分区列,这个列是nodeID(你树中的每个节点都有唯一的ID)。这将创建独立的数据流,并确保来自树的不同分支的键不会混合,并且所有的方差都是在波的 nodeID 的上下文中计算的,对于每一层节点。这将消除每个节点都有一个 MR 作业的必要性,并且代码几乎没有变化,并确保您有 O(n) = n 个作业而不是 O(n) = 2^n;
数据未围绕拆分值进行排序,并且在拆分父列表中的元素时,必须前往其目标子列表,并且集群节点之间将存在网络流量。因此,使用多台机器在集群上缓存整个数据集可能不会带来显着的改进;
在计算了树的几个级别后,可能会出现某些 nodeID 的行数可以容纳在 mapper 或 reducer 内存中的情况,然后您可以继续完全处理该子树内存并避免昂贵的 MR 作业,这可能会在您到达树的底部时减少 MR 作业的数量,或者在处理接近底部时减少数据量;
另一个优化是编写一个单独的 MR 作业,在映射器中围绕每个节点的选定值进行拆分,并通过 MultipleOutputs 输出它们,并将具有下一个树级别的子节点 ID 的键发送到减速器以计算子列表中列的方差。因为第一次运行没有拆分值,但所有后续运行都会有多个拆分值,每个子节点 ID 一个。
【讨论】:
以上是关于使用 Hadoop Map reduce 处理和拆分大数据?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Hadoop Map reduce 处理和拆分大数据?
如何使用 LZO 以外的压缩处理 Hadoop Map/Reduce 中的协议缓冲区文件?