wind10下idea连接docker 容器里的伪分布hadoop

如何连接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】容器依赖的镜像

wind10下idea连接docker 容器里的伪分布hadoop

然后 进入容器 docker exec -it hadoop /bin/bash

wind10下idea连接docker 容器里的伪分布hadoop

之后,进入安装的hadoop用户,修改hdfs的配置

先看一下,自己的容器的ip

wind10下idea连接docker 容器里的伪分布hadoop

也可以到/etc/hosts中看

wind10下idea连接docker 容器里的伪分布hadoop

这个就是要用到的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

wind10下idea连接docker 容器里的伪分布hadoop

现在启动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是最高权限


可能会出这样的错误

[email protected]:/usr/local/hadoop$ sudo bin/hadoop dfs -chown -R 777 /

Error: JAVA_HOME is not set and could not be found.

但是java已经安装好了

wind10下idea连接docker 容器里的伪分布hadoop

出现这个错误,说明hadoop的java路径没有配着好

vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh

wind10下idea连接docker 容器里的伪分布hadoop

再次进入到/usr/local/hadoop 下复制权限

bin/hadoop dfs -chmod -R 777 / #赋予读、些、执行权限 777是最高权限

wind10下idea连接docker 容器里的伪分布hadoop

怎么办,怎么办

参考https://blog.csdn.net/xw13106209/article/details/6866072

将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode

这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

可以通过以下命令来手动离开安全模式:

[cpp] view plain copy
  1. bin/hadoop dfsadmin -safemode leave  

用户可以通过dfsadmin -safemode value 来操作安全模式,参数value的说明如下:
enter - 进入安全模式
leave - 强制NameNode离开安全模式
get - 返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束。

强制里开Name node安全模式后,再次赋权限,终于成功了

windows下idea编写代码

wind10下idea连接docker 容器里的伪分布hadoop


conf.set("fs.defaultFS","hdfs://localhost:9000");

这是启动容易的时候windows端口9000已经映射到了容器的对应端口上了

运行,成功了

wind10下idea连接docker 容器里的伪分布hadoop

完整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/打包运行一下试试哦