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

基本配置:两台服务器作为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再运行,否则提示找不到类。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值