3

我正在使用 Hadoop 使用 python 进行数据处理,应该使用什么文件格式?

我有大量文本页面的项目。

每个文本文件都有一些我需要在处理过程中保留的头信息;但是,我不希望标题干扰聚类算法。

我在 Hadoop 上使用 python(或者是否有更适合的子包?)

我应该如何格式化我的文本文件,并将这些文本文件存储在 Hadoop 中进行处理?

4

2 回答 2

4

1) 文件

如果您使用 Hadoop Streaming,则必须使用基于行的文本文件,直到第一个选项卡的数据作为键传递给您的映射器。

只需查看流式传输的文档即可。

您还可以将输入文件放入 HDFS,这对于大文件是推荐的。只需查看上述链接中的“大文件”部分即可。

2) 元数据保存

我看到的问题是您的标头信息(元数据)只会被视为此类数据,因此您必须自己将其过滤掉(第一步)。传递它更加困难,因为所有输入文件的数据将在 map-step 之后加入。

您必须将元数据添加到数据本身的某处(第二步),以便以后能够关联它。您可以为文件的每个数据行发出 (key, data+metadata),从而能够保留每个数据行的元数据。可能是一个巨大的开销,但我们正在谈论 MapReduce,意思是:pfffrrrr ;)

现在到了我不知道流与 Java 实现的工作有多大不同的部分。如果流式处理每个文件调用一个映射器,您可以省去以下麻烦,只需将 map() 的第一个输入作为元数据并将其(或占位符)添加到所有后续数据发射。如果没有,接下来是关于 Java-Jobs:

至少使用 JAR 映射器,您可以将数据与其输入文件相关联(参见此处)。但是您必须先提取元数据,因为映射函数可能会在不包含元数据的文件分区上调用。我会提出这样的建议:

  • 预先创建一个元数据文件,包含一个占位符索引:keyx:filex, metadatax
  • 将此元数据索引放入 HDFS
  • 使用 JAR 映射器,在 setup() 期间加载元数据索引文件
    • 见 org.apache.hadoop.hdfs.DFSClient
  • 匹配 filex,为这个映射器设置 keyx
  • 将使用的 keyx 添加到 map() 中的每个发出的数据行
于 2010-01-27T02:52:12.367 回答
1

如果您使用 Hadoop Streaming,您的输入可以是任何基于行的格式;您的 mapper 和 reducer 输入来自 sys.stdin,您可以按照自己的方式阅读。您不需要使用默认的制表符分隔字段(尽管根据我的经验,应尽可能在所有任务中使用一种格式以保持一致性)。

但是,使用默认的拆分器和分区器,您无法控制输入和输出的分区或排序方式,因此您的映射器和缩减器必须决定任何特定行是标题行还是仅使用该行的数据行 - 他们不会t 知道原始文件的边界。

您可以指定一个分区器,它让映射器假定第一输入行是文件中的第一行,或者甚至远离基于行的格式。这在我上次尝试使用 Streaming 时很难做到,而且在我看来,映射器和缩减器任务应该与输入无关,以提高效率和可重用性 - 最好考虑输入记录流,而不是跟踪文件边界。

流式传输的另一个选项是将标题信息发送到一个单独的文件中,该文件包含在您的数据中。它将可供您的映射器和减速器在其工作目录中使用。一个想法是将每一行与初始任务中的适当标题信息相关联,可能通过每行使用三个字段而不是两个字段,而不是通过文件关联它们。

通常,尝试将输入视为流,不要依赖文件边界、输入大小或顺序。所有这些限制都可以实施,但要以复杂性为代价。如果您确实需要实施它们,请在任务链的开头或结尾执行此操作。

如果您使用的是 Jython 或 SWIG,您可能还有其他选择,但我发现它们比 Streaming 更难使用。

于 2010-01-27T19:00:30.540 回答