我正在我的机器上使用伪分发模式设置,并在我的 eclipse IDE 中创建以下程序:
该程序只是将输入文件合并到 HDFS 中的单个文件中。
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutMerge {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
FileSystem local = FileSystem.getLocal(conf);
Path inputDir = new Path("/home/temp/input");
Path hdfsFile = new Path("MyMergeFile.txt");
try {
FileStatus[] inputFiles = local.listStatus(inputDir);
FSDataOutputStream out = hdfs.create(hdfsFile);
for (int i = 0; i < inputFiles.length; i++) {
System.out.println(inputFiles[i].getPath().getName());
FSDataInputStream in =
local.open(inputFiles[i].getPath());
byte buffer[] = new byte[256];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
in.close();
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
程序运行成功,但MyMergeFile.txt
在哪里生成?
我尝试使用命令 ./hadoop fs -lsr /
进行检查,但此命令的输出中不存在该文件。
更新:
尝试签入 HDFS 时,我收到错误消息:
./hadoop fs -ls hdfs://localhost:50070/MyMergeFile.txt
ls: Call to localhost/127.0.0.8:50070 failed on local exception: java.io.EOFException
./hadoop fs -ls hdfs://localhost:50030/MyMergeFile.txt
ls: Call to localhost/127.0.0.8:50030 failed on local exception: java.io.EOFException
FileSystem hdfs = FileSystem.get(conf);
此行不返回 HDFS,而是返回配置的 FS。这可能是HDFS。但是你说你从 Eclipse 运行,你似乎没有在 50070 上运行 NM。我怀疑您不是在伪分布式模式下运行,而是在独立模式下运行。您的 FS 可能是锚定在 /tmp
中的本地原始文件系统。
如果在伪分布式模式下运行,您会记住配置 NM 名称目录 (dfs.namenode.name.dir
) 和 DN 数据目录 (dfs.datanode.data.dir
) 的步骤。