下篇解压缩:使用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. NumPy 字节交换

    NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.字节顺序,是跨越多字节的程序对象的存储规则. 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地 ...

  2. Java-分治算法

    一.分治算法的原理 分治算法就是将一个规模为N的问题分解成K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,就可以得出原问题的解 二.分治算法的伪代码实现 合并算法Merge ...

  3. [剑指Offer]59-队列的最大值(题目二待补)

    题目一:滑动窗口的最大值 题目链接 https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&tqI ...

  4. 并行网络爬虫(C++实现)

    step1 使用socket编程技术,利用http协议,抽取网页中的url,实现简单的爬虫. socket int socket (int domain, int type, int protocol ...

  5. 8.21 :odd??:nth-of-type??

    今天为了实现隔行变色,我在css里写: .note:odd{ background-color: #eee; } 有一个页面有效果,另一个页面没效果,怎么也找不到原因...各种尝试各种清缓存都不行,, ...

  6. node.js中module模块的理解

    node.js中使用CommonJS规范实现模块功能,一个单独的文件就是一个单独的模块.通过require方法实现模块间的依赖管理. 通过require加载模块,是同步操作. 加载流程如下: 1.找到 ...

  7. 使用PHP来简单的创建一个RPC服务

    RPC全称为Remote Procedure Call,翻译过来为"远程过程调用".主要应用于不同的系统之间的远程通信和相互调用. 比如有两个系统,一个是PHP写的,一个是JAVA ...

  8. php使用fputcsv进行大数据的导出

    为了实验大数据的导出,我们这里先自已创建一张大表,表结构如下: CREATE TABLE `tb_users` ( `id` int(11) unsigned NOT NULL AUTO_INCREM ...

  9. java 知识汇总

    一.springboot cloud 1.maven 配置 parent:org.springframework.boot:sping-boot-starter-parent dependencies ...

  10. 向kafka批量发送已存在的txt文件

    需要利用kafka发送txt或log文件,有两种方式:1.自己写程序:2.利用kafka自带脚本. 自己写程序: import org.apache.kafka.clients.producer.Ka ...