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数据 ...
随机推荐
- jmeter --使用put方法上传文件
今天来记录下put上传文件遇到的坑吧!折腾死我了, 刚开始的时候用的jmeter3.0,各种尝试,发现始终告诉我文件内容为空<actual file content,not shown here ...
- 二、vue中组件的使用
1.组件拆分 1.组件实质上也是一个vue实例,因此组件中也可以使用vue的对象属性,反过来每一个vue实例也是一个vue组件(注:1.唯一不同的是el是根实例的特有选项,2.组件中的data必须是一 ...
- MongoDB aggregate 运用篇(转)
http://www.cnblogs.com/qq78292959/p/4440679.html 最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregat ...
- .NetCore Linux环境下安装InfluxDB以及配置设置
Linux下安装 确定需要安装的版本,我的linux是干净的,所以我需要先安装wget yum -y install wget 下载安装 wget https://dl.influxdata.com/ ...
- Java ArrayList中对象的排序 (Comparable VS Comparator)
我们通常使用Collections.sort()方法来对一个简单的数据列表排序.但是当ArrayList是由自定义对象组成的,就需要使用comparable或者comparator接口了.在使用这两者 ...
- Java第三阶段学习(十四、JSP动态页面、EL表达式、JSTL标签库)
一.JSP技术 1.jsp脚本和注释 jap脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部,比如写在doget.dopost 内的代码 2) ...
- 【AtCoder】ARC086
C - Not so Diverse 题解 选出现次数K多的出来,剩下的都删除即可 代码 #include <bits/stdc++.h> #define fi first #define ...
- NAT虚拟网络配置
NAT虚拟网络配置(Linux能上网) 1.先设置虚拟机的虚拟网络,设置里面的子网ip和网关ip地址: 有两种方式:①setup命令(不选DHCP,因为它是动态分配IP地址的) ②vi /etc/s ...
- StringBuilder的实现与技巧ZZ
在上一篇进一步了解String 中,发现了string的不便之处,而string的替代解决方案就是StringBuilder的使用..它的使用也很简单System.Text.StringBuild ...
- 模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra
广搜 bfs //bfs #include<iostream> #include<cstdio> using namespace std; ],top=,end=; ][]; ...