Hdfs Java API初探

这篇博客我们来体验通过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.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> it = conf.iterator();

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

你可能感兴趣的:(大数据框架,Hadoop)