【发布时间】:2015-05-22 13:02:05
【问题描述】:
我在 hadoop 方面没有实践经验——我只学了一些理论。我面临的任务是使用集群处理一个巨大的 CSV 文件(比内存大得多),我想出了以下过程。
假设 csv 文件包含 3 亿行,我称第 1 部分为 1-1 亿行,第 2 部分为 101-2 亿行,第 3 部分为 201-3 亿行。 (这只是一个例子,因为在实践中数据必须被分割成更多的部分才能在内存中处理)
我想通过以下方式将数据分发到节点上。
节点号数据采集
仅节点 1 第 1 部分
仅节点 2 第 2 部分
仅节点 3 第 3 部分
节点 4 第 1 部分和第 2 部分
节点 5 第 2 部分和第 3 部分
节点 6 第 1 部分和第 3 部分
您会看到有些节点只取一部分数据,而有些则取 2 部分数据。根据这一点,两个函数之一将应用于每个节点。我了解到这可以通过 reducer 中的 if-else 语句来完成。 即我的减速器应该是这样的
如果(节点 1,2,3)运行函数f1(data_block)
如果(节点 4,5,6)运行函数f2(data_blockA,data_blockB)
问题是我学过的大部分hadoop例子都不允许每个节点选择自己要读取的数据的哪一部分。数据以相当黑盒的方式分发到节点。有没有办法解决这个问题?附言我正在考虑依赖 Hadoop 流,因为我的主要语言是 Python,而不是 Java,所以这可能是另一个限制。
【问题讨论】:
-
在特定节点上分发数据有什么具体要求吗?
-
嗯,一定要维持秩序。所以节点 1 必须占用 1-1 亿行,而不是随机的 1 亿行。
标签: python hadoop mapreduce cluster-computing hadoop-streaming