当前位置: 首页 > 知识库问答 >
问题:

正在分析大于hdfs块大小的XmlInputFormat元素

管玉堂
2023-03-14

我是Hadoop MapReduce的新手(准确地说是4天),我被要求在集群上执行分布式XML解析。根据我在Internet上的搜索,使用Mahout的XmlInputFormat应该相当容易,但我的任务是确保该系统能够处理巨大的(~5TB)XML文件。

据我所知,发送到映射器的文件拆分不能大于hdfs块大小(或每个作业块大小)。[如果我错了请纠正我]。

我面临的问题是,有些XML元素很大(~200MB),有些很小(~1MB)

所以我的问题是:当XmlInputFormat创建的XML元素块大于块大小时会发生什么?它是将整个大文件(比如200MB)发送给映射器还是将元素分成三个部分(64+64+64+8)发送出去?

我目前没有访问公司的hadoop集群的权限(直到某个时候才会访问),所以我无法执行测试并找到答案。帮帮我吧。

共有1个答案

龙晟睿
2023-03-14

为了澄清一些问题:

Mahout的XMLInputFormat将处理XML文件,并提取出两个配置的开始/结束标记之间的XML。因此,如果您的XML看起来如下所示:

<main>
  <person>
    <name>Bob</name>
    <dob>1970/01/01</dob>
  </person>
</main>

并且您已将开始/结束标记配置为 ,则映射器将向其映射方法传递以下 对:

LongWritable: 10
Text: "<person>\n    <name>Bob</name>\n    <dob>1970/01/01</dob>\n  </person>"

然后,如何在映射器中处理这些数据取决于您。

关于拆分,XMLINPUTFormat扩展了TextInputFormat,因此,如果您的输入文件是可拆分的(即,未压缩或用snappy等可拆分编解码器压缩),则该文件将由一个或多个映射器处理,如下所示:

    null

当文件被分割成这些块或分割大小的块时,XmlInputFormat将寻找块/分割边界的字节地址/偏移量,然后向前扫描,直到找到配置的XML开始标记或到达块/分割边界的字节地址。如果它找到开始标记,那么它就会消耗html" target="_blank">数据,直到找到结束标记(或文件的结尾)。如果它找到结束标记,一个记录将被传递给映射器,否则映射器将不会接收任何输入。需要强调的是,在尝试查找结束标记时,映射可能会扫描经过块/拆分的末尾,但只有在找到开始标记时才会这样做,否则扫描会在块/拆分的末尾停止。

因此(最终)要回答您的问题,如果您还没有配置映射器(并且正在使用默认映射器或标识映射器),那么是的,无论XML块有多大(MB、GB、TB!)它将被送到减速器。

我希望这说得通。

    null
 类似资料:
  • 问题内容: 我是Hadoop MapReduce的新手(准确地说是4天),并且被要求在集群上执行分布式XML解析。根据我在Internet上的(重新)搜索,使用Mahout的XmlInputFormat应该相当容易,但是我的任务是确保该系统适用于大型(〜5TB)XML文件。 据我所知,发送到映射器的文件拆分不能大于hdfs块大小(或每个作业块大小)。[如果我弄错了,请纠正我]。 我面临的问题是,某

  • php artisan route:cache命令引发错误: stream_set_chunk_size():块大小不能大于2147483647 在供应商处/monolog/monolog/src/monolog/Handler/StreamHandler。菲律宾比索:144 请帮我解决这个问题

  • 我在laravel项目中遇到了“stream\u set\u chunk\u size():chunk size不能大于laravel 24215454”这一错误。不知道这是为什么。 我使用的是Laravel8和XAMPP3.3。0

  • 我正在尝试安装Craftable,当我运行命令时,它抛出错误: 在StreamHandler.php第144行:stream_set_chunk_size():块大小不能大于2147483647 请帮我解决这个问题。

  • 我有四个问题。假设在spark中有3个worker节点。每个工人节点有3个执行器,每个执行器有3个核心。每个执行器有5 gb内存。(总共6个执行器,27个内核,15GB内存)。如果: > 我有30个数据分区。每个分区的大小为6 GB。最佳情况下,分区的数量必须等于核心的数量,因为每个核心执行一个分区/任务(每个分区执行一个任务)。在这种情况下,由于分区大小大于可用的执行器内存,每个执行器核心将如何

  • 我有一个名为MyPanel extend JPanel的类,使用GridLayout。每个单元格都包含一个小部件(一个JComboBox、JTextField、JLabel)。 我的主要类extend JFrame使用GridBagLayout。当我将MyPanel添加到其中时,它会占用大量空间(所有窗口都在我的桌面空间外水平移动)。我该怎么修?这是我的主类的构造函数 MyPanel构造函数