如何连接docker容器里面的hadoop,首先必须清楚你的hadoop配着文件,否则,问题出的摸不到头脑。
首先,我将本地端口9000映射到docker容器中,hdfs就是通过9000这个端口和宿主机交互,当然,如果你好需要用到其他端口也可以一同映射出去。
启动一个容器
docker run -d -it -p 9000:9000 --name hadoop [镜像id]
-p 9000:9000 前一个9000是windows的端口,后一个9000是容器的端口,就是将宿主windows端口9000映射到docker容器的端口9000上,如果要映射多个端口,在-p 50070:50070 。。。。
--name hadoop 我启动的容器名称叫hadoop,当然你可以随便起
【镜像id】容器依赖的镜像
然后 进入容器 docker exec -it hadoop /bin/bash
之后,进入安装的hadoop用户,修改hdfs的配置
先看一下,自己的容器的ip
也可以到/etc/hosts中看
这个就是要用到的ip
修改hdfs.site.xml,core-site.xml配置
可以参考http://dblab.xmu.edu.cn/blog/install-hadoop/
但是需要将core-site.xml的对应位置修改
vim /usr/local/hadoop/etc/hadoop/core-site.xml
现在启动hdfs后在windows下编写java代码,运行时出现 Connection refused,拒绝连接
java.net.ConnectException: Call From Somebey/10.0.75.1 to 63d283361be6:9000 failed on connection exception: java.net.ConnectException: Connection refused: no further information; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructor
此时说明权限不够
进入到/usr/local/hadoop 下复制权限
bin/hadoop dfs -chmod -R 777 / #赋予读、些、执行权限 777是最高权限
可能会出这样的错误
hadoop@55108154cfbb:/usr/local/hadoop$ sudo bin/hadoop dfs -chown -R 777 /
Error: JAVA_HOME is not set and could not be found.
但是java已经安装好了
出现这个错误,说明hadoop的java路径没有配着好
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
再次进入到/usr/local/hadoop 下复制权限
bin/hadoop dfs -chmod -R 777 / #赋予读、些、执行权限 777是最高权限
怎么办,怎么办
参考https://blog.csdn.net/xw13106209/article/details/6866072
将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode
这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
可以通过以下命令来手动离开安全模式:
- bin/hadoop dfsadmin -safemode leave
用户可以通过dfsadmin -safemode value 来操作安全模式,参数value的说明如下:
enter - 进入安全模式
leave - 强制NameNode离开安全模式
get - 返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束。
强制里开Name node安全模式后,再次赋权限,终于成功了
windows下idea编写代码
conf.set("fs.defaultFS","hdfs://localhost:9000");
这是启动容易的时候windows端口9000已经映射到了容器的对应端口上了
运行,成功了
完整java代码(可以参照http://dblab.xmu.edu.cn/blog/290-2/)
package com.hadoop; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSFileIfExist { public static void main(String[] args){ try{ String fileName = "test"; Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); if(fs.exists(new Path(fileName))){ System.out.println("文件存在"); }else{ System.out.println("文件不存在"); } }catch (Exception e){ e.printStackTrace(); } } }好了结束,可以接着http://dblab.xmu.edu.cn/blog/290-2/打包运行一下试试哦