【问题标题】:Mapreduce: Complicated distribution of data to nodesMapreduce:数据到节点的复杂分布
【发布时间】: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


【解决方案1】:

在 HDFS 架构中存在块的概念。 HDFS 使用的典型块大小为 64 MB。当我们将一个大文件放入 HDFS 时,它被分成 64 MB 的块(基于块的默认配置),假设您有一个 1GB 的文件,并且您想将该文件放入 HDFS,那么将有 1GB/64MB = 16拆分/块,这些块将分布在数据节点上。

数据拆分基于文件偏移量。文件拆分的目标是并行处理和数据故障转移。

这些块/块将根据您的集群配置驻留在不同的 DataNode 上。每个块都被分配一个块 id,NameNode 为每个文件保存块的信息。

假设你有一个 128MB 的文件,你想把这个文件写到 HDFS 上。

客户端机器首先将文件分割成块说块A,块B然后客户端机器与名称节点交互并询问写入的位置 块(Block A Block B)。NameNode 将可用数据节点的列表提供给客户端写入数据。

然后客户端从这些列表中选择第一个数据节点并将第一个块写入数据节点,一旦写入过程和复制完成,数据节点将块复制到另一个数据节点,第一个数据节点给出关于它收到的块的确认。然后客户端写入这 另一个块到datanode。 NameNode 保存有关文件及其关联块的信息。

当客户端发出读取数据的请求时,它首先向 NameNode 发出请求以获取特定文件的数据位置,然后 NameNode 将有关数据的块信息提供给客户端。

因此您无需担心 HDFS 上的数据替换。

回答您的问题:

没有其他方法可以控制 hadoop 上的数据替换策略,但是如果您根据 HDFS 块大小(例如块大小为 64MB,数据大小为 63MB)划分文件,则一个文件将占用一个块,它将在特定的数据节点上继续,但 NameNode 将再次选择数据节点。稍后您可以检查文件所在的数据节点。

但是将小文件放在 hadoop 上并不是处理 hadoop 的有效方法,因为 hadoop 旨在处理非常大的数据集,而小文件可能是 NameNode 的开销。请参阅此链接以获取small file problem on Hadoop

以下链接有助于了解有关 hadoop 的更多信息。

http://docs.spring.io/spring-hadoop/docs/2.0.4.RELEASE/reference/html/store.html

http://www.aosabook.org/en/hdfs.html

【讨论】:

  • 非常感谢您的详细评论。从你的话中我了解到, - 数据在 HDFS 上被分成块 - 名称节点将这些主干分布到数据节点上。我想我下一个问题的关键是我是否可以指示名称节点如何分配块?
  • 在我上一条评论之后,原因是我的数据是按特定属性排序的。在我的算法中,以尊重顺序的方式分发数据至关重要。例如节点 1 应包含具有此属性的所有数据,该属性大于节点 2 中的所有数据。因此,假设 HDFS 将我的数据(例如 1GB)拆分为 16 个块,那么其中一个节点获取(例如块 1-6)至关重要,以及第二个节点 7-12 等。是的,我确实有非常大的数据集。大约 40GB 的 csv 文件..
  • 您无法指示将数据放入特定节点。我不明白您的第二个问题。您能否详细说明。
  • 所以我的数据最初是根据年龄排序的。我想以这样一种方式分发数据,即节点 1 的每个人的年龄都高于节点 B。这可能吗?
  • 否,但您可以编写 MapReduce 程序、Hive 查询或 pig 程序(您的短路逻辑)以这种方式读取/处理数据。但是当您请求将数据放入 hdfs 时,不可能以这样一种方式分发数据,即节点 1 的每个人的年龄都高于节点 B。
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多