这篇博客我们来体验通过Java API来访问HDFS。
Windows上配置环境变量
解压Hadoop,然后把Hadoop的根目录配置到HADOOP_HOME环境变量里面
然后把HADOOP_HOME/lib和HADOOP_HOME/bin配置到path里面。
替换bin目录
要把官网下载的Hadoop目录下面的bin目录替换成Windows下编译的Hadoop的bin目录。开始时我没做这一步,上传文件成功了。但是下载文件的时候就不行了。
我已经上传了自己编译好的hadoop-2.7.3的bin目录,可以从 http://download.youkuaiyun.com/detail/mrbcy/9758112下载。
我的环境是Win10 64位。如果跟我的不一样可以参考我的另一篇博客http://blog.youkuaiyun.com/mrbcy/article/details/55806809 自已编译即可。
jar包依赖
需要添加的jar包列表如下:
- hadoop/share/hadoop/common/hadoop-common-2.7.3.jar
- hadoop/share/hadoop/common/lib/*.jar
- hadoop/share/hadoop/hdfs/hadoop-hdfs-2.7.3.jar
- hadoop/share/hadoop/hdfs/lib/*.jar
也可以用maven,依赖列表稍后补上。
上传文件
public class HdfsClientDemo {
private FileSystem fs;
@Before
public void init() throws Exception{
Configuration conf = new Configuration();
fs = FileSystem.get(new URI("hdfs://amaster:9000"), conf, "root");
}
@Test
public void testUpload() throws Exception{
fs.copyFromLocalFile(new Path("c:/access.log"), new Path("/access-copy.log"));
fs.close();
}
}
运行后,上传文件成功。
下载文件
@Test
public void testDownload() throws Exception {
fs.copyToLocalFile(false, new Path("/access-copy.log"), new Path("d:/"), false);
fs.close();
}
报错了。
网上查了一下,说是环境变量没有配。
配置好以后还是报那个错误。看来是必须替换bin了
查看conf
@Test
public void testConf(){
Iterator<Entry<String, String>> it = conf.iterator();
while(it.hasNext()){
Entry<String, String> ent = it.next();
System.out.println(ent.getKey() + " : " + ent.getValue());
}
}
创建文件夹
@Test
public void testMkdir() throws Exception {
boolean result = fs.mkdirs(new Path("/testmkdir/aaa/bbb"));
System.out.println(result);
}
删除
@Test
public void testDelete() throws Exception {
// 递归删除
boolean result = fs.delete(new Path("/testmkdir/aaa/"),true);
System.out.println(result);
}
查看目录下的信息
@Test
public void testLs() throws Exception {
RemoteIterator<LocatedFileStatus> lt = fs.listFiles(new Path("/"), true);
while(lt.hasNext()){
LocatedFileStatus fileStatus = lt.next();
System.out.println("name:" + fileStatus.getPath().getName()
+ " owner:" + fileStatus.getOwner());
}
}
这里返回一个迭代器还是很讲究的。如果返回一个List、Map之类的东西,很可能由于数据量过大,造成客户端崩溃,而且对网络的传输也是一个很大的挑战。