如果是,hdfs如何将输入文件拆分为n行以供每个Map器读取?我相信这是不可能的!当拆分器需要偏移量或字节进行拆分时,可以在不处理整个输入文件的情况下进行拆分。但是当'\n'或新行字符的数目很重要时,在拆分之前,有必要处理整个输入文件(以计算新行字符)。
nlejzf6q1#
对。这是可能的!原因:该机制仍然是相同的,并对原始数据起作用。nlineinputformat中的n表示每个Map器接收的输入行数。准确地说,记录的数量。因为nlineinputformat使用linerecordreader,所以每一行都是一条记录。它不会改变创建拆分的方式,通常基于hdfs块的大小(请记住nlineinputformat是fileinputformat家族的成员)。
xdyibdwo2#
为了 NLineInputFormat 要工作,每个分割都需要知道第x n行从哪里开始。正如你在对塔里克的回答的评论中所指出的,Map绘制者不能只知道第三行(香蕉)从哪里开始,它从Map的 InputSplit .这实际上是在输入格式的 getSplitsForFile 方法,该方法打开每个输入文件,并发现每个第n行开始的字节偏移量(并生成一个 InputSplit 由Map任务处理)。正如您所想象的,对于大型输入文件(或大型输入文件集),这并不能很好地扩展为 InputFormat 需要打开并读取每个文件来发现分割边界。我自己从来没有使用过这种输入格式,但我认为最好是在一个较小的输入文件中的每一行都有大量cpu密集型工作要做的时候使用这种格式,这样就可以跨多个Map器(比如10个Map器中的10行)划分负载,而不是由一个Map器来完成100个记录文件的所有工作。
NLineInputFormat
InputSplit
getSplitsForFile
InputFormat
2条答案
按热度按时间nlejzf6q1#
对。
这是可能的!
原因:
该机制仍然是相同的,并对原始数据起作用。nlineinputformat中的n表示每个Map器接收的输入行数。准确地说,记录的数量。因为nlineinputformat使用linerecordreader,所以每一行都是一条记录。它不会改变创建拆分的方式,通常基于hdfs块的大小(请记住nlineinputformat是fileinputformat家族的成员)。
xdyibdwo2#
为了
NLineInputFormat
要工作,每个分割都需要知道第x n行从哪里开始。正如你在对塔里克的回答的评论中所指出的,Map绘制者不能只知道第三行(香蕉)从哪里开始,它从Map的InputSplit
.这实际上是在输入格式的
getSplitsForFile
方法,该方法打开每个输入文件,并发现每个第n行开始的字节偏移量(并生成一个InputSplit
由Map任务处理)。正如您所想象的,对于大型输入文件(或大型输入文件集),这并不能很好地扩展为
InputFormat
需要打开并读取每个文件来发现分割边界。我自己从来没有使用过这种输入格式,但我认为最好是在一个较小的输入文件中的每一行都有大量cpu密集型工作要做的时候使用这种格式,这样就可以跨多个Map器(比如10个Map器中的10行)划分负载,而不是由一个Map器来完成100个记录文件的所有工作。