set复制

0s7z1bwu  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(554)

我试着用hadoopapi加载文件作为实验。
我想将复制设置为最小值,因为这是用于实验的。我第一次用这个 FileSystem.setReplication() :

Configuration config = new Configuration();
config.set("fs.defaultFS","hdfs://192.168.248.166:8020");
FileSystem dfs2 = FileSystem.get(config);
Path src2 = new Path("C:\\Users\\abc\\Desktop\\testfile.txt");
Path dst2 = new Path(dfs2.getWorkingDirectory()+"/tempdir");
dfs2.copyFromLocalFile(src2, dst2);
dfs2.setReplication(dst2, (short)1);  /**setting replication**/

副本显示为1,但在3个数据节点上可用。
当我试着 Configuration.set() :

Configuration config = new Configuration();
config.set("fs.defaultFS","hdfs://192.168.248.166:8020");
config.set("dfs.replication", "1");  /**setting replication**/
FileSystem dfs2 = FileSystem.get(config);
Path src2 = new Path("C:\\Users\\abc\\Desktop\\testfile.txt");
Path dst2 = new Path(dfs2.getWorkingDirectory()+"/tempdir");

这提供了所需的结果(1个数据节点上有1个副本可用)
为什么同一件事有两个api?这两者有什么区别?

mhd8tkvw

mhd8tkvw1#

不同的是 Filesystem 的setreplication()设置hdfs上现有文件的复制。在您的情况下,首先复制本地文件 testFile.txt 到hdfs,使用默认复制因子(3),然后将此文件的复制因子更改为1。执行此命令后,需要一段时间才能删除过度复制的块((来源)
另一方面,当你使用 config.set("dfs.replication", "1"); 命令来设置复制,您可以在之后复制本地文件,这样它的块只复制一次,从第一次开始。
换句话说,我相信(但我可能错了)两个命令都有相同的最终结果,但是您必须等待一点,直到第一个命令被执行。

相关问题