Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口

背景:

在windows进行关于大数据方面的一些开发,涉及到HDFS或者Hive或者hbase的访问,本地想测试,又不想自己一个个的装hadoop环境,就直接下载了HDP的虚拟机或者Docker

直接在vmware中加载开机就行,目前用的HDP2.6.5

整个物理环境其实是:

windows10(开发测试)----访问----> windows上的虚拟机(centos7,hdpdocker的宿主机)---访问--->虚拟机中的docker(其实是两个docker,一个是proxy(管理端口映射),一个是真实的hdp环境)

  windows IP:192.168.0.106

虚拟机IP:192.168.28.130

虚拟机中Docker(HDP)IP:172.28.0.2

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口

  

问题:

实际开发运行调试的时候,就发现在windows*问hdfs或者hive等均会报错,例如:

访问hive的时候,出错:

org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-243674277-172.17.0.2-1529333510191:blk_1073743333_2541 file=xxx.txt

访问hdfs的时候,出错:

 [INFO - org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1393)] Excluding datanode DatanodeInfoWithStorage[172.18.0.2:50010,DS-ab75b94d-c6f2-4415-8639-1aaec2609e13,DISK]

[INFO - org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1493)] Exception in createBlockOutputStream
java.net.ConnectException: Connection timed out: no further information

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /test/sw/20200428/sw-20200428-1627-1.ok could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.

 

原因:

其实是2个原因造成的: windows访问docker不通(中间隔了一个虚拟机),docker中的某些服务默认是不对外(docker的宿主机之外)开放端口的,例如50010

spark程序正常来说是运行在集群内部的,从内部访问IP和端口都是通的,没什么问题,但是测试的时候,想方便,想直接跨过虚拟机,直接访问docker

 

方案:

基于我本机的环境测试没问题,其他环境的不确定

1. HDP中增加对外的端口:

hdp的官网中有一个解决端口冲突的方法

https://www.cloudera.com/tutorials/sandbox-deployment-and-install-guide/3.html

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口  

原文如下: 

Go to the location where you saved the Docker deployment scripts - refer to Deploy HDP Sandbox as an example. You will notice a new directory sandbox was created.

  • Edit file sandbox/proxy/proxy-deploy.sh
  • Modify conflicting port (first in keypair). For example, 6001:6001 to 16001:6001
  • Save/Exit the File
  • Run bash script: bash sandbox/proxy/proxy-deploy.sh
  • Repeat steps for continued port conflicts

Verify sandbox was deployed successfully by issuing the command:

docker ps

方法就是在虚拟机上找到 /sandbox/proxy/proxy-deploy.sh文件

(这个文件的位置,具体看怎么安装的,如果直接下载的是hdp的虚拟机,那么位置就是上面的那个

如果是自己装了虚拟机后,下载了hdp docker的安装脚本,通过脚本来安装的话,应该是跟脚本的位置相同)

编辑该文件在后面增加端口映射

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口 

 保存之后,重新运行脚本bash /sandbox/proxy/proxy-deploy.sh

这样的话,在虚拟机上的确打开了相应的端口,netstat -apn | grep 50010 是可以看到端口的

但是在windows上,telnet  虚拟机IP 50010,发现不通

说明虚拟机上并没有对外提供50010的端口访问

后面找了下(看下proxy-deploy.sh内容),发现还需要修改 /sandbox/proxy/conf.stream.d/tcp-hdp.conf

增加50010等端口

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口  

 这个文件里面是对外提供tcp的端口的,如果需要对外提供http端口,则去修改/sandbox/proxy/conf.d/http-hdp.conf

其实proxy这个docker应该是通过nginx对外提供服务的,修改的其实是nginx的配置文件,应该。 

proxy-deploy.sh 和 tcp-hdp.conf 

改完了之后,重新执行脚本bash /sandbox/proxy/proxy-deploy.sh ,让其生效

在windows上telnet 虚拟机IP 50010端口,可以通 

 

2. Windows上间接访问docker

在windows上面隔着虚拟机直接访问docker,网上很多文章都是通过在windows上增加路由的方式来实现

不过我试了很多次,都不行

没办法,想另外的方式绕过去,在windows上调试的时候,出现的错误一般都是因为 172.18.0.2 50010 不通(程序内部用的还是docker的IP和端口),然后各种报错

所以只要在windows上能实现对docker 172.18.0.2 50010端口 的访问就行

上面windows已经可以访问虚拟机192.168.28.130 50010的访问了

所以只要在windows上,把对docker 172.18.0.2 50010端口的访问映射到虚拟机192.168.28.130 50010端口的访问就行了

整个过程如下图所示

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口  

在windows上可以通过NAT的方式来实现一个IP映射为另外一个IP,

前提是windows上支持IPV6,windows10上默认是开启的

首先建立windows上50010端口到虚拟机192.168.28.130 50010端口的映射,用管理员打开cmd,执行下面的语句

netsh interface portproxy add v4tov4 listenport=50010 connectaddress=192.168.28.130 connectport=50010 protocol=tcp 

通过下面的命令可以查看当前的映射(下图中的第二条)

netsh interface portproxy show all

如下图:(上面的脚本添加的是第二条记录,第一条记录,本来以为添加这一条就可以实现windows对172.18.0.2 到192.168.28.130的映射,最后发现不行)

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口 

在windows上telnet localhost 50010 可以通

 

剩下就是把对docker 172.18.0.2 这个的IP访问映射到windwos本身就可以了

可以通过在windows上增加一个回路来实现

可以参考

https://blog.csdn.net/qq_39689711/article/details/103547347

win键+R键,打开运行窗口,输入hdwwiz.exe,确定

依次选择

添加网络适配器

选择microsoft,选择Microsoft KM-TEST Loopback Adapter(环路适配器) 

 下一步等确定即可,安装完成后,在网络连接中,可以看到增加了一个环形适配器

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口

  右键,打开属性窗口,编辑IPV4地址,如下图

IP设为:172.18.0.2

子网:255.255.255.255

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口

  

确定之后,在windows上telnet 172.18.0.2 50010 发现可以通了,也就可以正常调试了

 

Reference:

https://superuser.com/questions/363036/how-to-map-an-ip-adress-to-localhost

 

Windows访问虚拟机中的docker,HDP Docker (sandbox)中增加对外的端口

上一篇:windows上使用docker安装oracle11g


下一篇:MySQL 面试题MySQL 中有哪几种锁?