使用docker安装hbase2.1.4
版本确定
hadoop
hbase与hadoop兼容表:https://hbase.apache.org/book.html#hadoop
据当前hadoop的版本2.7.7,确定hbase的版本为2.1.x, 那么可以使用最新版本2.1.4.
jdk
hbase与jdk兼容表:https://hbase.apache.org/book.html#basic.prerequisites
hbase2.1.4可以使用JDK8
zookeeper
ZooKeeper 3.4.x is required.
ssh
没有版本要求
docker基础配置
FROM ubuntu:16.04
COPY sources.list /etc/apt/
RUN apt update
RUN apt install -y vim tzdata
RUN rm /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
ENV TZ="Asia/Shanghai"
WORKDIR /
COPY jdk1.8.0_171 /jdk1.8.0_171
ENV JAVA_HOME=/jdk1.8.0_171
ENV PATH=$PATH:/jdk1.8.0_171/bin
RUN ln -s /jdk1.8.0_171/bin/java /usr/bin/java
ssh 配置
因为HMaster节点要启动HRegionServer, 是通过ssh发送命令的方式, 所以HMaster节点要能使用ssh访问所有的HRegionServer, 所以docker需要支持ssh.
由于主机肯定有ssh, 占用了22端口, 而docker使用的网络模式为host, 所以docker中ssh的端口不能是22, 需要修改.
ssh不能在命令行上带密码登录, 需要配置免密登录模式, 所有container都使用一个用户名和key, 并且把这个key放到本机的authorized_keys里面, 那么所有的container都可以互相登录了.
ssh在访问新主机时, 默认会提示是否授受新主机, 而hbase是非交互式访问, 需要关闭这个提示.
创建ssh key
ssh key创建后就不应该变化 , 不能在打包的时候创建, 不然每次打包后, 所有的节点都需要重启才行, 所以手动创建key, 然后复制到镜像中.
mkdir -p ssh-keys && ssh-keygen -t rsa -P '' -f ssh-keys/id_rsa -C "hbase" && cat ssh-keys/id_rsa.pub > ssh-keys/authorized_keys && chmod 0600 ssh-keys/authorized_keys
在Dockerfile中增加ssh配置
RUN apt install -y ssh
RUN sed -i "/StrictHostKeyChecking/d" /etc/ssh/ssh_config && echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config
RUN sed -i "/Port/d" /etc/ssh/sshd_config && echo "Port 5022" >> /etc/ssh/sshd_config
COPY ssh-keys /root/.ssh
安装hbase2.1.4
这个直接将目录复制过来就可以了
WORKDIR /hbase
COPY hbase-2.1.4 .
ENV HBASE_HOME=/hbase
修改hbase配置
按照惯例, 容器启动时把配置文件映射出来, 使用指定的配置.
从hbase目录下把conf目录复制出来, 对其进行配置.
修改hbase-env.sh, 指定jdk目录和ssh端口号, 使用外部zookeeper
export JAVA_HOME=/jdk1.8.0_171
export HBASE_SSH_OPTS="-p 5022"
export HBASE_MANAGES_ZK=false
修改hbase-site.xml, 使用分布式模式, 指定hbase数据存放在hdfs中, 指定zookeeper地址
<configuration>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.1.26:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.1.22:15301,192.168.1.22:15302,192.168.1.22:15303</value>
</property>
<!--指定各种端口号 -->
<property>
<name>hbase.master.port</name>
<value>30010</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>30020</value>
</property>
<property>
<name>hbase.regionserver.port</name>
<value>30030</value>
</property>
<property>
<name>hbase.regionserver.info.port</name>
<value>30040</value>
</property>
</configuration>
修改regionservers, 增加region server的地址列表
192.168.1.26
将config目录整个复制到/home/mo/sjfx-hbase-data/目录下, 以便后期使用.
启动Region节点
region服务只要启动ssh就可以了, 后续由master节点来管理
#/bin/sh
docker stop sjfxhbase-region
docker rm sjfxhbase-region
docker run -d --name sjfxhbase-region --net=host \
-v /home/mo/sjfx-hbase-data/config:/hbase/conf \
-v /home/mo/sjfx-hbase-data/region-logs:/hbase/logs \
sjfxhbase:v1 sh -c "service ssh start && tail -f /dev/null"
启动Master节点
#/bin/sh
docker stop sjfxhbase-master
docker rm sjfxhbase-master
docker run -d --name sjfxhbase-master --net=host \
-v /home/mo/sjfx-hbase-data/config:/hbase/conf \
-v /home/mo/sjfx-hbase-data/master-logs:/hbase/logs \
sjfxhbase:v1 sh -c "/hbase/bin/start-hbase.sh && tail -f /dev/null"
Master节点启动日志发现错误:Failed construction RegionServer
解决方法参考文档:https://blog.csdn.net/crazyman2010/article/details/88911912
测试
docker exec -it sjfxhbase-master sh -c "./bin/hbase shell"
2019-06-05 11:23:24,066 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.1.4, r5b7722f8551bca783adb36a920ca77e417ca99d1, Tue Mar 19 19:05:06 UTC 2019
Took 0.0063 seconds
hbase(main):001:0>