복붙노트

[HADOOP] HDFS 사용하여 스파크에 하르 파일을 Gzip으로 압축

HADOOP

HDFS 사용하여 스파크에 하르 파일을 Gzip으로 압축

나는 하둡 아카이브 .har 형식으로 큰 데이터를 가지고있다. , HAR은 압축을 포함하지 않기 때문에, 본인은 그것을 gzip을하고 HDFS에 저장하려합니다. 내가 오류없이 작동시킬 수있는 유일한 방법은 다음과 같습니다

harFile.coalesce(1, "true")
.saveAsTextFile("hdfs://namenode/archive/GzipOutput", classOf[org.apache.hadoop.io.compress.GzipCodec])
//`coalesce` because Gzip isn't splittable.

그러나, 이것은 나에게 정확한 결과를 제공하지 않습니다. gzip으로 압축 된 파일이 생성됩니다 만 유효 출력 (한 줄은 RDD 유형 등을 말하는)

어떤 도움을 이해할 수있을 것이다. 나는 또한 다른 접근 방법에 열려입니다.

감사.

해결법

  1. ==============================

    1.자바 코드는 기존 HDFS 파일의 압축 된 버전을 만들 수 있습니다.

    자바 코드는 기존 HDFS 파일의 압축 된 버전을 만들 수 있습니다.

    비트와 나는 몇 년 전에, 따라서 테스트하지를 쓴 자바 애플 리케이션의 조각에서, 텍스트 편집기, 서둘러 내장; 오타과 격차를 기대할 수있다.

    // HDFS API
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.security.UserGroupInformation;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.fs.FileStatus;
    // native Hadoop compression libraries
    import org.apache.hadoop.io.compress.CompressionCodecFactory;
    import org.apache.hadoop.io.compress.CompressionCodec;
    import org.apache.hadoop.io.compress.Compressor;
    import org.apache.hadoop.io.compress.GzipCodec;
    import org.apache.hadoop.io.compress.BZip2Codec;
    import org.apache.hadoop.io.compress.SnappyCodec;
    import org.apache.hadoop.io.compress.Lz4Codec;
    
    ..............
    
      // Hadoop "Configuration" (and its derivatives for  HDFS, HBase etc.) constructors try to auto-magically
      //  find their config files by searching CLASSPATH for directories, and searching each dir for hard-coded  
      //  name "core-site.xml", plus "hdfs-site.xml" and/or "hbase-site.xml" etc.
      // WARNING - if these config files are not found, the "Configuration" reverts to hard-coded defaults without
      //  any warning, resulting in bizarre error messages later > let's run some explicit controls here
      Configuration cnfHadoop = new Configuration() ;
      String propDefaultFs =cnfHadoop.get("fs.defaultFS") ;
      if (propDefaultFs ==null || ! propDefaultFs.startsWith("hdfs://"))
      { throw new IllegalArgumentException(
                    "HDFS configuration is missing - no proper \"core-site.xml\" found, please add\n"
                   +"directory /etc/hadoop/conf/ (or custom dir with custom XML conf files) in CLASSPATH"
                   ) ;
      }
    /*
      // for a Kerberised cluster, either you already have a valid TGT in the default
      //  ticket cache (via "kinit"), or you have to authenticate by code
      UserGroupInformation.setConfiguration(cnfHadoop) ;
      UserGroupInformation.loginUserFromKeytab("user@REALM", "/some/path/to/user.keytab") ;
    */
      FileSystem fsCluster =FileSystem.get(cnfHadoop) ;
      Path source = new Path("/some/hdfs/path/to/XXX.har") ;
      Path target = new Path("/some/hdfs/path/to/XXX.har.gz") ;
    
      // alternative: "BZip2Codec" for better compression (but higher CPU cost)
      // alternative: "SnappyCodec" or "Lz4Codec" for lower compression (but much lower CPU cost)
      CompressionCodecFactory codecBootstrap = new CompressionCodecFactory(cnfHadoop) ;
      CompressionCodec codecHadoop =codecBootstrap.getCodecByClassName(GzipCodec.class.getName()) ;
      Compressor compressorHadoop =codecHadoop.createCompressor() ;
    
      byte[] buffer = new byte[16*1024*1024] ;
      int bufUsedCapacity ;
      InputStream  sourceStream =fsCluster.open(source) ;
      OutputStream targetStream =codecHadoop.createOutputStream(fsCluster.create(target, true), compressorHadoop) ;
      while ((bufUsedCapacity =sourceStream.read(buffer)) >0)
      { targetStream.write(buffer, 0, bufUsedCapacity) ; }
      targetStream.close() ;
      sourceStream.close() ;
    
    ..............
    
  2. from https://stackoverflow.com/questions/43517025/gzipping-har-files-on-hdfs-using-spark by cc-by-sa and MIT license