【问题标题】:Hadoop - how are map-reduce tasks know which part of a file to handle?Hadoop - map-reduce 任务如何知道要处理文件的哪一部分?
【发布时间】:2012-01-17 12:50:36
【问题描述】:

我已经开始学习 hadoop,目前我正在尝试处理结构不太好的日志文件 - 因为我通常用于 M/R 键的值通常位于顶部文件(一次)。所以基本上我的映射函数将该值作为键,然后扫描文件的其余部分以聚合需要减少的值。因此,[假] 日志可能如下所示:

## log.1
SOME-KEY
2012-01-01 10:00:01 100
2012-01-02 08:48:56 250
2012-01-03 11:01:56 212
.... many more rows

## log.2
A-DIFFERENT-KEY
2012-01-01 10:05:01 111
2012-01-02 16:46:20 241
2012-01-03 11:01:56 287
.... many more rows

## log.3
SOME-KEY
2012-02-01 09:54:01 16
2012-02-02 05:53:56 333
2012-02-03 16:53:40 208
.... many more rows

我想为每个键累积第三列。我有一个由几个节点组成的集群运行这个作业,所以我被几个问题困扰:

1。文件分发

鉴于 hadoop 的 HDFS 在 64Mb 块中工作(默认情况下),并且每个文件都分布在集群上,我能否确定正确的密钥将与正确的数字匹配?也就是说,如果包含密钥的块在一个节点中,并且包含相同密钥的数据的块(同一日志的不同部分)在不同的机器上 - M/R 框架如何匹配两者(如果完全)?

2。块分配

对于上述文本日志,如何确定每个块的截止点?是在一行结束之后,还是正好在 64Mb(二进制)?这还重要吗?这与我的 #1 有关,我担心的是正确的值与整个集群上的正确键匹配。

3。文件结构

M/R 处理的最佳文件结构(如果有)是什么?如果典型的日志看起来像这样,我可能就不会那么担心了:

A-DIFFERENT-KEY 2012-01-01 10:05:01 111
SOME-KEY        2012-01-02 16:46:20 241
SOME-KEY        2012-01-03 11:01:56 287
A-DIFFERENT-KEY 2012-02-01 09:54:01 16
A-DIFFERENT-KEY 2012-02-02 05:53:56 333
A-DIFFERENT-KEY 2012-02-03 16:53:40 208
...

但是,日志很大,将它们转换为上述格式会非常昂贵(时间)。我应该担心吗?

4。工作分配

分配的作业是否只有一个 JobClient 处理整个文件?相反,所有 JobClient 之间的键/值是如何协调的?同样,我试图保证我的阴暗日志结构仍然产生正确的结果。

【问题讨论】:

    标签: hadoop mapreduce filesystems block hdfs


    【解决方案1】:

    鉴于 hadoop 的 HDFS 在 64Mb 块中工作(默认情况下),并且每个文件都分布在集群上,我能否确定正确的密钥将与正确的数字匹配?也就是说,如果包含密钥的块在一个节点中,并且包含相同密钥的数据的块(同一日志的不同部分)在不同的机器上 - M/R 框架如何匹配两者(如果完全)?

    键和值的映射方式取决于 InputFormat 类。 Hadoop 有几个 InputFormat 类,也可以定义自定义 InputFormat 类。

    如果使用FileInputFormat,则映射器的键是文件偏移量,值是输入文件中的行。在大多数情况下,文件偏移量被忽略,输入文件中的一行值由映射器处理。因此,默认情况下,日志文件中的每一行都是映射器的一个值。

    在某些情况下,日志文件中的相关数据(如 OP 中的)可能会跨块拆分,每个块将由不同的映射器处理,而 Hadoop 无法关联它们。使用 FileInputFormat#isSplitable 方法让单个映射器处理完整文件的一种方法。如果文件太大,这不是一种有效的方法。

    对于上述文本日志,如何确定每个块的截止点?是在一行结束之后,还是正好在 64Mb(二进制)?这还重要吗?这与我的 #1 有关,我担心的是正确的值与整个集群上的正确键匹配。

    默认情况下,HDFS 中的每个块正好是 64MB 大小,除非文件大小小于 64MB 或已修改默认块大小,否则不考虑记录边界。输入中的部分行可以在一个块中,其余部分在另一个块中。 Hadoop 了解记录边界,因此即使记录(行)跨块拆分,它仍将仅由单个映射器处理。为此,可能需要从下一个块传输一些数据。

    分配的作业是否只有一个 JobClient 处理整个文件?相反,所有 JobClient 之间的键/值是如何协调的?同样,我试图保证我的阴暗日志结构仍然产生正确的结果。

    不完全清楚查询是什么。建议阅读一些教程并返回查询。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多