Docker部署Hadoop環境+Hive


一、環境和應用準備

環境:Mac OS

安裝包版本:

jdk-8u181-linux-x64.tar.gz
hadoop-2.7.3.tar.gz
apache-hive-3.1.1-bin.tar.gz
mysql-connector-java-5.1.48.tar.gz

已安裝:Docker

二、構建images

使用Docker來啓動三臺Centos7虛擬機,三臺機器上安裝Hadoop和Java。

1. 獲取centos鏡像

docker pull centos

在這裏插入圖片描述
查看鏡像列表的命令

docker images

在這裏插入圖片描述
2. 安裝SSH

以centos7鏡像爲基礎,構建一個帶有SSH功能的centos

mkdir ~/centos7-ssh
cd centos7-ssh
vi Dockerfile

內容:

FROM centos
MAINTAINER JanZ

RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum  install -y openssh-clients

RUN echo "root:pass" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
  • 大意:選擇一個已有的os鏡像作爲基礎;安裝openssh-server和sudo軟件包,並且將sshd的UsePAM參數設置成no;安裝openssh-clients;添加測試用戶root,密碼pass,並且將此用戶添加到sudoers裏;ssh-keygen 這兩句比較特殊,在centos6上必須要有,否則創建出來的容器sshd不能登錄;啓動sshd服務並且暴露22端口。

構建新鏡像,命名爲 centos7-ssh

docker build -t="centos7-ssh" .

在這裏插入圖片描述
執行完成後,可以在鏡像列表中看到

docker images

在這裏插入圖片描述
3. 構建Hadoop鏡像

基於centos7-ssh鏡像構建有JDK和Hadoop的鏡像

mkdir ~/hadoop
cd ~/hadoop

注:在hadoop文件夾中(即 Dockerfile 所在目錄)提前準備好 jdk-8u181-linux-x64.tar.gz 與 hadoop-2.7.3.tar.gz

vi Dockerfile

內容:

FROM centos7-ssh
ADD jdk-8u181-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_181 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-2.7.3.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

基於 centos7-ssh 這個鏡像,把 Java 和 Hadoop 的環境都配置好了

構建新鏡像,命名爲 hadoop

docker build -t="hadoop" .

在這裏插入圖片描述

三、搭建Hadoop集羣

搭建有三個節點的hadoop集羣,一主兩從

主節點:hadoop0 ip:172.18.0.2
從節點1:hadoop1 ip:172.18.0.3
從節點2:hadoop2 ip:172.18.0.4

但是由於docker容器重新啓動之後ip會發生變化,所以需要我們給docker設置固定ip。

1. 創建自定義網絡(設置固定IP)

查看網絡列表

docker network ls

在這裏插入圖片描述
創建自定義網絡 mynetwork,並且指定網段:172.18.0.0/16

docker network create --subnet=172.18.0.0/16 mynetwork

在這裏插入圖片描述
2. 創建docker容器

啓動三個容器,分別爲hadoop0, hadoop1, hadoop2

docker run --name hadoop0 --hostname hadoop0 --net mynetwork --ip 172.18.0.2 -d -P -p 50070:50070 -p 8088:8088 hadoop
docker run --name hadoop1 --hostname hadoop1 --net mynetwork --ip 172.18.0.3 -d -P hadoop
docker run --name hadoop2 --hostname hadoop2 --net mynetwork --ip 172.18.0.4 -d -P hadoop

查看容器列表

docker ps

在這裏插入圖片描述

四、配置Hadoop集羣

新開啓三個終端,分別進入容器 hadoop0, hadoop1, hadoop2

docker exec -it hadoop0 /bin/bash	
docker exec -it hadoop1 /bin/bash
docker exec -it hadoop2 /bin/bash

1. 設置主機名與ip的映射,修改三臺容器

# hadoop0中執行
vi /etc/hosts

添加以下配置:

172.18.0.2    hadoop0
172.18.0.3    hadoop1
172.18.0.4    hadoop2

2. 設置ssh免密碼登錄

# hadoop0中執行
cd  ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa	# (一直按回車即可)
ssh-copy-id -i localhost  # 中途輸入:yes,密碼:pass,下同
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
# hadoop1中執行
cd  ~
cd .ssh
ssh-keygen -t rsa	# (一直按回車即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
# hadoop2中執行
cd  ~
cd .ssh
ssh-keygen -t rsa	# (一直按回車即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

3. 在hadoop0上修改hadoop的配置文件

cd /usr/local/hadoop/etc/hadoop

修改目錄下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml

(1) hadoop-env.sh

vi hadoop-env.sh	# 以下vi命令省略

修改內容:

export JAVA_HOME=/usr/local/jdk1.8

(2) core-site.xml

添加:

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop0:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/tmp</value>
        </property>
         <property>
                 <name>fs.trash.interval</name>
                 <value>1440</value>
        </property>
</configuration>

(3) hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

(4) yarn-site.xml

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property> 
                <name>yarn.log-aggregation-enable</name> 
                <value>true</value> 
        </property>
</configuration>

(5) mapred-site.xml

# 修改文件名
mv mapred-site.xml.template mapred-site.xml 
vi mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

(6) 指定nodemanager的地址,修改文件yarn-site.xml

<property>
    <description>The hostname of the RM.</description>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop0</value>
  </property>

(7) 修改配置文件slaves

cd /usr/local/hadoop/etc/hadoop
vi slaves

刪除原來的所有內容,添加以下內容:

hadoop1
hadoop2

(8) 在hadoop0中執行命令

scp  -rq /usr/local/hadoop   hadoop1:/usr/local
scp  -rq /usr/local/hadoop   hadoop2:/usr/local

