文将介绍如何在docker上从零开始安装hadoop以及hive环境。本文不会介绍如何安装docker,也不会过多的介绍docker各个命令的具体含义,对docker完全不了解的同学建议先简单的学习一下docker再来看本教程。

构建Centos镜像

Dockerfile

  1. FROM centos:7
  2. MAINTAINER by javachen(junecloud@163.com)
  3. #升级系统、安装常用软件
  4. RUN yum -y update && yum -y install openssh-server openssh-clients.x86_64 vim less wget java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel
  5. ENV JAVA_HOME=/usr/lib/jvm/java
  6. #生成秘钥、公钥
  7. RUN [ ! -d ~/.ssh ] && ( mkdir ~/.ssh ) && ( chmod 600 ~/.ssh ) && [ ! -f ~/.ssh/id_rsa.pub ] \
  8. && (yes|ssh-keygen -f ~/.ssh/id_rsa -t rsa -N "") && ( chmod 600 ~/.ssh/id_rsa.pub ) \
  9. && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  10. #设置时区
  11. ENV TZ=Asia/Shanghai
  12. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
  13. #变更root密码为root
  14. RUN cp /etc/sudoers /etc/sudoers.orig && echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && echo "root:root"| chpasswd
  15. #开放窗口的22端口
  16. EXPOSE 22

更多的配置镜像脚本,可以参考 config_system.sh
构建镜像:

  1. docker build -t centos-hadoop:v1 .

通过镜像启动容器:

  1. docker run -d --name centos-hadoop centos-hadoop:v1

启动容器后,我们就可以进入容器进行hadoop和hive的相关安装了。

  1. docker exec -it centos-hadoop /bin/bash

安装Hadoop

下载安装包:

  1. wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz

解压:

  1. tar xvf hadoop-3.1.2.tar.gz -C /usr/local/

vim /usr/local/hadoop-3.1.2/etc/hadoop/core-site.xml

  1. <property>
  2. <name>fs.defaultFS</name>
  3. <value>hdfs://127.0.0.1:9000</value>
  4. </property>

vim /usr/local/hadoop-3.1.2/etc/hadoop/hdfs-site.xml

  1. <property>
  2. <name>dfs.replication</name>
  3. <value>1</value>
  4. </property>

vim /usr/local/hadoop-3.1.2/etc/hadoop/mapred-site.xml

  1. <property>
  2. <name>mapreduce.framework.name</name>
  3. <value>yarn</value>
  4. </property>

vim /usr/local/hadoop-3.1.2/etc/hadoop/hadoop-env.sh

  1. JAVA_HOME=/usr/lib/jvm/java

/usr/local/hadoop-3.1.2/sbin/目录下将start-dfs.sh,stop-dfs.sh两个文件顶部添加以下参数

  1. !/usr/bin/env bash
  2. HDFS_DATANODE_USER=root
  3. HDFS_DATANODE_SECURE_USER=hdfs
  4. HDFS_NAMENODE_USER=root
  5. HDFS_SECONDARYNAMENODE_USER=root

vim /etc/profile

  1. export HADOOP_HOME="/usr/local/hadoop-3.1.2"
  2. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

配置生效:

  1. source /etc/profile

namenode 初始化

  1. hadoop namenode -format

启动hdfs相关进程:

  1. start-dfs.sh

执行start-dfs.sh脚本后,hadoop会启动3个和hdfs相关的进程。通过ps -ef | grep hadoop我们可以看到这几个进程分别是NameNodeSecondaryNamenodeDatanode。如果少了就要注意hdfs是否没有正常启动了。

  1. ps -ef | grep hadoop

之后启动yarn的相关进程:

  1. start-yarn.sh

验证程序已经正确启动

  1. hadoop fs -mkdir /test
  2. hadoop fs -ls /
  3. Found 1 items
  4. drwxr-xr-x - root supergroup 0 2019-07-26 19:15 /test

hadoop默认的存储数据的目录为:/tmp/hadoop-${user}

  1. $ ll /tmp/hadoop-root/dfs/
  2. total 0
  3. drwx------ 3 root root 40 Jul 26 19:39 data
  4. drwxr-xr-x 3 root root 40 Jul 26 19:39 name
  5. drwxr-xr-x 3 root root 40 Jul 26 19:39 namesecondary

