Hadoop HDFS 编程

引自http://blog.csdn.net/lmc_wy/article/details/6060746

Hadoop HDFS 编程

2010-12-07 15:11 2102人阅读 评论(0) 收藏 举报

HDFS是一个分布式文件系统,然而对于程序员来说,HDFS就是一个普通文件系统,Hadoop进行的底层封装,程序员按照相应的API来对HDFS上的文件操作,和对本地磁盘文件操作没有太多区别。但是最初接触时可能还是会碰到这样那样的问题。

例如:获取FileSystem实例时会出现

java.lang.NullPointerException

atorg.apache.hadoop.conf.Configuration.get(Configuration.java:382)

atorg.apache.hadoop.conf.Configuration.getBoolean(Configuration.java:570)

atorg.apache.hadoop.fs.FileSystem.get(FileSystem.java:192)

athadoop.test.URLCat.copyFileToAnotherFile(URLCat.java:38)//这个是我写的一个方法,报错了

    at hadoop.test.URLCat.main(URLCat.java:83)

代码:

package hadoop.test;

importjava.io.BufferedInputStream;

importjava.io.FileInputStream;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.net.MalformedURLException;

importjava.net.URI;

importjava.net.URL;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.conf.Configured;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.FsUrlStreamHandlerFactory;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.hdfs.DistributedFileSystem;

importorg.apache.hadoop.io.IOUtils;

importorg.apache.hadoop.util.Progressable;

publicclassURLCatextendsConfigured{

static{

Configuration.addDefaultResource("hdfs-default.xml");

Configuration.addDefaultResource("hdfs-site.xml");

Configuration.addDefaultResource("mapred-default.xml");

Configuration.addDefaultResource("mapred-site.xml");

    } ×/没有这个static块时就会报上面对错误

publicvoidcopyFileToAnotherFile(String[]args)

{

InputStreamin=null;

OutputStreamout=null;

try{

StringsourceFile=args[0];

StringtargetFile=args[1];

in=newBufferedInputStream(newFileInputStream(sourceFile));

Configurationconf=newConfiguration();

System.out.println(conf);

System.out.println(URI.create(targetFile)==null);

System.out.println(conf==null);

System.out.println(FileSystem.get(URI.create(targetFile),conf)==null);

FileSystemfs=DistributedFileSystem.get(URI.create(targetFile),conf);

System.out.println(fs);

out=fs.create(newPath(targetFile),newProgressable(){

publicvoidprogress(){System.out.print(".");}

});

IOUtils.copyBytes(in,out,4096,true);

}catch(Exceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}finally

{

IOUtils.closeStream(in);

IOUtils.closeStream(out);

}

}

static{

URL.setURLStreamHandlerFactory(newFsUrlStreamHandlerFactory());

}

publicstaticvoiddisplayFile(String[]args)

{

InputStreamin=null;

try{

in=newURL(args[0]).openStream();

IOUtils.copyBytes(in,System.out,4096,false);

}catch(MalformedURLExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}finally

{

IOUtils.closeStream(in);

}

}

/**

*@paramargs

*/

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

newURLCat().copyFileToAnotherFile(args);

//URLCat.displayFile(args);

//

}

}

原因:Configuration似乎只会加载基本的两个文件,所以需要将其它配置文件手动导入

 Configuration类:   defaultResources.add("hadoop-default.xml");                                finalResources.add("hadoop-site.xml");

下面把整个代码到执行过程叙述一下,希望对刚接触hadoop编程的人有帮助:

1.需要配置好java环境主要是JAVA_HOME和CLASS_PATH,两个必须要设置

export JAVA_HOME=/usr/lib/jvm/java-6-sun

exportPATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib

2在本地编写代码,当然可以用Eclipse工具

3设置HADOOP_CLASSPATH

 HADOOP_CLASSPATH指向class文件的根目录,例如包hadoop.test的根目录上/home/hadoop/EclipseWorkspace/TestProject/bin

4执行命令hadoop hadoop.test.URLCat /home/hadoop/Documents/test.txt hdfs://192.186.54.1:8020/user/hadoop/test.txt

又出错了:java.lang.IllegalArgumentException: Wrong FS: hdfs://192.186.54.1:8020/user/hadoop/test.txt, expected: hdfs://hadoop1

atorg.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:310)

atorg.apache.hadoop.hdfs.DistributedFileSystem.checkPath(DistributedFileSystem.java:99)

atorg.apache.hadoop.hdfs.DistributedFileSystem.getPathName(DistributedFileSystem.java:155)

atorg.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:195)

atorg.apache.hadoop.fs.FileSystem.create(FileSystem.java:484)

atorg.apache.hadoop.fs.FileSystem.create(FileSystem.java:384)

athadoop.test.URLCat.copyFileToAnotherFile(URLCat.java:46)

athadoop.test.URLCat.main(URLCat.java:86)

 原因,命令hdfs不能说IP,需要hostname,执行以下命令

 hadoop hadoop.test.URLCat /home/hadoop/Documents/test.txt hdfs://hadoop1:8020/user/hadoop/test.txt

 一切OK。

我的配置文件是ip,而不是hostname,因为没有DNS server帮助解析,但是执行命令仍然得用hostname。

综上:2个地方需要注意。Configuration和hdfs://hostname:port/user/pathtofile/file

相关推荐