一、環境和應用準備
環境: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
下載至本地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&characterEncoding=UTF-8&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
- 注:如果啓動中出現報錯,參考:安裝Hive過程中,出現Exception in thread “main” java.lang.IllegalArgumentException: java.net.URISyntaxException
- hive運行語句時報錯,參考:hive啓動報錯 java.net.URISyntaxException: Relative path in absolute URI
本文參考了官方文檔及很多博客,並在前輩攻略的基礎上進行了更新與調整。
重點參考來源: