Hadoop: the definitive guide 第三版 拾遗 第四章
第四章中提到了通过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 第三版 拾遗 第四章的更多相关文章
- Hadoop: the definitive guide 第三版 拾遗 第十三章 之HBase起步
		指南上这一章的开篇即提出:HBase是一个分布式的.面向列的开源数据库.如果需要实时的随机读/写超大规模数据集,HBase无疑是一个好的选择. 简介 HBase 是一个高可靠性.高性能.面向列.可伸缩 ... 
- Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive初步
		Hive简介 Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据的机制 ... 
- Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive分区表、桶
		Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ... 
- Hadoop: the definitive guide 第三版 拾遗 第十章 之Pig
		概述: Pig的安装很简单,注意一下几点: 1.设置系统环境变量: export PIG_HOME=.../pig-x.y.z export PATH=$PATH:$PIG_HOME/bin 设置完成 ... 
- JavaScript高级程序设计(第三版)第四章 变量,作用域和内存问题
		JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型值和引用类型值具有以下特点: 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中: 从一个变量向另一个变量复制 ... 
- Hadoop – The Definitive Guide Examples,,IntelliJ
		IntelliJ Project for Building Hadoop – The Definitive Guide Examples http://vichargrave.com/intellij ... 
- 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
		定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ... 
- 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算
		<利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ... 
- 重读《学习JavaScript数据结构与算法-第三版》-第2章 ECMAScript与TypeScript概述
		定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据 ... 
随机推荐
- 02 workerman之GatewayWorker简单的demo 实现两端发送消息
			前端代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ... 
- SpringMVC_HelloWorld_01
			通过配置文件的方式实现一个简单的HelloWorld. 源码 一.新建项目 1.新建动态web项目 2.命名工程springmvc-01 3.勾选"Generate web.xml depl ... 
- Android 常用动画之RotateAnimation
			前两天接到任务做一个UI,有用到动画,于是抽空看了下Android动画相关知识. Android Animation共有四大类型,分别是 Alpha 透明度动画 Scale 大小伸 ... 
- Android BLE设备蓝牙通信框架BluetoothKit
			BluetoothKit是一款功能强大的Android蓝牙通信框架,支持低功耗蓝牙设备的连接通信.蓝牙广播扫描及Beacon解析. 关于该项目的详细文档请关注:https://github.com/d ... 
- express-partials使用方法
			1.安装express-partials 方法一:运行cmd用npm install express-partials 方法二:在package.json里面的dependencies添加" ... 
- yum安装tomcat
			http://www.cnblogs.com/liaolongjun/p/5638740.html http://www.awspack.com/os/linux/yum-install-tomcat ... 
- 《剑指offer》二叉树镜像
			剑指offer简单题,但是能一下写对也需要小心考虑细节. 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / / 5 7 9 11 ... 
- Asp.Net Core WebAPI入门整理(二)简单示例
			一.Core WebAPI中的序列化 使用的是Newtonsoft.Json,自定义全局配置处理: // This method gets called by the runtime. Use thi ... 
- linux通过wget直接下载jdk
			下载语句: tar包下载 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-se ... 
- linux cudnn安装
			cudnn-8.0-linux-x64-v5.1链接:http://pan.baidu.com/s/1c1JuMty 密码:v0g9 #以CuDNN的v5.1版本,Cuda 8.0为例 sudo ta ... 
