我在使用虚拟机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上运行相同的脚本时,我得到文件并且正确。
当ip或用户不同时,问题是namenode尝试在不同地方搜索数据(_1673?) - 但我无法找到此问题的正确配置。
感谢您的建议。
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();
}
}
}
答案 0 :(得分:0)
我找到了理由和解决方法。
Hadoop以这种方式工作:
Virtualbox和主机架构问题。
Virtualbox hadoop在地址/ localhost:50070 /上启动datanode。当主机应用程序向namenode询问文件时,获取datanode的本地地址&#34; localhost:50070&#34;。应用程序中的结果尝试从看不见的地址获取文件。
解决方案
1)我们需要获取virtualbox机器的地址(我在虚拟机连接设置中使用仅限主机的addapter)。 ifconfig | grep addr
我收到地址 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 datanode地址时,代理到客户机。