【问题标题】:Gzipping Har Files on HDFS using Spark使用 Spark 在 HDFS 上压缩 Har 文件
【发布时间】:2017-09-16 22:33:55
【问题描述】:

我有大量的 hadoop 存档 .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.

但是,这并没有给我正确的结果。生成了一个 Gzipped 文件,但输出无效(单行表示 rdd 类型等)

任何帮助将不胜感激。我也对任何其他方法持开放态度。

谢谢。

【问题讨论】:

  • HAR 档案中有哪些内容——CSV、JSON、非结构化文本(例如日志)、二进制文件?您是否考虑过取消归档每个 HAR、GZipping 内部的每个文件并重新归档?如果不是二进制文件,您是否考虑将每个 HAR(或多个 HAR)的内容合并到一个 GZipped(或 BZipped)文件中,并使用 MR 或 Spark 作业?如果是结构化的,您是否考虑过将每个 HAR(或多个 HAR)的内容合并为列格式,例如 Parquet 或 ORC,并使用 GZip 压缩?
  • @SamsonScharfrichter har 将包含纯文本文件或镶木地板文件。没有什么像 xmls 但我不希望数据拆分。对每个文件进行 Gzip 压缩是一个问题,因为 har 可能包含 350 多个目录,并且在每个目录中都会有一个文件。我不知道该怎么做。我尝试使用 PIG 使用 GZip Compression 压缩该单个 har 文件。它确实成功地压缩了但创建了部分文件,这又是不受欢迎的,因为 GZip 不可拆分。最后,不能合并多个 HAR,因为每个 har 需要单独压缩。

标签: scala hadoop apache-spark compression hdfs


【解决方案1】:

用于创建现有 HDFS 文件的压缩版本的 Java 代码 sn-p。

在文本编辑器中匆忙构建,来自我前段时间编写的 Java 应用程序的点点滴滴,因此未经测试;一些错别字和空白是意料之中的。

// 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() ;

..............

【讨论】:

  • 感谢参孙的回答。会试一试并更新。
  • 所以我试了一下,但没有成功,因为har 文件是一个目录,你不能压缩一个目录。您是否建议在 HDFS 上创建 tar 而不是 har(使用 org.apache.commons.compress)然后压缩它?
  • Duh... 看起来 HAR 确实是一只奇怪的野兽。但是如果 HDFS 声明它是一个目录,并允许您访问单个文件,那么您应该能够从 HAR 构建单个 ZIP 文件(使用标准 java.util.zip.ZipOutputStream. putNextEntry() 等)-- 免责声明: 我不是古老的 TAR 格式的忠实粉丝.
  • 最终分别对每个文件进行 bzip 压缩。 -.- 无论如何,感谢您的回复。信息量很大。
猜你喜欢
  • 2017-06-17
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
相关资源
最近更新 更多