首页 > 编程 > Java > 正文

Hdfs Java API初探

2019-11-08 02:10:46
字体:
来源:转载
供稿:网友

这篇博客我们来体验通过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.csdn.net/detail/mrbcy/9758112下载。

我的环境是Win10 64位。如果跟我的不一样可以参考我的另一篇博客http://blog.csdn.net/mrbcy/article/details/55806809 自已编译即可。

jar包依赖

需要添加的jar包列表如下:

hadoop/share/hadoop/common/hadoop-common-2.7.3.jarhadoop/share/hadoop/common/lib/*.jarhadoop/share/hadoop/hdfs/hadoop-hdfs-2.7.3.jarhadoop/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(); }}

运行后,上传文件成功。

下载文件

@Testpublic void testDownload() throws Exception { fs.copyToLocalFile(false, new Path("/access-copy.log"), new Path("d:/"), false); fs.close();}

报错了。

网上查了一下,说是环境变量没有配。

配置好以后还是报那个错误。看来是必须替换bin了

查看conf

@Testpublic 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()); }}

创建文件夹

@Testpublic void testMkdir() throws Exception { boolean result = fs.mkdirs(new Path("/testmkdir/aaa/bbb")); System.out.println(result);}

删除

@Testpublic void testDelete() throws Exception { // 递归删除 boolean result = fs.delete(new Path("/testmkdir/aaa/"),true); System.out.println(result);}

查看目录下的信息

@Testpublic 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之类的东西,很可能由于数据量过大,造成客户端崩溃,而且对网络的传输也是一个很大的挑战。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表