由于在Docker下部署的hbase目前都是伪分布式的部署,所以后续想整理下,看如何部署多机环境下的分布式部署
在使用Docker环境的spark和Hbase的时候出现了下面几个问题,特意补充说明下:
1.spark和hbase分别部署在其他机器上
说明如下:spark部署在192.168.*.215上,spark运行的虚机是172.20.0.0/24网段,Hbase部署在192.168.*.216机器上,Hbase虚机是172.17.0.0/24网段
这样通过在215机器上,添加路由:
route add -net 172.17.0.0/24 gw 192.168.126.216
216机器上,添加路由
route add -net 172.20.0.0/24 gw 192.168.126.215
这样,两个虚拟容器就能互相访问,如果spark work上运行时报某个地址找不到,在sprak work虚机上,修改/etc/hosts文件,参考如下:
这样,两台虚拟容器就可以互相方法。
2.在hbase虚拟容器里面运行phoenix的./sqlline.py,报hadoop.hbase.ipc.CallTimeoutException: Call id=62, waitTime=60006, rpcTimeout=60000
我们要修改两个地方,一个是hbase容器里面的hbase-site.xml文件,一个是phoenix的hbase-site.xml文件设置
我们首先将hbase虚拟容器的/opt/hbase-2.0.6/conf的配置文件导出到主机,使用如下命令进行导出:
#70b7是镜像ID前四位
docker cp 70b7:/opt/hbase-2.0.6/conf/ /opt/bigdata/hbase-phoenix-docker/hbase-2.0.6
接入我们要重新开启一个新的容器,使用
docker run -itd -p 2181:2181 -p 8765:8765 -p 60000:60000 -p 60010:60010 -p 60020:60020 -p 60030:60030 -v /opt/bigdata/hbase-phoenix-docker/hbase-2.0.6/conf:/opt/hbase-2.0.6/conf hbase-phoenix-docker:v1 /bin/bash
这样,我们将主机的hbase-site-bak.xml进行修改(不是修改hbase-site.xml,具体请看容器(https://gitee.com/astra_zhao/hbase-phoenix-docker的容器里面的start-pseudo-distributed.sh)
添加下面属性:
<property>
<name>phoenix.query.timeoutMs</name>
<value>1200000</value>
</property>
<property>
<name>phoenix.query.keepAliveMs</name>
<value>1200000</value>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>1200000</value>
</property>
<property>
<name>hbase.regionserver.lease.period</name>
<value>1200000</value>
</property>
<property>
<name>hbase.client.operation.timeout</name>
<value>1200000</value>
</property>
<property>
<name>hbase.client.scanner.caching</name>
<value>1000</value>
</property>
<property>
<name>hbase.client.scanner.timeout.period</name>
<value>1200000</value>
</property>
最后,我们还要修改容器/opt/phoenix/bin下面的hbase-site.xml。修改跟上面一样。这样就能在./sqlline.py里面查询千万条以上的数据。
ps:同主机下不同容器不能访问的解决方法
针对docker的version '2'或者version '3'通过network_mode
下面这种方式是无效的。
networks:
default:
external:
name: my-pre-existing-network
通过docker network ls进行查看
通过docker network inspect 网络名称,可以查看用了哪些IP地址访问
#>docker network inspect bridge