4. 格式化

cd /usr/local/hadoop
bin/hdfs namenode -format

# 注意:在執行的時候如果報錯,是因爲缺少which命令,執行下面命令安裝
# yum install -y which
  • 注:格式化操作不能重複執行。如果一定要重複格式化,帶參數-force即可。

5. 啓動僞分佈hadoop

sbin/start-all.sh

6. 檢查集羣是否正常

(1) 查看進程

檢查進程的命令:

jps

hadoop0 進程:
在這裏插入圖片描述
hadoop1 進程:
在這裏插入圖片描述
hadoop2 進程:
在這裏插入圖片描述
(2) 使用程序驗證集羣服務

創建一個文件

# hadoop0中執行,下同
cd /usr/local/hadoop
vi a.txt

內容:

hello you
hello me

上傳a.txt到hdfs上

hdfs dfs -put a.txt /

執行wordcount程序

cd /usr/local/hadoop/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /a.txt /out

在這裏插入圖片描述
查看程序執行結果

hdfs dfs -text /out/part-r-00000

在這裏插入圖片描述
這樣就說明集羣正常了。

(3) 通過瀏覽器訪問集羣的服務

由於在啓動hadoop0這個容器的時候把50070和8088映射到宿主機的對應端口上了,所以在這可以直接通過宿主機訪問容器中hadoop集羣的服務。

http://127.0.0.1:50070

在這裏插入圖片描述

http://127.0.0.1:8088

在這裏插入圖片描述

6. 停止僞分佈hadoop的命令

cd /usr/local/hadoop
sbin/stop-all.sh

五、安裝Hive

1. 本地下載hive,使用下面的命令傳到hadoop0上

# 本地 bash中執行
docker cp ~/hadoop/apache-hive-3.1.1-bin.tar.gz 933358c86309:/usr/local/
# 933358c86309爲 hadoop0的 Container Id,下同

2. 解壓到指定目錄

# hadoop0中執行
cd /usr/local
tar -zxvf apache-hive-3.1.1-bin.tar.gz
mv apache-hive-3.1.1-bin /hive
cd /hive

3. 配置 /etc/profile

# hadoop0中執行
vi /etc/profile

添加:

export HIVE_HOME=/usr/local/hive
export PATH=$HIVE_HOME/bin:$PATH
source /etc/profile 

4. 安裝並啓用MySQL

使用docker容器來進行安裝(本地bash中執行)

獲取鏡像

docker pull mysql/mysql-server:5.7

新建mysql容器

docker run --name mysql -p 5706:3306 -e MYSQL_ROOT_PASSWORD=pass --net mynetwork --ip 172.18.0.5 -d mysql/mysql-server:5.7 --character-set-server=utf8mb4  --collation-server=utf8mb4_general_ci

新建一個終端,進入mysql容器,運行mysql

docker exec -it mysql /bin/bash
mysql -uroot -p

創建metastore數據庫

create database metastore;

在mysql中授權(以便本地 Navicat 可以連通)

grant all privileges on *.* to root@"%" identified by "pass" with grant option;

其他設定(非必需)

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

show variables like "%time_zone%";
set global time_zone = '+8:00';
flush privileges;

本地Navicat設置連接
在這裏插入圖片描述

5. 下載jdbc connector

下載Connector/J 5.1.48
在這裏插入圖片描述

下載至本地hadoop文件夾中並解壓,把其中的mysql-connector-java-5.1.41-bin.jar文件拷貝到$HIVE_HOME/lib目錄

# 本地bash中執行
cd ~/hadoop/mysql-connector-java-5.1.48
docker cp mysql-connector-java-5.1.48-bin.jar 933358c86309:/hive/lib

6. 修改hive配置文件

# hadoop0中執行,下同
cd /hive/conf

(1) 複製初始化文件並重改名

cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties

(2) 修改hive-env.sh

vi hive-env.sh
export JAVA_HOME=/usr/local/jdk1.8		# Java路徑
export HADOOP_HOME=/usr/local/hadoop	# Hadoop安裝路徑
export HIVE_HOME=/hive					# Hive安裝路徑
export HIVE_CONF_DIR=/hive/conf			# Hive配置文件路徑

(3) 在 hdfs 中創建下面的目錄 ,並且授權

hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /user/hive/tmp
hdfs dfs -mkdir -p /user/hive/log
hdfs dfs -chmod -R 777 /user/hive/warehouse
hdfs dfs -chmod -R 777 /user/hive/tmp
hdfs dfs -chmod -R 777 /user/hive/log

(4) 修改hive-site.xml (定位後修改覆蓋)

<property>
    <name>hive.exec.scratchdir</name>
    <value>/user/hive/tmp</value>
</property>
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/user/hive/log</value>
</property>

# 配置 MySQL 數據庫連接信息

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://172.18.0.5:3306/metastore?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>111111</value>
  </property>

(5) 創建tmp文件

mkdir /hive/tmp

在hive-site.xml中修改:

把{system:java.io.tmpdir} 改成 /home/hadoop/hive/tmp/
把 {system:user.name} 改成 {user.name}

(8) 初始化hive

cd /hive/bin
./schematool -dbType mysql -initSchema

(9) 啓動hive

cd /hive/bin
./hive

在這裏插入圖片描述


本文參考了官方文檔及很多博客,並在前輩攻略的基礎上進行了更新與調整。

重點參考來源:

  1. Gitbook: Docker — 從入門到實踐
  2. Docker+Hadoop+Hive+Presto 使用Docker部署Hadoop環境和Presto
  3. Docker部署Hadoop集羣
  4. docker docs
  5. Linux vi/vim的使用
  6. Hadoop命令手冊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章