背景:
在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*问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
原文如下:
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
to16001: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的安装脚本,通过脚本来安装的话,应该是跟脚本的位置相同)
编辑该文件在后面增加端口映射
保存之后,重新运行脚本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等端口
这个文件里面是对外提供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上可以通过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上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(环路适配器)
下一步等确定即可,安装完成后,在网络连接中,可以看到增加了一个环形适配器
右键,打开属性窗口,编辑IPV4地址,如下图
IP设为:172.18.0.2
子网:255.255.255.255
确定之后,在windows上telnet 172.18.0.2 50010 发现可以通了,也就可以正常调试了
Reference:
https://superuser.com/questions/363036/how-to-map-an-ip-adress-to-localhost