/usr/local/hadoop-3.1.2/sbin/目录下将start-yarn.sh,stop-yarn.sh两个文件顶部添加以下参数

  1. YARN_RESOURCEMANAGER_USER=root
  2. YARN_NODEMANAGER_USER=root

之后启动yarn的相关进程

  1. start-yarn.sh

执行脚本后正常会有ResourceManagerNodeManager这两个进程。

安装Hive

下载:

  1. wget http://mirror.bit.edu.cn/apache/hive/hive-3.1.1/apache-hive-3.1.1-bin.tar.gz

解压:

  1. tar xvf apache-hive-3.1.1-bin.tar.gz -C /usr/local/
  2. mv /usr/local/apache-hive-3.1.1-bin /usr/local/hive-3.1.1

vim /usr/local/hive-3.1.1/conf/hive-site.xml

  1. <configuration>
  2. <property>
  3. <name>system:java.io.tmpdir</name>
  4. <value>/tmp/hive/java</value>
  5. </property>
  6. <property>
  7. <name>system:user.name</name>
  8. <value>${user.name}</value>
  9. </property>
  10. <configuration>

vim /etc/profile

  1. export HIVE_HOME="/usr/local/hive-3.1.1"
  2. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin

配置生效:

  1. source /etc/profile

查看docker运行的mysql容器的ip:

  1. docker inspect mysql | grep "IPAddress"
  2. "SecondaryIPAddresses": null,
  3. "IPAddress": "",
  4. "IPAddress": "172.22.0.2",

并在mysql数据库中创建hive数据库:

  1. create database hive;

修改hive的相关配置 vim /usr/local/hive-3.1.1/conf/hive-site.xml

  1. <property>
  2. <name>javax.jdo.option.ConnectionUserName</name>
  3. <value>root</value>
  4. </property>
  5. <property>
  6. <name>javax.jdo.option.ConnectionPassword</name>
  7. <value>123456</value>
  8. </property>
  9. <property>
  10. <name>javax.jdo.option.ConnectionURL</name>
  11. <value>jdbc:mysql://172.22.0.2:3306/hive?useSSL=false</value>
  12. </property>
  13. <property>
  14. <name>javax.jdo.option.ConnectionDriverName</name>
  15. <value>com.mysql.jdbc.Driver</value>
  16. </property>

wget获取mysql驱动到hive的lib下

  1. cd /usr/local/hive-3.1.1/lib
  2. wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar

初始化元数据库

  1. schematool -initSchema -dbType mysql

我们先创建一个数据文件放到/usr/local,vim test.txt

  1. 1,jack
  2. 2,hel
  3. 3,nack

之后通过hive命令进入hive交互界面,然后执行相关操作

  1. create table test(
  2. id int
  3. ,name string
  4. )
  5. row format delimited
  6. fields terminated by ',';
  7. load data local inpath '/usr/local/test.txt' into table test;
  8. select * from test;
  9. OK
  10. 1 jack
  11. 2 hel
  12. 3 nack

启动 Hiveserver2
vim /usr/local/hadoop-3.1.2/etc/hadoop/core-site.xml

  1. <property>
  2. <name>hadoop.proxyuser.root.hosts</name>
  3. <value>*</value>
  4. </property>
  5. <property>
  6. <name>hadoop.proxyuser.root.groups</name>
  7. <value>*</value>
  8. </property>

然后重启hdfs:

  1. stop-dfs.sh
  2. start-dfs.sh

后台启动hiveserver2

  1. nohup hiveserver2 &

通过beeline连接

  1. beeline -u jdbc:hive2://127.0.0.1:10000

查询一下之前建立的表看下是否能正常访问

  1. select * from test;

总结

本篇文章记录了,如果使用docker搭建hadoop单机环境,如果你想更全面的使用Docker构建Hadoop集群,可以参考 https://github.com/big-data-europe ,另外,需要注意的是这个镜像只向宿主机暴露了22端口,如果想暴露更多端口,可以将该镜像提交:

  1. docker commit \
  2. --author "XXX <XXX@gmail.com>" \
  3. --message "XXXXX" \
  4. centos-hadoop \
  5. centos-hadoop:v2

然后,再次使用新镜像启动容器,并暴露hadoop的端口。