自制Hadoop+HBase的Docker镜像 之 制作篇
准备工作
- 已经安装好Docker的Linux平台或Windows平台(我使用的是Ubuntu虚拟机)(Linux平台下的Docker安装教程参考官方文档 或者 菜鸟教程 )
- 下载(pull)好Ubuntu的Docker镜像(我使用的是Ubuntu16.04官方docker镜像)(此处你可能需要镜像加速:解决Docker从仓库下载镜像速度慢的问题 )
- 下载好JDK、Hadoop、HBase、ZooKeeper的压缩包(.tar.gz)(我的所有压缩包都下载到了Ubuntu虚拟机的 ~/dock-disk/文件夹下)
- 我使用的软件版本:
- JDK8(jdk-8u241-linux-x64.tar.gz)
- Hadoop(hadoop-2.7.7.tar.gz)
- HBase(hbase-1.4.13-bin.tar.gz)
- ZooKeeper(apache-zookeeper-3.5.7-bin.tar.gz)
具体流程
此文章为事后整理,制作过程的大部分记录由于虚拟机多次内存不足导致卡死而未能保留。纰漏之处,欢迎指正~
加载安装文件
像JDK、Hadoop、HBase、ZooKeeper这些软件包都是要安装在docker镜像中的,所以首先需要让镜像能够访问到所有的安装文件(即.tar.gz压缩包)
操作:使用Ubuntu16.04镜像创建docker容器ubuntu,并在创建时将所有压缩包所在文件夹 ~/dock-disk/ 挂载到容器
命令:
1docker run -it -v /home/hadoop/docker-disk/:/root/disk/ --name ubuntu ubuntu:16.04 /bin/bash
说明:
-it 表示以可交互模式创建容器
-v 表示从主机挂载文件夹到docker容器,冒号左侧是我虚拟机上的文件夹,冒号右边是docker内的文件夹(docker内的文件夹不需要事先创建)
— name 表示将容器命名为ubuntu,它后面还有一个ubuntu是镜像名,16.04是镜像的tag
/bin/bash 表示指定Bash为交互工具
初始化Ubuntu环境
操作:将apt软件源修改为对应Ubuntu版本的清华软件源镜像
命令:
1cp /etc/apt/sources.list /etc/apt/sources.list.bak
2cat>/etc/apt/sources.list<<EOF
3deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
4deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
5deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
6deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
7EOF
说明:第一行为备份默认软件源;第二行更新软件源;注意软件源的版本,同时,清华软件源镜像原本都是https协议的,这里把https都改成了http,因为此时的Ubuntu容器还没有https下载的驱动。
命令:
1apt update
2apt install vim -y
3apt-get install ssh -y
4echo '/etc/init.d/ssh start' >> ~/.bashrc
说明:这里更新了软件索引,然后安装了vim、ssh,最后将ssh启动的命令写入了.bashrc文件,方便用户登录后立即自启
命令:
1ssh-keygen
2cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
说明:第一条命令执行后一直回车即可(回车代表接受默认设置)
安装JDK
上面容器创建正常的话,此时应该已经以root身份进入到了docker环境,此时使用 ls /root/disk/ 命令可以看到文件夹下面的所有安装文件
1apache-zookeeper-3.5.7-bin.tar.gz hadoop-2.7.7.tar.gz jdk-8u241-linux-x64.tar.gz hbase-1.4.13-bin.tar.gz
操作:确保 /usr/lib/jvm 文件夹存在,然后将/root/disk/文件夹下的 jdk-8u241-linux-x64.tar.gz 解压到 /usr/lib/jvm/ 文件夹下,然后将解压后的文件夹重命名便于后续操作
命令:
1mkdir -p /usr/lib/jvm/
2tar -zxf /root/disk/jdk-8u241-linux-x64.tar.gz -C /usr/lib/jvm/
3mv /usr/lib/jvm/jdk1.8.0_241/ /usr/lib/jvm/jdk8/
操作:确保 /usr/bin/ 目录下没有名为 java 的软链接(此镜像文件没有),然后设置 java 相关的环境变量
命令:
1vim ~/.bashrc
在文件末尾加入以下内容:
1export JAVA_HOME=/usr/lib/jvm/jdk8 # java environment
2export PATH=$PATH:$JAVA_HOME/bin
测试Java环境是否正确
安装Hadoop
操作:将 /root/disk/ 文件夹下的 hadoop-2.7.7.tar.gz 安装文件解压到 /usr/local/ 文件夹下,然后对解压后的文件夹重命名,便于后续操作
命令:
1tar -zxf /root/disk/hadoop-2.7.7.tar.gz -C /usr/local/
2mv /usr/local/hadoop-2.7.7/ /usr/local/hadoop/
操作:设置Hadoop相关的环境变量
命令:
1vim ~/.bashrc
在文件末尾加入以下内容:
1export HADOOP_HOME=/usr/local/hadoop # hadoop environment
2export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
操作:修改Hadoop相关的配置文件
命令:
1vim /usr/local/hadoop/etc/hadoop/core-site.xml
按如下修改配置:
1<configuration>
2 <property>
3 <name>hadoop.tmp.dir</name>
4 <value>file:/usr/local/hadoop/tmp</value>
5 <description>Abase for other temporary directories.</description>
6 </property>
7 <property>
8 <name>fs.defaultFS</name>
9 <value>hdfs://master:9000</value>
10 </property>
11</configuration>
命令:
1vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
按如下修改配置:
1<configuration>
2 <property>
3 <name>dfs.namenode.name.dir</name>
4 <value>file:/usr/local/hadoop/namenode_dir</value>
5 </property>
6 <property>
7 <name>dfs.datanode.data.dir</name>
8 <value>file:/usr/local/hadoop/datanode_dir</value>
9 </property>
10 <property>
11 <name>dfs.replication</name>
12 <value>3</value>
13 </property>
14</configuration>
说明:最后的 dfs.replication 是数据块的冗余份数,此镜像是打算用来学习完全分布式集群的,所以这里设置成3,如果是单机或者伪分布式模式,改为1即可
命令:
1vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
修改下面这行内容:(指明 JAVA_HOME的路径)
1# The java implementation to use.
2export JAVA_HOME=/usr/lib/jvm/jdk8/
命令:
1vim /usr/local/hadoop/etc/hadoop/slaves
里面写从节点的主机名:(这一步也可跳过留在创建容器之后修改)
1slave01
2slave02
安装ZooKeeper
操作:将/root/disk/文件夹下的 apache-zookeeper-3.5.7-bin.tar.gz 解压到 /usr/local/ 文件夹下,然后将解压后的文件夹重命名便于后续操作
命令:
1tar -zxf /root/disk/apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/
2mv /usr/local/apache-zookeeper-3.5.7-bin/ /usr/local/zookeeper/
操作:设置Zookeeper相关环境变量
命令:
1vim ~/.bashrc
在文件最后加入如下内容:
1export ZOOKEEPER_HOME=/usr/local/zookeeper # zookeeper environment
2export PATH=$PATH:$ZOOKEEPER_HOME/bin
操作:修改Zookeeper相关配置文件
命令:
1 cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
2 mkdir /usr/local/zookeeper/data/
3 echo "0" > /usr/local/zookeeper/data/myid
4 vim /usr/local/zookeeper/conf/zoo.cfg
说明:第一行通过配置模板创建一个配置文件;第二行新建一个空文件夹用于存放节点标识等数据;第三行将节点标识写入/usr/local/zookeeper/data/文件夹下的myid文件,默认可设置为0;第四行修改配置文件
修改下面这一行:
1# the directory where the snapshot is stored.
2# do not use /tmp for storage, /tmp here is just
3# example sakes.
4dataDir=/usr/local/zookeeper/data/
说明:dataDir是上面创建的那个空文件夹
然后文件最后加上这几行:(也可留在容器创建之后配置)
1server.0=master:2888:3888
2server.1=slave01:2888:3888
3server.2=slave02:2888:3888
说明:
这里的master、slave01、slave02是将来创建集群时容器的主机名,0对应主节点master、1对应从节点slave01、2对应从节点slave02,可自行修改,只要将来创建容器时满足对应关系即可。
其中,0,1,2这三个序号又和/usr/local/zookeeper/data/myid文件内设置的节点标识相对应,即主节点master的myid文件内容是数字0,从节点slave01在myid文件内存放数字1,从节点slave02在myid文件内存放数字2。
上面往myid写入了数字0,这里面的内容需要在将来创建容器之后修改。
安装HBase
操作:将/root/disk/文件夹下的 hbase-1.4.13-bin.tar.gz 解压到 /usr/local/ 文件夹下,然后将解压后的文件夹重命名便于后续操作
命令:
1tar -zxf /root/disk/hbase-1.4.13-bin.tar.gz -C /usr/local/
2mv /usr/local/hbase-1.4.13/ /usr/local/hbase/
操作:修改HBase相关环境变量
命令:
1vim ~/.bashrc
在文件最后加入这些内容:
1export HBASE_HOME=/usr/local/hbase # hbase environment
2export PATH=$PATH:$HBASE_HOME/bin
操作:修改HBase相关配置文件
命令:
1vim /usr/local/hbase/conf/hbase-site.xml
按如下内容修改:
1<configuration>
2 <property>
3 <name>hbase.rootdir</name>
4 <value>hdfs://master:9000/hbase</value>
5 </property>
6 <property>
7 <name>hbase.cluster.distributed</name>
8 <value>true</value>
9 </property>
10 <property>
11 <name>hbase.zookeeper.quorum</name>
12 <value>master,slave01,slave02</value>
13 </property>
14</configuration>
说明:hbase.rootdir的路径要和hadoop配置中的fs.defaultFS路径一致,即在后者的基础上加上/base即可;hbase.cluster.distributed说明当前是否配置为分布式集群;hbase.zookeeper.quorum存放运行ZooKeeper程序的节点主机名,此项也可在创建容器之后修改
命令:
1mkdir /usr/local/hadoop/pids/
2vim /usr/local/hbase/conf/hbase-env.sh
修改下面几行:
1# The java implementation to use. Java 1.7+ required.
2export JAVA_HOME=/usr/lib/jvm/jdk8
3
4# Extra Java CLASSPATH elements. Optional.
5export HBASE_CLASSPATH=/usr/local/hadoop/conf
6
7# The directory where pid files are stored. /tmp by default.
8export HBASE_PID_DIR=/usr/local/hadoop/pids
9
10# Tell HBase whether it should manage it's own instance of Zookeeper or not.
11export HBASE_MANAGES_ZK=false
说明:第三个是保存pid文件的路径(即上面创建的pids空目录),部分pid文件丢失会导致hbase无法关闭,此项也可不改;最后一个是是否使用HBase内置的ZooKeeper,一般集群配置不使用内置的,这里设置为false,HBase将使用上面独立安装的ZooKeeper
命令:
1vim /usr/local/hbase/conf/regionservers
里面存放如下内容:(也可将来创建容器之后再修改)
1slave01
2slave02
说明:放置从节点的主机名,一个一行
至此安装结束~
保存当前容器
同时按Ctrl+P+Q退出当前容器,回到虚拟机终端
执行:
1docker commit ubuntu ubuntu/hadoop-zookeeper-hbase:v1
等待片刻即可使用 docker images 命令查到新的镜像文件如下:
1REPOSITORY TAG IMAGE ID CREATED SIZE
2ubuntu/hadoop-zookeeper-hbase v1 98730083e65b 6 hours ago 1.55GB
可以进一步将此镜像上传至Docker仓库,便于分享,此处不再赘述。
参考资料
- 林子雨老师的教程,如: http://dblab.xmu.edu.cn/blog/1233/
- 一些博客,如:https://www.cnblogs.com/along21/p/10496468.html
(欢迎进一步查看《自制Hadoop+HBase的Docker镜像 之 使用篇》https://hxhen.com/use-a-hadoop-hbase-docker-image/)