客户端挂载表
core-site.xml配置 <xi:includehref=“cmt.xml"/> <property> <name>fs.defaultFS</name> <value>viewfs://nsX</value> <description>整个Federation集群对外提供服务的NS逻辑名称, 注意,这里的协议不再是hdfs,而是新引入的viewfs 这个逻辑名称会在下面的挂载表中用到</description> </property> *core-site.xml配置 <property> <name>fs.viewfs.mounttable.default.link./cluster1</name> <value>hdfs://crxy1:9000/</value> </property> <property> <name>fs.viewfs.mounttable.default.link./cluster3</name> <value>hdfs://crxy3:9000</value> </property>
ViewFileSystemfsView = (ViewFileSystem) ViewFileSystem.get(conf); MountPoint[]m = fsView.getMountPoints(); for(MountPoint m1 : m) System.out.println( m1.getSrc() ); // 直接使用/share/test.txt创建文件 // 如果按照之前的配置,客户端会自动根据挂载表找到是ns1 // 然后再通过failover proxy类知道nn1是Active NN并与其通信 Pathp = new Path("/share/test.txt"); FSDataOutputStreamfos = fsView.create(p);
自己实现放入回收站功能
*配置:在每个节点(不仅仅是主节点)上添加配置core-site.xml,增加如下内容 <property> <name>fs.trash.interval</name> <value>1440</value> </property>
public static boolean rm(FileSystem fs, Path path, boolean recursive, boolean skipTrash) throws IOException { if (!skipTrash) { Trash trashTmp = new Trash(fs, conf); if (trashTmp.moveToTrash(path)) { log.info("Moved to trash: " + path); return true; } } boolean ret = fs.delete(path, recursive); if (ret) log.info("rm: " + path); return ret; }
集群间复制
distcp一般用于在两个HDFS集群中传输数据。如果集群在Hadoop的同一版本上运行,就适合使用hdfs方案
hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar注意,需要在URI源中指定名称节点的Web端口。这是由dfs.http.address的属性决定的,默认值为50070