HDFS的文件压缩格式

Hadoop默认支持Gzip和BZip2的解压缩方式,可直接读取(hadoop fs -text命令),但hive只能用TEXTFILE格式的表加载,然后再insertoverwrite 到其他格式的表(比如SEQUENCEFILE表),如果hive其他格式的表想要直接加载压缩格式数据,需要重写INPUTFORMAT和OUTPUTFORMAT文件类。

BZip2和LZO(提供block级的压缩)支持文件切分,Gzip和Snappy则不支持。 不支持则hadoop不能并行的进行map操作。

hadoop中支持的压缩格式
DEFLATEorg.apache.hadoop.io.compress.DefaultCodec
gzip org.apache.hadoop.io.compress.GzipCodec
bzip org.apache.hadoop.io.compress.BZip2Codec
Snappy org.apache.hadoop.io.compress.SnappyCodec
LZO:
org.apache.hadoop.io.compress.LzopCodec或者com.hadoop.compression.lzo.LzopCodec;
org.apache.hadoop.io.compress.LzoCodec或者com.hadoop.compression.lzo.LzoCodec;

可以查看目前hive已加载的所以编解码器
set io.compression.codecs;

中间结果压缩
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.Hadoop.io.compress.LzoCodec;
map结果压缩最好使用snappy的,因为压缩的前提是map输出非常大,影响io,如果中间结果数据集比较小反而会拖慢速度。

设置map输出结果压缩
Set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec;

最终输出结果压缩
hive.exec.compress.output和mapred.output.compression.codec是hive-site.xml中的配置参数,
而mapred.output.compress 和mapred.output.compression.codec 是hdfs-site.xml的配置参数。
都可以配置实现。

Hive格式各种格式下不同压缩算法的比较

Hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

Hive各种文件格式与压缩方式的结合测试

Hive支持的文件格式与压缩算法

要将文件写入HDFS并指定Gzip压缩格式,可以使用Flink提供的`org.apache.flink.core.fs.FileSystem`和`org.apache.flink.core.fs.Path`类来实现。具体步骤如下: 1. 创建一个`org.apache.flink.core.fs.FileSystem`对象,指定HDFS的URI和配置信息。 2. 创建一个`org.apache.flink.core.fs.Path`对象,指定写入HDFS文件路径。 3. 调用`FileSystem.create()`方法创建一个输出流。 4. 将数据写入输出流,这里可以使用`org.apache.flink.api.common.io.FileOutputFormat`类来实现Gzip压缩。 5. 关闭输出流。 下面是一个示例程序,它将数据写入HDFS并使用Gzip压缩: ```java import org.apache.flink.api.common.io.FileOutputFormat; import org.apache.flink.core.fs.FileSystem; import org.apache.flink.core.fs.Path; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class WriteToHdfsExample { public static void main(String[] args) throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 准备要写入HDFS的数据 DataStream<String> data = ... // 写入HDFS String outputPath = "hdfs://hadoop-master:9000/path/to/output"; FileSystem hdfs = FileSystem.get(new URI(outputPath), new Configuration()); Path path = new Path(outputPath); FSDataOutputStream outputStream = hdfs.create(path); GzipCompressor gzipCompressor = new GzipCompressor(); FileOutputFormat<String> fileOutputFormat = new TextOutputFormat<>(path, gzipCompressor); fileOutputFormat.setOutputFilePath(path); fileOutputFormat.setWriteMode(FileSystem.WriteMode.OVERWRITE); fileOutputFormat.open(outputStream); data.writeUsingOutputFormat(fileOutputFormat); fileOutputFormat.close(); // 启动任务执行 env.execute("Write to HDFS Example"); } } ``` 在以上示例程序中,`hadoop-master:9000`是HDFS的URI,`/path/to/output`是要写入的文件路径。`TextOutputFormat`是Flink提供的一个文本输出格式,它支持Gzip压缩。在`FileOutputFormat`的构造函数中,将`TextOutputFormat`作为参数传入,即可实现Gzip压缩
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值