因此,在经过36个小时的实验之后,我终于设法启动并运行了一个群集,但现在我很困惑如何使用Java将文件写入其中?一个教程说应该使用这个程序,但我根本不理解它并且它也不起作用。
public class FileWriteToHDFS {
public static void main(String[] args) throws Exception {
//Source file in the local file system
String localSrc = args[0];
//Destination file in HDFS
String dst = args[1];
//Input stream for the file in local file system to be written to HDFS
InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
//Get configuration of Hadoop system
Configuration conf = new Configuration();
System.out.println("Connecting to -- "+conf.get("fs.defaultFS"));
//Destination file in HDFS
FileSystem fs = FileSystem.get(URI.create(dst), conf);
OutputStream out = fs.create(new Path(dst));
//Copy file from local to HDFS
IOUtils.copyBytes(in, out, 4096, true);
System.out.println(dst + " copied to HDFS");
}
}
我的困惑是这段代码如何识别我的群集的细节?它将如何知道masternode的位置以及slavenodes的位置?
此外,当我运行此代码并在源中提供一些本地文件并将目标留空/或提供文件名时,只有程序将文件写回我的本地存储而不是我定义为我的名称节点的存储空间的位置和datanodes。我应该手动提供此路径吗?这是如何运作的?请建议一些可以帮助我更好地理解它的博客,或者可以使用最小的例子。
答案 0 :(得分:1)
首先,您需要在类路径中添加一些Hadoop库。没有那些,不,那个代码将不起作用。
它如何知道masternode的位置以及slavenodes的位置?
来自new Configuration();
和后续conf.get("fs.defaultFS")
。
它读取HADOOP_CONF_DIR
环境变量的core-site.xml并返回namenode的地址。客户端只需要与namenode通信以接收数据节点的位置,从中写入文件块
程序将文件写回我的本地存储
目前尚不清楚您配置文件系统的位置,但默认值为file://
,即本地磁盘。您可以在core-site.xml中更改此设置。如果您遵循Hadoop文档,则伪分布式群集设置会提及此
当简单地hdfs dfs -put
做同样的事情时,为什么你需要自己的Java代码也不是很清楚