zoukankan      html  css  js  c++  java
  • 使用Hadoop API 压缩HDFS文件

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

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

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

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

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

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

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

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

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

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

      第一版操作如下:    

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

      可以执行,但是很慢。

      反思一下:  

    一个文件30G需要如下这么多时间:
        从hdfs拉到本地: 10 m 
        压缩 : 30+ m 
        上传到hdfs: 10 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文件

      

  • 相关阅读:
    numpy基础篇-简单入门教程4
    杭电oj 多项式求和
    杭电oj 素数判定
    杭电oj 水仙花数
    杭电oj 求数列的和
    杭电oj 数值统计
    杭电oj 平方和与立方和
    杭电oj 求奇数的乘积
    杭电 oj 第几天?
    杭电 oj 成绩转换
  • 原文地址:https://www.cnblogs.com/Springmoon-venn/p/9194652.html
Copyright © 2011-2022 走看看