本文用于复习《Hadoop权威指南》第四章第一部分内容
代码来自于书中,仅有少部分修改,主要是为了回忆起来方便
书中终端命令为“$ echo “Hello wyh” | hadoop StreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip ”但实际难以实现(这点暂且怀疑),本文主要处理问题为如何实现目标,以及实现过程中出现一些问题的解决方法
- StreamCompressor一例主要是为了方便我们学习CompressionCodec的两个函数,即是说用OutputStream写入一个未压缩的数据,然后用CompressionOutputStream进行压缩输出。
反之则有CompressionInputStream解压缩。
package com.alice.wang;
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;
// 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();
}
}
- 代码如上,按照书上的方法在hadoop目录下,进入bin文件,运行如下命令出现错误,无法加载主类!在网上查阅后,得到一个新的方法。
localhost:bin alice_wang$ echo "Hello wyh" | hadoop StreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip
错误: 找不到或无法加载主类 StreamCompressor
- 用jar包来实现以上命令,此时我的StreamCompressor确实是在包org.apache.hadoop.examples里的,跟最开始的代码有点不同,那么此时问题就来了,为什么会有ClassNotFoundException??
localhost:bin alice_wang$ echo "Hello world" | hadoop jar StreamCompressor.jar org/apache/hadoop/examples/StreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip
Exception in thread "main" java.lang.ClassNotFoundException: org.apache.hadoop.examples.StreamCompressor
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.util.RunJar.run(RunJar.java:214)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
gunzip: (stdin): unexpected end of file
看了网上很多答案都觉得和我遇到的问题相差挺远,后来经过一段时间查看,终于发现打开jar包,里面直接就是StreamCompressor.class。
这里的错误在于,我声明的package是org.apache.hadoop.examples,那么我在运用的时候就必须要用org.apache.hadoop.examples.StreamCompressor,但是我的jar包里面不是org文件夹,而是直接就是class文件,即是说我在生成jar包的时候,可能点击成了用java文件生成jar包,而不是对整个项目生成jar包。
于是我重新开了一个hadoop项目,新建包为com.alice.wang,在对项目进行打包,此时打开包就会有com文件夹,com文件夹里有alice文件夹,alice文件夹里有wang文件夹,然后就是class文件。运行结果如下,成功运行出“Hello wyh”
localhost:bin alice_wang$ echo "Hello wyh" | hadoop jar StreamCompressor.jar com.alice.wang.StreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip
17/02/28 08:50:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Hello wyh