根据我们的要求,一个作业的输出将是另一个作业的输入。
通过使用多输出概念,我们将在输出路径中创建一个新文件夹并将这些记录写入文件夹。这是它的样子:
OPFolder1/MultipleOP/SplRecords-m-0000*
OPFolder1/part-m-0000* files
当新作业将输入用作 OPFolder1 时,我面临以下错误
org.apache.hadoop.hdfs.DistributedFileSystem.open(DistributedFileSystem.java:298)
at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:766)
at org.apache.hadoop.mapreduce.lib.input.LineRecordReader.initialize(LineRecordReader.java:85)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:548)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:786)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
org.apache.hadoop.ipc.RemoteException(java.io.FileNotFoundException): Path is not a file: /user/abhime01/OPFolder1/MultiplOP/
有什么方法或属性,使hadoop只读取文件而不是文件夹。
将mapreduce.input.fileinputformat.input.dir.recursive
设置为 true
。请参阅文件输入格式不会递归读取输入路径目录中的文件。
实现此目的的一种方法是通过子类化默认 InputFormat 类来创建自定义输入格式,以便它允许您重写 listStatus 方法。在实现 liststatus 方法时,您只需要忽略输入目录内的目录。
例:
for (int i = 0; i < len; ++i) {
FileStatus file = files[i];
if (!file.isDir()) {
newFiles.add(file);
希望对您有所帮助。
您可以使用路径,而不是使用输入路径的根目录: OPFolder1/part-m*
,这基本上是此目录中的所有文件,其名称以 part-m
开头。