hdfs dfs 命令
常用命令:
-moveFromLocal 直接给从本地剪切了
-getmerge 把HDFS的目录下的文件先合并在下载
-balancer 手动平衡dataNode的数据
-appebdToFile 文件追加数据
-cat 查看文件内容
-chagrp 修改所属的组
-chown 修改文件权限
-du 列出文件夹下的所有文件的大小
还有好多可以列出文档查看:hdfs dfs 回车
管理员命令 hdfs dfsadmin
-report: 查看集群的基本配置信息 hdfs dfsadmin -report
-refreshNodes 刷新节点,主要用于新增或者删除界节点的时候使用
-printTopology 打印网络的拓扑结构
配额: 名称配额 hdfs dfsadmin -setQuota 3 /fileName 该文件夹下最多放3个文件
空间配额 hdfs dfsadmin -setSpaceQuota 2M /name 最多放置2M的大小
文件传输:
1 Configuration config = new Configuration(); 2 System.setProperty(" hadoop _USER_NAME","root"); 3 config.set("fs.defaultFS", "hdfs://192.168.47.131:9000"); 4 try { 5 FileSystem client = FileSystem.get(config); 6 7 FSDataOutputStream fsDataOutputStream = client.create(new Path("/ temp /0402")); 8 9 InputStream input = new FileInputStream("E:\hadoop\2.0.zip"); 10 byte[] bytes = new byte[1024]; 11 int len ; 12 while ((len = input.read(bytes)) > 0){ 13 fsDataOutputStream.write(bytes, 0, len); 14 } 15 fsDataOutputStream.flush(); 16// IOUtils.copyBytes(); 17 18 System.out.println(); 19 } catch (IOException e) { 20 e.printStackTrace(); 21 }
原理大致是:
一。上面的FileSystem.get(conf)返回的实际上是一个FileSystem的子类DistributedFileSystem,并创建代理对象 NameNode Proxies与远程NameNode建立RPC通信。阅读 源码 就可以看的出来,但是在阅读源码的时候,会有一个知识点,叫做ServiceLoader。ServiceLoader名字虽然简单,但是功能很强大,他可以动态的 或得 某一个接口的实现类,进而通过反射 实例化 这些类,就能得到某一个实现的类的对象。
二、DistributedFileSystem.create方法通过远程调用NameNode去创建一个没有bocks关联的新文件,创建前会进行各种检验,比如权限等,如果失败就跑出异常。
三、 创建完成后返回一个输出流DFSOutputStream。DFSOutputStream会协调NameNode和DataNode,客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成小块叫组成DFSpacket,放到一个队列 data queue
四、线程DataStreamer 处理队列data queue,他先询问NameNode新的block存在哪个DataNode上,然后输出到DataNode,并实现水平复制
五。 DFSOutputStream还有一个队列叫做 ack queue,他会等待datanode收到包之后的相应,当完成冗余度的复制的时候这个队列中的信息才会移除
六。传输完成,关闭输出流
下载类似
冗余度复制的话,原则是第一个副本先复制到同一个机架上 ,第二个副本复制到不同的机架上的机器,第三个和第二个在同一个机架上,再有的话就随机了,正常情况下3个足够了。
更多内容,请关注我的公众号 北风中独行的蜗牛: