如何使Hadoop MR在输入路径中成为只读文件而不是文件夹

如何使Hadoop MR在输入路径中成为只读文件而不是文件夹,hadoop,mapreduce,recordreader,Hadoop,Mapreduce,Recordreader,根据我们的要求,一个作业的输出将成为另一个作业的输入 通过使用多个输出概念,我们正在输出路径中创建一个新文件夹,并将这些记录写入该文件夹。这就是它的样子: OPFolder1/MultipleOP/SplRecords-m-0000* OPFolder1/part-m-0000* files 当新作业将输入用作OPFolder1时,我面临以下错误 org.apache.hadoop.hdfs.DistributedFileSystem.open(DistributedFileSystem.ja

根据我们的要求,一个作业的输出将成为另一个作业的输入

通过使用多个输出概念,我们正在输出路径中创建一个新文件夹,并将这些记录写入该文件夹。这就是它的样子:

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);
for(int i=0;i

希望这对您有所帮助。

您可以使用以下路径,而不是使用根目录作为输入路径:
OPFolder1/part-m*

基本上就是这个目录中的所有文件,它们的名字以
part-m

开头。你有没有尝试过
OPFolder1/part-m-0000
而不是
OPFolder1
?@YoungHobbit:但是我有很多part-m-0000*文件?你的意思是传递类似于这个OPFolder1/part-m*的输入?是的。很抱歉刚才的输入错误。我不想读这个e子文件夹,我只需要读取主文件夹中的文件。不要将输出与文件夹混合。将输出写入其他地方