簡體   English   中英

使用Java和Spark從本地圖像到HDFS寫入序列文件

[英]Writing a sequence file from an image in local to HDFS using Java and Spark

如標題所示,這就是我現在的目標。

  • 我需要從目錄加載一堆非文本文件
  • 從中提取通常的文件信息(創建日期,作者,類型...這些)
  • 創建類型的序列文件
  • 將提取的新信息放入.seq文件的Key中
  • 將它們全部存儲在hdfs目錄中。

我使用spark的原因是為了實現可伸縮性(要處理數千個文件,並且我將有一組工作線程可用),並且因為我正在考慮在圖像目錄上實現SParkStreaming接收器,以便文件將被自動處理。 這是我的初始代碼:

JavaPairRDD<String, String> imageRDD = jsc.wholeTextFiles("file:///home/cloudera/Pictures/");

    imageRDD.mapToPair(new PairFunction<Tuple2<String,String>, Text, Text>() {

        @Override
        public Tuple2<Text, Text> call(Tuple2<String, String> arg0)
                throws Exception {
            return new Tuple2<Text, Text>(new Text(arg0._1),new Text(arg0._2));
        }

    }).saveAsNewAPIHadoopFile("hdfs://localhost:8020/user/hdfs/sparkling/try.seq", Text.class, Text.class, SequenceFileOutputFormat.class);

在這里,我將圖像加載為文本文件,並從hadoop庫中創建具有Text類型的元組。 這可行,但是:

  1. 該文件不是保存為單個文件,而是保存為包含分區的文件夾。
  2. 它不是字節數組,而是文件的文本表示形式。 我們都知道從文本轉換為圖像(或任何形式)可能會令人na惱
  3. 如果我這樣加載文件,是否可以提取所需的信息?

我試圖將文件加載為sparkContext.binaryFiles(<directory>) ,但是我總是迷失於如何提取信息以及如何保存它們。
我似乎無法在互聯網上找到答案:你們當中有人知道嗎?

這是我的操作方式:

JavaPairRDD<String, PortableDataStream> imageByteRDD = jsc.binaryFiles(SOURCE_PATH);
        if(!imageByteRDD.isEmpty())
            imageByteRDD.foreachPartition(new VoidFunction<Iterator<Tuple2<String,PortableDataStream>>>() {

            @Override
            public void call(
                    Iterator<Tuple2<String, PortableDataStream>> arg0)
                    throws Exception {
                Configuration conf = new Configuration();
                conf.set("fs.defaultFS", HDFS_PATH);
                while(arg0.hasNext()){
                    Tuple2<String,PortableDataStream>fileTuple = arg0.next();
                    Text key = new Text(fileTuple._1());
                    String fileName = key.toString().split(SEP_PATH)[key.toString().split(SEP_PATH).length-1].split(DOT_REGEX)[0];
                    String fileExtension = fileName.split(DOT_REGEX)[fileName.split(DOT_REGEX).length-1];

                      BytesWritable value = new BytesWritable( fileTuple._2().toArray());
                         SequenceFile.Writer writer = SequenceFile.createWriter(
                                 conf, 
                                 SequenceFile.Writer.file(new Path(DEST_PATH + fileName + SEP_KEY + getCurrentTimeStamp()+DOT+fileExtension)),
                               SequenceFile.Writer.compression(SequenceFile.CompressionType.RECORD, new BZip2Codec()),
                               SequenceFile.Writer.keyClass(Text.class), SequenceFile.Writer.valueClass(BytesWritable.class));
                         key = new Text(key.toString().split(SEP_PATH)[key.toString().split(SEP_PATH).length-2] + SEP_KEY + fileName + SEP_KEY + fileExtension);
                            writer.append(key, value);
                         IOUtils.closeStream(writer);

                }
            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM