Spark - 以字节格式读取文件作为InputStream

时间:2015-10-27 06:45:16

标签: java apache-spark inputstream rdd

如何以字节数组格式读取多个文件作为spark作业中的输入流?

Path pt = new Path(umfPaths);           
FileSystem fs = FileSystem.get(jsc.hadoopConfiguration());
fs.open(pt);

..原因是我有输入文件,其内容是字节格式。然后将输入文件拆分为多个文件,块长度为64 MB,并存储在HDFS中。我必须使用Apache spark并行处理文件。 req是将整个64MB的块作为单个文件读取并处理它。通过编写自定义记录阅读器或使用FileSystem API(使用InputStream)读取每个文件来进行处理是否有效?

1 个答案:

答案 0 :(得分:0)

我在SparkContext,newHadoopApiFile中使用API​​解决了这个问题。 我编写了一个CustomInputFormat类,它将执行InputFormat操作并将返回一个POJO对象。

  

JavaPairRDD> baseRDD =   sc.newAPIHadoopFile(args [2],InputFormat.class,NullWritable.class,   ArrayList.class,conf);

然后忽略Key,只创建一个RDD值。

  

JavaRDD> mapLines1 = baseRDD.values();

然后做了上述RDD的FlatMap。

在InputFormat类中,我扩展了FileInputFormat,并将isSplittable覆盖为false,以便作为单个文件读取。

public class InputFormat extends  FileInputFormat {    
 public
 RecordReader<NullWritable, ArrayList<Record>> 
  createRecordReader(InputSplit split, TaskAttemptContext context)
 throws IOException, InterruptedException{  //Logic Goes here  }

      @Override
          protected boolean isSplitable(JobContext context, Path file) {             return false;     
} 
}