(2-4)HDFS的Java接口,上传,下载,创建文件,删除文件

来源:互联网 发布:淘宝卖灵符 法律 编辑:程序博客网 时间:2024/04/18 13:58

    HDFS的Java接口

          需要使用linux的图形界面,需要登录到eclipse

       一般情况下,我们写大量数据的时候用的还是Java接口,我们使用的shell只进行一些简单的操作(删除,查看上传是否成功)

      因此,我们采用Java接口的方式来操作HDFS。【我们在Linux下开发,因此一定要使用图形界面】

      因此,学hadoop,就变成了要掌握Java基础,因此,在这里开一个番外,简要地了解一下Java的知识,语句,和执行Java的IDE

      首先,安装一个eclipse。eclipse是一款开源的,软件集成环境【IDE】 有Windows版本和Linux版本两种


       1、打开eclipse,点击文件-新建-Java 项目,输入project name:hadoop0106,点击finish

       2、管理一些依赖,导java包,文件-新建-文件夹Folser,

            输入或选择父文件夹:hadoop0106  文件夹名:lib,然后把它依赖的java包放在这里

           F:\vmware\hadoop\hadoop-2.2.0\share\hadoop\common里的3个文件+

           F:\vmware\hadoop\hadoop-2.2.0\share\hadoop\common\lib里的全部+

           F:\vmware\hadoop\hadoop-2.2.0\share\hadoop\hdfs里的3个,都复制到lib里

            然后全选,右键构建路径Build Path-添加到构建路径Add to Build Path

        3、接着写java程序

          新建-类class,指定一个    包名:cn.itcast.hadoop.hdfs    名称:HDFSDemo,选择public static void main,点击完成

               

        用户无需了解哪些底层信息,而是它给我一个工具类,只要我使用这些工具类,就能把这些细节隐藏起来。用户可以非常方便的上传下载。

        4、开始写代码

       【一定要保证你当前JDK的版本和Hadoop集群是一样的】

HDFS里有一个工具类叫:FileSystem  来自org.apache.包

在讲课的人里面,他一输入FileSystem,就能出来这个包,还能自动import这个包,我一出来就是报错

         

原因:他用了快捷键Alt+/这个键 之后只要双击那个org.apache.hadoop.fs那个,就可以自动import那个包了。

上次就卡在这里了,现在,继续开工!


            关联源码,双击FileSystem,鼠标放在上面出现一些东西,放到最下面,点击最下面的“打开声明”,可以出现关联源码界面,选择连接源代码

                     

                      

                    

                我们可以看到FileSystem 是一个抽象类(abstract),不能直接用。


           注意:上传、下载需要先打开虚拟机的hdfs


                      方法一:(建议使用第一种方式,更清晰)


                从HDFS下载到Windows

得到了实现类,就可以“玩” 了,可以来一个下载,我已经得到一个实现类“fs”了,那么先打开

打开是fs.open,我现在要打开一个路径,把它读进来。 我要从HDFS下载,需要先把HDFS文件读入到内存,然后再把数据写入到本地文件系统,因此,我们应该打开一个HDFS上的文件,

我们可以简写“/jdk1.7”  这个文件在HDFS上,

把这个文件先读进来。读进来之后,我还要new一个outputstream,写入文件系统

后面的地址是自己在Windows上的地址 c://jkd1.7


我们使用【工具类】IOUtils.copyBytes() 将in里的内容拷贝到out,buffersize=4096【一般都默认为4096】,拷贝完成之后穿true就关闭

 IOUtils(选hadoop.io).copyBytes(in, out, 4096, true)(选(in, out, buffSize, close));

完整代码如下:

package cn.itcast.hadoop.hdfs;


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HDFSDemo {
public static void main(String[] args) throws Exception, Exception {                               #记得要抛出异常,选exception
  FileSystem fs = FileSystem.get(new URI("hdfs://itcast01:9000"), new Configuration());
       InputStream in = fs.open(new Path("/jdk1.7"));                                                               #文件在hdfs根目录下存在
       OutputStream out = new FileOutputStream("c://jdk1.7");
       IOUtils.copyBytes(in, out,4096, true);
}


}



代码的作用,是在Windows系统的C盘下,把hdfs上的jdk1.7编程了windowsin

值得注意的是,前面的import至关重要,导入时候用Alt+/ 但是容易导错,导错的话是无法解析出结果的。

当运行成功时,控制台给出的这样的结果


然后在window系统中便能看到我们从网上“下载”的数据了。


        从Windows上传到HDFS

public class HDFSDemo {

FileSystem fs = null;

@Before

     public void init() throws Exception, Exception{

                 //首先创建FileSystem的实现类(工具类)

fs = FileSystem.get(new URI("hdfs://itcast01:9000"), new Configuration(),"root");   #写了root就可以上传成功了,就是伪装成root用户,有上传的权限【但这种方式不安全】

     }

@Test

public void testUpload() throws Exception{

//读取本地文件系统的文件,返回输入流

InputStream in = new FileInputStream("c://123.txt");

              //在hdfs上创建一个文件,返回输出流

OutputStream out = fs.create(new Path("/123"));                        #上传到hdfs

                  //将输入流---->输出

IOUtils.copyBytes(in, out, 4096, true);                                        #把in给out ,然后关闭

}



                 方法2 :更简单的方法【直接一步就完成了下载】

 @Test

 public void testDownload() throws Exception, Exception{

 fs.copyToLocalFile(new Path("/jdk1.7"), new Path("c://jkd111") );

 }


    删除一个HDFS上的文件:

 @Test

 public void testDel() throws Exception, Exception{

boolean flag = fs.delete(new Path("/jdk1.7"),false);                  #false不是递归删除,删除文件返回布尔值(返回TRUE就是删除成功或FALSE)

System.out.println(flag);

 }

       成功后返回TRUE

       

                 创建一个HDFS目录:

 @Test

 public void testMkdir() throws Exception, Exception{

 boolean mkdirs = fs.mkdirs(new Path("/itcast0106"));

 System.out.println(mkdirs);

 }


给文件夹里放一个文件

hadoop fs  -put  /root/install.log  /itcast0106

                   然后再删除,会报错,/itcast0106 is non empty

                  

  @Test

  public void testDel() throws Exception, Exception{

 boolean flag = fs.delete(new Path("/jdk1.7"), true);                  #true表示递归删除

 System.out.println(flag);

  }




0 1
原创粉丝点击