下篇解压缩:使用Hadoop API 解压缩 HDFS文件

  起因: 集群磁盘剩余空间不足。

  删除了存储在HDFS上的,一定时间之前的中间结果,发现并不能释放太多空间,查看计算业务,发现,每天的日志存在数量竟然是10份。/惊恐

  /a/log=20180101   #每日原始日志

  /b/log=20180101  #每日原始日志,做了清洗

  /c/log=20180101  #清洗后的日志移到这里使用

  /opt/backup/log=20180101  每日原始日志压缩  

  四个地方存储了原始日志(每天30G左右),由于所有目录都是3个副本,导致HDFS上几乎相同的文件存了9份(270G),一份本地压缩(5G)

  由于都是文本文件,压缩率比较高,就想把其中不常用的目录下的文件拉下了,压缩,放回去。

  ------------------正文---------------------

  第一版操作如下:    

、获取文件
hadoop fs -get /aa/test/xxxx.log
、压缩
tar -zcvf xxxx.log.tar.gz xxxx.log
、上传
hadoop fs -put xxxx.log.tar.gz /aa/test/
、删除本地临时文件
rm *
、删除hdfs上文件
hadoop fs -rm /aa/test/xxxx.log

  可以执行,但是很慢。

  反思一下:  

一个文件30G需要如下这么多时间:
从hdfs拉到本地: m
压缩 : + m
上传到hdfs: m

  时间太长,花很长的时间把文件来下来压缩了,下次突然要用,可能来不及解压缩。。。

---------第一版失败------------------------

  在网上看到这篇博客:HDFS中的压缩与解压缩机制

  使用Hadoop的API 压缩本地文件,不知道压缩完放到HDFS上,MapReduce能不能读。。

  不过,不影响借鉴一下,编写压缩HDFS上文件的代码。

  主要代码如下:  

private static void getFile(String filePath) throws IOException, ClassNotFoundException {

        FileSystem fs = FileSystem.get(URI.create(filePath), HDFSConf.getConf());
Path path = new Path(filePath); if (fs.exists(path)) { FSDataInputStream in;
FSDataOutputStream out;
// Class codecClass = Class.forName("BZip2Codec");
// 通过名称找到对应的编码/解码器
CompressionCodec codec = (CompressionCodec)
ReflectionUtils.newInstance(org.apache.hadoop.io.compress.GzipCodec.class, HDFSConf.getConf()); FileStatus file = fs.getFileStatus(path);
in = fs.open(file.getPath());
// 该压缩方法对应的文件扩展名
Path outPath = new Path(file.getPath().toString() + codec.getDefaultExtension());
logger.info("out put path is : " + outPath.toString()); if (fs.createNewFile(outPath)) {
logger.info("create file : " + outPath.toString()); out = fs.append(outPath);
CompressionOutputStream cout = codec.createOutputStream(out); // 缓冲区设为5MB
IOUtils.copyBytes(in, cout, 1024 * 1024 * 5, true);
// 刷新缓存,不刷会导致文件结尾部分漏点数据
cout.flush();
out.flush(); in.close();
cout.close();
out.close(); logger.info("compress file successful");
} else {
logger.error("create file erroe");
} } else {
logger.info("There is no file :" + filePath);
} }

打包放到服务器上执行:  

[hadoop@venn05 venn]$ ls
compressHdfsFile-1.0-SNAPSHOT.jar hdfs.properties log4j2.xml test

