| package com.toto.hadooptest; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.junit.Before; import org.junit.Test; public class HdfsClient { FileSystem fs = null; @Before public void init() throws Exception { // 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI // 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址 // new Configuration();的时候,它就会去加载jar包中的hdfs-default.xml // 然后再加载classpath下的hdfs-site.xml Configuration conf = new Configuration(); conf.set("df.defaultFS", "hdfs://hadoop:9000"); /** * 参数优先级:1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置 */ conf.set("dfs.replication", "3"); // 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例 // fs = FileSystem.get(conf); //如果这样去获取,那conf里面就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份识别已经是hadoop用户 //注意,最后的toto表示的是hadoop集群安装的Linux用户 fs = FileSystem.get(new URI("hdfs://hadoop:9000"),conf,"toto"); } /** * \brief hdfs上传文件 * * 执行完成之后,进入Linux,执行一下命令,发现会出现以下列表 * [toto@hadoop software]$ hadoop fs -ls /toto2 Found 1 items -rw-r--r-- 3 toto supergroup 2286088 2017-05-30 13:25 /toto2/ik-analyzer-solr5-master.zip */ @Test public void testAddFileToHdfs() { try { //要上传的所在的本地路径 Path src = new Path("d:/ik-analyzer-solr5-master.zip"); //要上传的hdfs的目标路径 Path dst = new Path("/toto2"); fs.copyFromLocalFile(src, dst); fs.close(); } catch (Exception e) { e.printStackTrace(); } } /** * \brief 从hdfs中复制文件到本地文件系统 * @attention执行完成之后,进入E:/learnTempFolder这个文件夹,发现在改文件夹下已经有了自己拷贝下来的文件了 * @author toto * @date 2017年5月30日 * @note begin modify by 涂作权 2017年5月30日 原始创建 */ @Test public void testDownLoadFileToLocal() { try { fs.copyToLocalFile(new Path("/toto2/findbugs-1.3.9"), new Path("E:/learnTempFolder")); fs.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 创建目录,删除目录,重命名 * 执行之前hadoop的文件系统的目录结构如下: * [toto@hadoop sbin]$ hadoop fs -ls / Found 7 items drwxr-xr-x - toto supergroup 0 2017-05-30 14:06 /aaa drwxr-xr-x - toto supergroup 0 2017-05-29 14:01 /findbugs-1.3.9 drwxr-xr-x - toto supergroup 0 2017-05-29 03:23 /hive drwx------ - toto supergroup 0 2017-05-29 14:47 /tmp drwxr-xr-x - toto supergroup 0 2017-05-29 23:59 /toto drwxr-xr-x - toto supergroup 0 2017-05-30 13:25 /toto2 drwxr-xr-x - toto supergroup 0 2017-05-30 00:18 /user [toto@hadoop sbin]$ 执行之后的效果: [toto@hadoop sbin]$ hadoop fs -ls / Found 7 items drwxr-xr-x - toto supergroup 0 2017-05-30 14:11 /a2 drwxr-xr-x - toto supergroup 0 2017-05-29 14:01 /findbugs-1.3.9 drwxr-xr-x - toto supergroup 0 2017-05-29 03:23 /hive drwx------ - toto supergroup 0 2017-05-29 14:47 /tmp drwxr-xr-x - toto supergroup 0 2017-05-29 23:59 /toto drwxr-xr-x - toto supergroup 0 2017-05-30 13:25 /toto2 drwxr-xr-x - toto supergroup 0 2017-05-30 00:18 /user 总结: 1、发现/aaa文件夹被删除了 2、发现出现了/a2,但是最开始没有,说明是创建的a1,然后又被改成的a2 */ @Test public void testMkdirDeleteAndRename() { try { //创建目录 fs.mkdirs(new Path("/a1/b1/c1")); //删除文件夹,如果是非空文件夹,参数2必须给值true fs.delete(new Path("/aaa"),true); //重命名文件或文件夹 fs.rename(new Path("/a1"), new Path("/a2")); } catch(Exception e) { e.printStackTrace(); } } /** * \brief 查看目录信息,只显示文件 */ @Test public void testListFiles() { try { //思考:为什么返回迭代器,而不是List之类的容器,这里的只有调用hasNext()的时候,才会返回实际的数据信息 RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true); while(listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); System.out.println(fileStatus.getPath().getName()); System.out.println(fileStatus.getBlockSize()); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getLen()); BlockLocation[] blockLocations = fileStatus.getBlockLocations(); for(BlockLocation b1 : blockLocations) { System.out.println("block-length:" + b1.getLength() + "--" + "block-offset:" + b1.getOffset()); String[] hosts = b1.getHosts(); for(String host : hosts) { System.out.println(host); } } System.out.println("-----------------------------------"); } } catch (Exception e) { e.printStackTrace(); } } /** * 查看文件及文件夹信息 * * 显示的内容如下: * d-- a2 * d-- findbugs-1.3.9 * d-- hive * d-- tmp * d-- toto * d-- toto2 * d-- user */ @Test public void testListAll() { try { FileStatus[] listStatus = fs.listStatus(new Path("/")); String flag = "d-- "; for(FileStatus fstatus : listStatus) { if (fstatus.isFile()) flag = "f-- "; System.out.println(flag + fstatus.getPath().getName()); } } catch (Exception e) { e.printStackTrace(); } } } |