我在从 Virtualbox Ubuntu 上工作的 hadoop 集群的主机 (windows) 获取文件时遇到问题。
我从主机 ( http://192.168.56.105:8088/cluster ) 看到集群,java 脚本看到 hdfs 上的文件夹结构,但是当我尝试读取文件时,我得到这个错误:
org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1570018429-127.0.0.1-1484660807169:blk_1073742497_1673 file=/Item/part-r-00000
当我在集群 vmbox ubuntu 上运行相同的脚本时,我得到了文件并得到了纠正。
可能的问题是 namenode 尝试在不同的地方搜索数据(_1673?),当 ip 或用户不同时 - 但我找不到这个问题的正确配置。
感谢您的建议。
Linux 用户:wukkie
这是脚本:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.PrivilegedExceptionAction;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
public class InsertReommendationToDB {
private static Configuration getConfiguration(){
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.56.105:54310/" );
conf.set("hadoop.job.ugi", "wukkie");
return conf;
}
public static void main(String args[]){
try {
UserGroupInformation ugi = UserGroupInformation.createProxyUser("wukkie", UserGroupInformation.getLoginUser());
ugi.doAs(new PrivilegedExceptionAction<Void>() {
Path filepath = new Path("/Item/part-r-00000");
public Void run() throws Exception {
FileSystem fs = filepath.getFileSystem( getConfiguration() );
FSDataInputStream inputStream = fs.open(filepath);
String line;
line = inputStream.readLine();
while(line != null){
System.out.println(line);
line = inputStream.readLine();
}
return null;
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最佳答案
我找到了原因和解决方法。
Hadoop 以这种方式工作:
- 应用程序向名称节点询问文件
- Namenode 发送有关存储请求文件的数据节点的信息 - 并获取数据节点的地址。
- 应用程序在收到的关于文件的 url 上询问数据节点并获取文件流。
Virtualbox 和主机架构问题。
Virtualbox hadoop 在地址/localhost:50070/上启动数据节点。当主机应用程序向名称节点询问文件时,获取数据节点“localhost:50070”的本地地址。这导致应用程序尝试从看不见的地址获取文件。
解决方案
1) 我们需要获取 virtualbox 机器的地址(我在 virtualbox 连接设置中使用了 host-only addapter)。 配置 |查询地址
我得到地址192.168.56.104
2) 我们现在可以在主机 (windows) 上设置反向代理。以管理员权限启动cmd并放入
netsh interface portproxy add v4tov4 listenport=50070 listenaddress=localhost connectport=50070 connectaddress=192.168.56.104
netsh interface portproxy add v4tov4 listenport=50020 listenaddress=localhost connectport=50020 connectaddress=192.168.56.104
netsh interface portproxy add v4tov4 listenport=50090 listenaddress=localhost connectport=50090 connectaddress=192.168.56.104
netsh interface portproxy add v4tov4 listenport=50010 listenaddress=localhost connectport=50010 connectaddress=192.168.56.104
现在,当主机应用程序获取数据节点的 localhost:50010 地址时,代理到客户端机器。
关于linux - 访问 Hadoop Virtualbox 集群上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42355610/