我的问题是为什么我们需要指定一个目的地。我放入hdfs的文件不一定完全在本地机器上,所以在命令中指定dest的用途是什么。
当我通过命令谎言运行命令然后稍后执行hadoop dfs -ls时,我可以看到我的文件在hdfs中列出,但是当我使用
以编程方式创建文件时FileSystem fs = FileSystem.get(conf);
Path filenamePath = new Path("hello.txt");
fs.create(filenamePath);
然后再做hadoop dfs -ls我找不到这个文件。
在我的core-site.xml中,我有以下内容......
<!-- In: conf/core-site.xml -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/apurv/hadoop/hdfs</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
直观地说,复制文件驻留在哪里也没有意义,因为它可能足够大,可以驻留在一台机器上。
答案 0 :(得分:2)
我们聊聊谈论它,我有更多的时间向你解释这个。
如果您在代码中使用此代码段:
FileSystem fs = FileSystem.get(conf);
// stuff to create
然后重要的是conf
对象内部的内容。如果你什么都没有,那么返回的FileSystem
总是在本地。
如果你把它放在你的conf:
conf.set("fs.default.name", "hdfs://localhost:54310");
然后你应该通过该服务器&#34;上的namenode连接到你的HDFS。并且您可以写入HDFS。
如果您想让配置读取XML,那么您必须使用#addResource()
方法。
查看此处的文档: http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/conf/Configuration.html
示例用法可以是:
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/hdfs-site.xml"));
然后,所有hdfs-site.xml
映射都将出现在您的配置中。
用它玩一下,真的很直观。至少对我来说;)
答案 1 :(得分:1)
FileSystem#Create(Path)打开指向路径的流。在文件可见之前必须关闭流。
我的问题是为什么我们需要指定一个目的地。我放入hdfs的文件不一定完全在本地机器上,所以在命令中指定dest的用途是什么。
不确定您的意思,但目的地指定目标位置。