建立hadoop和hbase的伪分布式集群,hadoop和hbase分别运行在两个容器内,通过hadoop:9000端口访问。
建立伪分布式hbase集群
目标
- 建立hadoop伪分布式集群,挂载主机目录做为数据目录,暴露9000端口做为数据访问端口
- 建立hbase伪分布式集群,使用hadoop:9000做为文件系统
- 使用容器,并使用docker-compose简化系统启停
建立hadoop伪分布式集群
从官网下载合适版本。hbase目前版本支持hadoop2.6.1+版本,不支持2.7.0,因此下载最新的2.6.5版本
几个配置文件如下,全部参考官方文档
core-site.xml
1 2 3 4 5 6
| <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop:9000</value> </property> </configuration>
|
hdfs-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/v/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/v/dfs/data</value> </property> </configuration>
|
这里的/v/dfs/
是容器映射主机的目录,在docker-compose.xml文件中会有详细定义
yarn-site.xml
1 2 3 4 5 6 7 8 9 10 11 12
| <configuration>
<!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop</value> </property> </configuration>
|
mapred-site.xml
1 2 3 4 5 6
| <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
|
dockerfile: dockerfile取名hadoop.dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| # Creates pseudo distributed hadoop 2.6.5
FROM java:on MAINTAINER lyalchan "lyallchan@163.com"
ENV HADOOP_VERSION=2.6.5 ADD hadoop-${HADOOP_VERSION}.tar.gz /
ENV PATH /hadoop-${HADOOP_VERSION}/bin:/hadoop-${HADOOP_VERSION}/sbin:$PATH ENV HADOOP_PREFIX=/hadoop-${HADOOP_VERSION}
ADD core-site.xml ${HADOOP_PREFIX}/etc/hadoop/ ADD hdfs-site.xml ${HADOOP_PREFIX}/etc/hadoop/ ADD mapred-site.xml ${HADOOP_PREFIX}/etc/hadoop/ ADD yarn-site.xml ${HADOOP_PREFIX}/etc/hadoop/
RUN echo export JAVA_HOME=${JAVA_HOME} >> $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh RUN echo export HADOOP_PREFIX=/hadoop-${HADOOP_VERSION} >> $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh
RUN $HADOOP_PREFIX/bin/hdfs namenode -format -force
ADD hadoop.sh / RUN chmod +x /hadoop.sh
ENTRYPOINT ["/hadoop.sh"]
|
说明:
- java:on是自定义的一个java镜像,基于isuper/java-oracle:jdk_8,增加ssh免密码登陆功能,并修正了时区。ssh免密码登陆是hadoop、hbase集群必备条件
- namenode必须先格式化,这里为了格式化已有的namenode,增加了force参数
- hadoop.sh启动hdfs和yarn服务,具体为
hadoop.sh
1 2 3 4 5 6
| #!/bin/bash
service ssh start start-dfs.sh start-yarn.sh sleep 99999999
|
建立hbase伪分布式集群
从官网下载最新版本,这里是1.2.4版本
配置文件,只有一个hbase-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <configuration> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop:9000/hbase</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>hdfs://hadoop:9000/zookeeper</value> </property> </configuration>
|
使用hadoop:9000端口,hadoop是前面hadoop集群的主机名称,在docker-compose.yml中指定
dockerfile: 取名hbase.dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| FROM java:on MAINTAINER lyalchan "lyallchan@163.com"
ENV HBASE_VERSION 1.2.4
ADD hbase-${HBASE_VERSION}-bin.tar.gz / ADD hbase-site.xml /hbase-${HBASE_VERSION}/conf/ ENV PATH /hbase-${HBASE_VERSION}/bin:$PATH RUN echo export JAVA_HOME=$JAVA_HOME >> /hbase-$HBASE_VERSION/conf/hbase-env.sh
ADD hbase.sh / RUN chmod +x /hbase.sh
ENTRYPOINT ["/hbase.sh"]
|
hbase.sh启动hbase服务,具体为
hbase.sh
1 2 3 4 5
| #!/bin/bash
service ssh start start-hbase.sh sleep 99999999
|
建立容器,并使用docker-compose启停
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| version: "2" services: hadoop: build: context: . dockerfile: hadoop.dockerfile image: hadoop_pseudo_distributed:2.6.5 container_name: hadoop hostname: hadoop ports: - 50070:50070 - 8088:8088 volumes: - ./data:/v hbase: build: context: . dockerfile: hbase.dockerfile image: hbase_pseudo_distributed:1.2.4 container_name: hbase depends_on: - hadoop hostname: hbase ports: - 16010:16010 volumes: - ./data:/v
|
定义两个服务,hadoop和hbase
- hadoop使用hadoop.dockerfile做为dockerfile,生成image叫hadoop_pseudo_distributed:2.6.5,启动的容器名为hadoop,主机名为hadoop,暴露两个端口50070和8088,并挂载主机当前目录下的data目录,从hdfs-site.xml可以知道,这个目录被用来当做hadoop的namenode和datanode目录。
- hbase类似
docker1.10以后的网络功能大为增强,在docker daemon中新增了dns功能,所有使用自定义网络的容器都可以通过主机名互通,不再需要使用–link。
把所有文件都放在一个目录下,共12个文件,一个data文件夹,这12个文件为
hadoop文件
- hadoop-2.5.6.tar.gz
- hadoop.dockerfile
- hadoop.sh
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
hbase文件
- hbase-1.2.4.tar.gz
- hbase.dockerfile
- hbase.sh
- hbase-site.xml
还有一个docker-compose.yml文件
启动系统
停止系统
重建镜像
或者
1
| docker-compose up -d --build
|
使用和验证
hbase shell
1
| docker exec -it hbase /bin/bash
|
进入hbase容器,然后启动hbase shell
在hbase shell下面创建表test
,并增加2行
1 2 3 4 5
| create "test", "cf" put "test", "row1", "cf:a", "value1" put "test", "row1", "cf:b", "value2" put "test", "row2", "cf:a", "value3" put "test", "row2", "cf:c", "value4"
|
新增两行row1
和row2
,row1
有a,b两列,row2
有a,c两列
1 2 3 4 5
| list "test" scan "test" get "test", "row1" get "test", "row2"
|
hadoop
1
| docker exec -it hadoop /bin/bash
|
进入hadoop容器
查看hdfs的文件目录
WEB查看
在主机的localhost:16010,localhost:50070,localhost:8088,可以查看hbase和hadoop的运行情况
参考资料
- hbase官方文档quick start
- hadoop官方文档Single Cluster
- sequenceiq的hadoop docker
- 基于Docker快速搭建多节点Hadoop集群
- 基于docker的hadoop分布式集群