基本配置:两台服务器作为datanode,跟一台台式机作为namenode,均为centos系统,不过只有一台服务器为64位系统,其他为32位。在win7下通过secureCRT远程登录namenode。
使用samba设置共享文件夹,参考:
http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.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再运行,否则提示找不到类。