您的位置:首页 > 编程语言 > Java开发

hadoop2.2.0运行权威指南URLCat.java程序的步骤和结论

2014-07-20 17:12 573 查看
基本配置:两台服务器作为datanode,跟一台台式机作为namenode,均为centos系统,不过只有一台服务器为64位系统,其他为32位。在win7下通过secureCRT远程登录namenode。

使用samba设置共享文件夹,参考:

/article/4778196.html

在hadoop2.2.0中运行程序,这里的程序选择hadoop权威指南第三章中的URLCat.java程序:

// cc URLCat Displays files from a Hadoop filesystem on standard output using a URLStreamHandler
import java.io.InputStream;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

// vv URLCat
public class URLCat {

static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}

public static void main(String[] args) throws Exception {
InputStream in = null;
try {
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
// ^^ URLCat


1. 通过javac运行程序命令,注意添加classpath:

javac -classpath /home/hadoop-2.2.0/share/common/hadoop-common-2.2.0.jar URLCat.java


生成URLCat.class文件。

2. 再通过jar命令生成jar包URLCat.jar:

jar cvf ./URLCat.jar URLCat.class


3. 再将jar包文件移动到hadoop-common-2.2.0.jar所在的目录:

mv URLCat.jar /home/hadoop-2.2.0/share/hadoop/common


使用hadoop命令运行,注意hadoop运行时的参数,指定jar包,指定类名,指定目标问题test2.txt:

/home/hadoop-2.2.0/bin/hadoop jar URLCat.jar URLCat hdfs://master:9000/user/whdx/test2.txt

显示hello hadoop证明成功。

--------------------------------------------------------------------------------------------------------------------------------

此外,实验证明同样可以将hadoop命令类似于java命令使用,在包含有URLCat.java的文件夹下运行:

/home/hadoop-2.2.0/bin/hadoop URLCat hdfs://master:9000/user/whdx/test2.txt


同样运行成功,不过使用这种方式要注意程序中的包依赖关系。

--------------------------------------------------------------------------------------------------------------------------------

当然更简单的方法是下载hadoop权威指南的源代码,使用maven命令打包即可:

mvn package -DskipTests -Dhadoop.distro=apache-2 -Dhadoop.version=2.2.0
得到打包的ch03-3.0.jar文件,然后就可以运行了:



#/bin/hadoop jar ch03-3.0.jar URLCat hdfs://master:9000/user/whdx/test1.txt

显示hello hadoop证明运行成功。

权威指南提到有几种不同的调用可以用来实现URLCat功能,如下:

/** 将 hdfs://10.8.0.1:9000/user/whdx/test1.txt 中的内容即helloworld输出到终端即System.out
* 分别采用3种不同的方式
* 方式一:采用FsUrlStreamHandlerFactory
* 方式二:采用FileSystem
* 方式三:采用FSDataInputStream,并测试seek方法
*
* 结论:在Eclipse远程连接Linux运行URLCat.java程序和在Linux下直接运行程序,速度差别很大
* 注意:Eclipse中的URLCatPro程序需要去除包名再编译成class文件再移动到Linux下打包成jar文件,使用hadoop运行,
* 否则会出错,找不到类
*/

//package hdg03;

import java.io.InputStream;
import java.net.URI;
import java.net.URL;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

public class URLCatPro {

static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}

public static void main (String[] args) throws Exception {

// method 1 , using FsUrlStreamHandlerFactory
InputStream in = null;
try {
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in, System.out,4096, false);
}finally {
IOUtils.closeStream(in);
}

// method 2 , using FileSystem
String uri1 = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri1), conf);
InputStream in1 = null;
try {
in1 = fs.open(new Path(uri1));
IOUtils.copyBytes(in1, System.out, 4096, false);
} finally {
IOUtils.closeStream(in1);
}

// method 3, using FSDataInputStream
FSDataInputStream in2 = null;
try {
in2 = fs.open(new Path(uri1));
IOUtils.copyBytes(in2, System.out, 4096, false);
in2.seek(0);
IOUtils.copyBytes(in2, System.out, 4096, false);
} finally {
IOUtils.closeStream(in2);
}

}
}


上面的程序运行时,会输出4行hello world。实验表明在使用Eclipse远程连接Linux下的hadoop时,尽管方面但是速度非常慢,相比之下,在Linux下直接运行程序速度正常。此外要注意,将Eclipse中的程序拷贝到Linux下运行时,要去掉包名重新编译成class文件,之后到Linux下打成jar再运行,否则提示找不到类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: