1 重读配置文件 core-site.xml 要利用 Java 客户端来存取 HDFS 上的文件, 不得不说的是配置文件 hadoop-0.20.2/conf/core-site.xml 了, 最初我就是在这里吃了大亏, 所以我死活连不 上 HDFS, 文件无法创建 读取 <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!--- global properties --> <property> <name>hadoop.tmp.dir</name> <value>/home/zhangzk/hadoop</value> <description>a base for other temporary directories.</description> </property> <!-- file system properties --> <property> <name>fs.default.name</name> <value>hdfs://linux-zzk-113:9000</value> </property> </configuration> 配置项 :fs.default.name 表示命名的 IP 地址和端口号, 缺省值是 file:///, 对于 JavaAPI 来讲, 连接 HDFS 必须使用这里的配置的 URL 地址, 对于数据节点来讲, 数据节 点通过该 URL 来访问命名节点
2 利用 JavaAPI 来访问 HDFS 的文件与目录 package com.demo.hdfs; import java.io.bufferedinputstream; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.net.uri; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.fsdatainputstream; import org.apache.hadoop.fs.fsdataoutputstream; import org.apache.hadoop.fs.filestatus; import org.apache.hadoop.fs.filesystem; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.ioutils; import org.apache.hadoop.util.progressable; /** * @author zhangzk
* */ public class FileCopyToHdfs { public static void main(string[] args) throws Exception { try { //uploadtohdfs(); //deletefromhdfs(); //getdirectoryfromhdfs(); appendtohdfs(); readfromhdfs(); catch (Exception e) { // TODO Auto-generated catch block e.printstacktrace(); finally { System.out.println("SUCCESS"); /** 上传文件到 HDFS 上去 */ private static void uploadtohdfs() throws
String localsrc = "d://qq.txt"; String dst = "hdfs://192.168.0.113:9000/user/zhangzk/qq.txt"; InputStream in = new BufferedInputStream(new FileInputStream(localSrc)); OutputStream out = fs.create(new Path(dst), new Progressable() { public void progress() { System.out.print("."); ); IOUtils.copyBytes(in, out, 4096, true); /** 从 HDFS 上读取文件 */ private static void readfromhdfs() throws String dst = "hdfs://192.168.0.113:9000/user/zhangzk/qq.txt"; FSDataInputStream hdfsinstream = fs.open(new Path(dst));
OutputStream out = new FileOutputStream("d:/qq-hdfs.txt"); byte[] iobuffer = new byte[1024]; int readlen = hdfsinstream.read(iobuffer); while(-1!= readlen){ out.write(iobuffer, 0, readlen); readlen = hdfsinstream.read(iobuffer); out.close(); hdfsinstream.close(); /** 以 append 方式将内容添加到 HDFS 上文件的末尾 ; 注意 : 文件更新, 需要在 hdfs-site.xml 中添 <property><name>dfs.append.support</name><value>true</value></pro perty>*/ private static void appendtohdfs() throws String dst = "hdfs://192.168.0.113:9000/user/zhangzk/qq.txt"; FSDataOutputStream out = fs.append(new Path(dst)); int readlen = "zhangzk add by hdfs java api".getbytes().length;
while(-1!= readlen){ out.write("zhangzk add by hdfs java api".getbytes(), 0, readlen); out.close(); /** 从 HDFS 上删除文件 */ private static void deletefromhdfs() throws String dst = "hdfs://192.168.0.113:9000/user/zhangzk/qq-bak.txt"; fs.deleteonexit(new Path(dst)); /** 遍历 HDFS 上的文件和目录 */ private static void getdirectoryfromhdfs() throws String dst = "hdfs://192.168.0.113:9000/user/zhangzk";
FileStatus filelist[] = fs.liststatus(new Path(dst)); int size = filelist.length; for(int i = 0; i < size; i++){ System.out.println("name:" + filelist[i].getpath().getname() + "\t\tsize:" + filelist[i].getlen()); 注意 : 对于 append 操作, 从 hadoop-0.21 版本开始就不支持了 本文转载自 : http://blog.csdn.net/zhangzhaokun/archive/2010/05/16/5597433.aspx