第四章中提到了通过CompressionCodec对streams进行压缩和解压缩,并提供了示例程序:

输入:标准输入流

输出:压缩后的标准输出流

// cc StreamCompressor A program to compress data read from standard input and write it to standard output
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils; // vv StreamCompressor
public class StreamCompressor { public static void main(String[] args) throws Exception {
String codecClassname = args[0];
Class<?> codecClass = Class.forName(codecClassname);
Configuration conf = new Configuration();
CompressionCodec codec = (CompressionCodec)
ReflectionUtils.newInstance(codecClass, conf); CompressionOutputStream out = codec.createOutputStream(System.out);
IOUtils.copyBytes(System.in, out, 4096, false);
out.finish();
}
}
// ^^ StreamCompressor

该实例程序通过CompressionCodec的createOutputStream(OutputStream out)方法获得CompressionOutputStream对象。

第12行因参数固定,可以直接写成String codecClassname="org.apache.hadoop.io.compress.GzipCodec";

即从命令行接受一个CompressionCodec实现类的参数,然后通过ReflectionUtils把实例化这个类,调用CompressionCodec的接口方法对标准输出流进行封装,封装成一个压缩流,通过IOUtils类的copyBytes方法把标准输入流拷贝到压缩流中,最后调用CompressionCodec的finish方法,完成压缩。

在hadoop集群的hadoop根目录下使用如下命令验证该程序(通过linux的gunzip完成解压缩):

echo "Hello world" |  hadoop jar xxxx.jar com.tht.hadoopIO.StreamCompressor  org.apache.hadoop.io.compress.GzipCodec | gunzip -

下面对改程序做进一步修改:

一、更改输出路径:即标准输入流压缩后的存放位置。

输入:标准输入流

输出:压缩后的文件存放到HDFS上

示例代码如下:

package com.tht.hadoopIO;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils; //vv StreamCompressor
public class StreamCompressor { public static void main(String[] args) throws Exception {
String codecClassname = "org.apache.hadoop.io.compress.GzipCodec";
String outputUri = "hdfs://master:9000/in/test.gz"; Class<?> codecClass = Class.forName(codecClassname);
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(outputUri), conf); CompressionCodec codec = (CompressionCodec) ReflectionUtils
.newInstance(codecClass, conf);
		CompressionOutputStream out = codec.createOutputStream(fs.create(new Path(outputUri)));
IOUtils.copyBytes(System.in, out, 4096, false);
out.finish();
}
}
// ^^ StreamCompressor

当然,在此路径outputUri:,,,/test.gz是指压缩后的文件存放位置和文件名及扩展名,如果改为...../test.txt.gz则指以.txt格式的压缩文件,后缀名是gz。

二、更改输入文件,即将输入文件路径定为HDFS上的文件。

输入:HDFS上存放文件

输出:压缩后的文件存放至HDFS上

示例代码如下:

import java.io.InputStream;
import java.net.URI; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils; //vv StreamCompressor
public class StreamCompressor { public static void main(String[] args) throws Exception {
String codecClassname = "org.apache.hadoop.io.compress.GzipCodec";
String uri = "hdfs://master:9000/in/test.txt";
String outputUri = "hdfs://master:9000/in/test.txt.gz"; Class<?> codecClass = Class.forName(codecClassname);
Configuration conf = new Configuration();
FileSystem fs1 = FileSystem.get(URI.create(uri), conf);
FileSystem fs2 = FileSystem.get(URI.create(outputUri), conf); CompressionCodec codec = (CompressionCodec) ReflectionUtils
.newInstance(codecClass, conf); InputStream in =fs1.open(new Path(uri));
CompressionOutputStream out = codec.createOutputStream(fs2.create(new Path(outputUri))); IOUtils.copyBytes(in, out, 4096, false);
in.close();
out.close();
}
}
// ^^ StreamCompressor

当然了,输入输出都可以以参数形式存在。即String uri = arg[0];String outputUri =arg[1];则在执行时须加入两个路径参数。

Hadoop: the definitive guide 第三版 拾遗 第四章的更多相关文章

  1. Hadoop: the definitive guide 第三版 拾遗 第十三章 之HBase起步

    指南上这一章的开篇即提出:HBase是一个分布式的.面向列的开源数据库.如果需要实时的随机读/写超大规模数据集,HBase无疑是一个好的选择. 简介 HBase 是一个高可靠性.高性能.面向列.可伸缩 ...

  2. Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive初步

    Hive简介 Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据的机制 ...

  3. Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive分区表、桶

    Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ...

  4. Hadoop: the definitive guide 第三版 拾遗 第十章 之Pig

    概述: Pig的安装很简单,注意一下几点: 1.设置系统环境变量: export PIG_HOME=.../pig-x.y.z export PATH=$PATH:$PIG_HOME/bin 设置完成 ...

  5. JavaScript高级程序设计(第三版)第四章 变量,作用域和内存问题

    JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型值和引用类型值具有以下特点: 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中: 从一个变量向另一个变量复制 ...

  6. Hadoop – The Definitive Guide Examples,,IntelliJ

    IntelliJ Project for Building Hadoop – The Definitive Guide Examples http://vichargrave.com/intellij ...

  7. 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列

    定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...

  8. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

  9. 重读《学习JavaScript数据结构与算法-第三版》-第2章 ECMAScript与TypeScript概述

    定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据 ...

随机推荐

  1. apache虚拟主机配置及常用安全配置

    环境准备: 服务器系统:CentOS 6.5 安装lamp环境: yum -y install mysql mysql-server php php-mysql httpd php-gd* freet ...

  2. Nginx安装方式探究

    Ubuntu 16.04(阿里云ECS),Nginx 1.10.3 (Ubuntu) 本文探究两种安装方式: 1.源码安装(手动) 2.APT安装(自动) 源码安装(手动) 步骤简介: 下载.解压.. ...

  3. 使用JS实现俄罗斯方块游戏

    简单的JS俄罗斯方块游戏源码 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  4. .NetCore中结合ExceptionLess的处理对Polly再次封装

    /// <summary> /// Polly封装 liyouming /// </summary> public class PollyServicesFactory { p ...

  5. Elasticsearch常用最全最常用工具清单

    https://blog.csdn.net/ZYC88888/article/details/82872558

  6. nginx支持ssl双向认证配置

    nginx支持ssl双向认证配置 listen 443; server_name test.com; ssl on; ssl_certificate server.crt; //server端公钥 s ...

  7. 【CodeChef】QTREE- Queries on tree again!

    题解 给你一棵基环树,环长为奇数(两点间最短路径只有一条) 维护两点间路径最大子段和,支持把一条路径上的值取反 显然只要断开一条边维护树上的值,然后对于那条边分类讨论就好了 维护树上的值可以通过树链剖 ...

  8. 【AtCoder】ARC092

    C - 2D Plane 2N Points 把能连边的点找到然后跑二分图匹配即可 #include <bits/stdc++.h> #define fi first #define se ...

  9. flask 封装

    #!/bin/env python# _*_coding:utf-8_*_#!!!!!!!!!!!!describe:this script shoud install python-devel an ...

  10. 关于gitignore无效的一些记录

    git 远程上已经有了 .idea *.iml文件 拉到本地之后,添加.gitignore 此时由于远程有了这些文件,所以.gitignore无法忽略这些文件了 挽救做法: 思路是在本地的git缓存中 ...