介绍如何在 Windows 环境中, 将保存在 HDFS 上的文件导出到本机上
数据导入到 HDFS 后
当然也要有方法将数据从 HDFS 导出到本机系统上
在 HADOOP JAVA API 所提供的 FileSystem 类
就提供 copyToLocalFile 函数将文件复制回本机文件系统
理论上这是可以轻易的做到这件事情
但实际使用时, 才发现一个问题
当客户端用的是 windows 而不是 linux
程序也不是在 cluster 主机上执行时
此时调用 copyToLocalFile 函数
Hadoop 会丢出一个例外:
Cannot run program "chmod": CreateProcess error=2, ?t?Χ??????
解决方法是在电脑上安装 cygwin
这样 hadoop 就可以调用到 chmod 命令
但如果要求所有使用者一定要在 window 上安装 cygwin 这样也挺怪的
所以想到了另一个方法
就是直接用 file stream 方式
将 HDFS 数据读出后, 再写回本地端的文件系统
这样就可以解决数据导出的问题
/*
将 HDFS 上文件, 导出至本机磁盘上
*/
public void exportFile(Path hdfsSource, String targetPath){
Configuration conf = new Configuration();
conf.set("hadoop.job.ugi","hadoop,supergroup");
String uri="hdfs://cloud-a:9000";
try{
FileSystem fs = FileSystem.get(URI.create(uri),conf);
FSDataInputStream in = fs.open(hdfsSource);
FileOutputStream fos = new FileOutputStream(targetPath);
int bytesRead;
byte[] buffer = new byte[4096];
while ((bytesRead = in.read(buffer)) > 0) {
fos.write(buffer, 0, bytesRead);
}
in.close();
fos.close();
//使用 copyToLocalFile 会丢出 Cannot run program "chmod"例外
//fs.copyToLocalFile(hdfsSource, new Path(targetPath));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}