阿里云服务器搭建hadoop伪分布式集群的坑

1.既然是伪分布式集群,所以文件中的所有配置都要留内网ip,方便namenode与datanode相通信。

 

2.在客户端通过代码连接时,需要指定namenode通过hostname去连接datanode,按第一条来说,hostname要留内网ip。所以直接通过外网ip是没有办法连接hadoop集群的所以会导致报这种错。

File /hdfsapi/test/a.txt could only be replicated to 0 nodes instead of minReplication (=1).

这也就很好解释了通过eclipse的hadoop插件上传了文件后就算成功了,文件大小也为0的问题,因为你是伪分布式的,所以没办法直接通过外网ip地址去连datanode,插件中没有办法指定通过hostname去连,而代码中可以。


		conf.set("dfs.client.use.datanode.hostname","true");
                //指定通过hostname去连接datanode

 

 

加完之后整段代码如下:

	/**
	 *  从HDFS中下载文件
	 * @throws Exception
	 */
	@Test
	public void connect_get() throws Exception {
		//--获取Hadoop 环境变量对象
		Configuration conf = new Configuration();
		//--可以通过此对象来设定环境
		//--ͨ通过代码设定的优先级要高于文件设定的优先级
		//--代码设定的生效范围是局部
		//--"1"指的复件个数
		conf.set("dfs.replication", "1");
		conf.set("dfs.client.use.datanode.hostname","true");
		//--连接HDFS文件系统
		FileSystem system = FileSystem.get(new URI("hdfs://47.105.***.**:9000"),conf);
		//--获取HDFS指定文件的输入流
		InputStream in = system.open(new Path("/word/result/part-r-00000"));
		//--ͨ获取本地的文件输出流
		OutputStream out = new FileOutputStream(new File("part-r-00000"));
		
		//--通过Hadoop提供的工具类,完成数据传输
		IOUtils.copyBytes(in, out, conf);
	}

 

同样的,关于hadoop插件,run on hadoop,也需要在Connection的下面加上这句话,不然无法使用插件,只能手动打jar包!

 

 

以上内容纯属个人猜测并实际解决了问题,如有不对请指正。

 

附上思路来源:

发现datanode 向namenode 注册的是内网的ip。当我们走公网ip 访问namenode 的时候,可以得到相应的datanode 的注册信息。于是通过对应的注册信息进行访问,但是此时datanode 向namenode 注册的是内网的ip 因为远程访问的机器和hdfs 的机器不在一个内网集群 ,所以会导致虽然有一个datanode 但是没有可用节点。解决方法在远程调用的相应的配置中加入configuration.set("dfs.client.use.datanode.hostname","true");使用hostname 进行访问同时在hosts 文件中配置对应的主机名和公网ip 的映射,即可远程成功调用hdfs
--------------------- 
作者:q_all_is_well 
来源:CSDN 
原文:https://blog.csdn.net/q_all_is_well/article/details/80660629 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(大数据)