[hadoop@venn05 venn]$ java -cp compressHdfsFile-1.0-SNAPSHOT.jar com.utstarcom.hdfs.CompressFile /aaa/test/viewlog_20180402.log
2018-06-10 04:23:16.631 [Common.java] [main]
INFO : start init :
2018-06-10 04:23:16.636 [Common.java] [main]
INFO : properties path : /opt/hadoop/tmp/venn/
/opt/hadoop/tmp/venn/hdfs.properties
default.compress.format
hdfs.uri
2018-06-10 04:23:16.639 [Common.java] [main]
INFO : get System enviroment : 46
2018-06-10 04:23:16.639 [Common.java] [main]
INFO : properties path : {hdfs.uri=hdfs://venn06:8020, default.compress.format=bz2}
hdfs://venn06:8020/aaa/test/viewlog_20180402.log
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2018-06-10 04:23:18.272 [CompressFile.java] [main]
INFO : out put path is : hdfs://venn06:8020/aaa/test/viewlog_20180402.log.gz
2018-06-10 04:23:18.356 [CompressFile.java] [main]
INFO : create file : hdfs://venn06:8020/aaa/test/viewlog_20180402.log.gz
2018-06-10 04:24:44.052 [CompressFile.java] [main]
INFO : compress file successful
cost :
87 s

文件大小:1.4G,压缩后打小:249.4M,6倍的压缩率,耗时 87s,很不错。

文件大小:

[hadoop@ut01 venn]$ hadoop fs -ls /aaa/test/
18/06/10 04:26:29 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 3 items
-rw-r--r-- 3 hadoop supergroup 1515343101 2018-06-03 17:07 /aaa/test/viewlog_20180402.log
-rw-r--r-- 3 hadoop supergroup 261506977 2018-06-09 15:46 /aaa/test/viewlog_20180402.log.gz
-rw-r--r-- 3 hadoop supergroup 1515343101 2018-06-09 15:43 /aaa/test/viewlog_20180402.new
[hadoop@ut01 venn]$ hadoop fs -ls -h /aaa/test/
18/06/10 04:26:38 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 3 items
-rw-r--r-- 3 hadoop supergroup 1.4 G 2018-06-03 17:07 /aaa/test/viewlog_20180402.log
-rw-r--r-- 3 hadoop supergroup 249.4 M 2018-06-09 15:46 /aaa/test/viewlog_20180402.log.gz
-rw-r--r-- 3 hadoop supergroup 1.4 G 2018-06-09 15:43 /aaa/test/viewlog_20180402.new


项目目录:码云

下篇解压缩:使用Hadoop API 解压缩 HDFS文件

  

使用Hadoop API 压缩HDFS文件的更多相关文章

  1. 使用Hadoop API 解压缩 HDFS文件

    接上篇:使用Hadoop API 压缩HDFS文件 压缩完了,当然需要解压缩了. 直接上代码: private static void getFile(String filePath) throws ...

  2. JAVA API 实现hdfs文件操作

    java api 实现hdfs 文件操作会出现错误提示: Permission denied: user=hp, access=WRITE, inode="/":hdfs:supe ...

  3. Hadoop API:遍历文件分区目录,并根据目录下的数据进行并行提交spark任务

    hadoop api提供了一些遍历文件的api,通过该api可以实现遍历文件目录: import java.io.FileNotFoundException; import java.io.IOExc ...

  4. java Api 读取HDFS文件内容

    package dao; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java ...

  5. Hadoop如何修改HDFS文件存储块大小

    一. 临时修改可以在执行上传文件命令时,显示地指定存储的块大小.1. 查看当前 HDFS文件块大小我这里查看HDFS上的TEST目录下的jdk-7u25-linux-x64.gz  文件存储块大小.1 ...

  6. 如何读取Hadoop中压缩的文件

    最近在处理离线数据导入HBase的问题,涉及从Hdfs中读取gz压缩文件,把思路记录下来,以作备用.具体代码如下: package org.dba.util; import java.io.Buffe ...

  7. 使用java api操作HDFS文件

    实现的代码如下: import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import ...

  8. hadoop学习记录--hdfs文件上传过程源码解析

    本节并不大算为大家讲接什么是hadoop,或者hadoop的基础知识因为这些知识在网上有很多详细的介绍,在这里想说的是关于hdfs的相关内容.或许大家都知道hdfs是hadoop底层存储模块,专门用于 ...

  9. Structure Streaming和spark streaming原生API访问HDFS文件数据对比

    此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Structure Stream访问方式 code examples import org.apache.sp ...

随机推荐

  1. Mastering Unity 2D Game Development

    Mastering Unity 2D Game Development will give your game development skills a boost and help you begi ...

  2. 微信小程序开发——开发者工具中素材管理功能使用的注意事项

    为什么使用“素材管理”: 微信小程序环境中本地资源图片是无法通过 WXSS 获取的,可以使用网络图片,或者 base64,或者使用<image/>标签.. 当然,如果不想这么麻烦,你可能会 ...

  3. [剑指Offer]39-数组中出现次数超过一半的数字(快排延申,找第k大数同理)

    题目链接 https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&t ...

  4. mysql之 安装(Mac)

    1.官网下载安装包:https://dev.mysql.com/downloads/mysql/ 2.设置环境变量:(1)首先mysql的安装位置为:/usr/local/mysql/bin (2)在 ...

  5. 好文:javascript中的四种循环

    https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...

  6. 支付宝H5 与网页端支付开发

    在日常生活中,我们基本上都是进行微信与支付宝的支付方式尽心支付,这种方式确实大大便利了我们的生活,那么如何在我们的产品中进行微信与支付宝支付的植入开发呢? 我们先进行支付宝的H5与网页端支付开发,这里 ...

  7. 设置TextFiled输入长度限制

    #pragma mark - 显示超过11位不让输入 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: ...

  8. 如何指定vim 的查找是从上往下还是从下往上[z]

    vim 搜索可以是 / 或者 ?,前者是往下找,后者是往前找. 用 n 查找下一个的时候,就和这两个指令指定的方向相同.如果你想改变方向的话,比如想往下找,那么 / 完了直接回车就行了.表示再次使用上 ...

  9. python multiprocessing 和tcp

    #用类方法 服务端 from socket import *from multiprocessing import Processimport os class Myprocess(Process): ...

  10. andorid 数据储存、SharedPreferences存储和手机内部储存

    .xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...