本指南詳細記錄了在 Hadoop 2.7.1 叢集環境下,部署 Apache Hive 1.2.1 並整合 Spark 及 Sqoop 的完整流程。安裝架構採用 Hive Server2 模式,元資料儲存於 MySQL 5.7.10,並透過 ZooKeeper 實現高可用。參考官方 GettingStarted 文件與《Hive 0.12.0 安裝指南》編寫,適合生產環境部署參考。
| 端口 | 服務 | 說明 |
|---|---|---|
| 10000 | HiveServer2 Thrift | hive.server2.thrift.port,啟動 hiveserver2 時監聽 |
| 9083 | Metastore RPC | hive.metastore.uris,啟動 hive --service metastore 時監聽 |
| 3306 | MySQL | 預設連接埠 |
下載 Linux-Generic (glibc 2.5) x86_64 壓縮包,解壓至 /usr/local 並建立軟連結。建議以 root 身份安裝,避免權限問題。關鍵步驟如下:
# 建立 mysql 使用者與群組
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 解壓與軟連結
cd /usr/local
tar xzf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz
ln -s mysql-5.7.10-linux-glibc2.5-x86_64 mysql
# 資料目錄規劃(採用軟連結方式)
mkdir -p /data/mysql/data
ln -s /data/mysql/data /usr/local/mysql/data
chmod 770 /data/mysql/data
chown -R mysql:mysql /data/mysql/data
chown -R mysql:mysql /usr/local/mysql
# 初始化資料庫(記住生成的臨時 root 密碼)
bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp
bin/mysql_ssl_rsa_setup
# 權限修正與啟動
chown -R root /usr/local/mysql
chown -R mysql /data/mysql/data
bin/mysqld_safe --user=mysql &
# 驗證與設定開機自啟
netstat -lpnt | grep 3306
cp support-files/mysql.server /etc/init.d/mysql.server
注意:MySQL 5.7.6+ 預設要求 SSL 連線,若不使用 SSL 需在連線字串加入 useSSL=false。
CREATE DATABASE IF NOT EXISTS hive;
CREATE USER 'hive' IDENTIFIED BY 'hive2016';
GRANT ALL ON hive.* TO 'hive'@'localhost' IDENTIFIED BY 'hive2016';
GRANT ALL ON hive.* TO 'hive'@'172.25.39.166' IDENTIFIED BY 'hive2016';
GRANT ALL ON hive.* TO 'hive'@'172.25.40.171' IDENTIFIED BY 'hive2016';
若配置 MySQL 主主同步且不同步 mysql 系統庫,需在各節點分別執行上述建庫授權操作。
cd /data
tar xzf apache-hive-1.2.1-bin.tar.gz
mv apache-hive-1.2.1-bin hive-1.2.1
ln -s hive-1.2.1 hive
下載 mysql-connector-java-5.1.38.tar.gz,解壓後將 mysql-connector-java-5.1.38-bin.jar 複製至 $HIVE_HOME/lib 目錄。
編輯 /etc/profile 或 ~/.profile:
export HIVE_HOME=/data/hadoop/hive
export PATH=$HIVE_HOME/bin:$PATH
進入 $HIVE_HOME/conf,複製模板檔:
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j.properties.template hive-log4j.properties
cp hive-exec-log4j.properties.template hive-exec-log4j.properties
HADOOP_HOME=/data/hadoop/current
| 屬性名稱 | 設定值 | 說明 |
|---|---|---|
| javax.jdo.option.ConnectionURL | jdbc:mysql://172.25.39.166:3306/hive?useSSL=false | MySQL 連線字串,關閉 SSL |
| javax.jdo.option.ConnectionDriverName | com.mysql.jdbc.Driver | JDBC 驅動類別 |
| javax.jdo.option.ConnectionUserName | hive | 資料庫使用者 |
| javax.jdo.option.ConnectionPassword | hive2016 | 資料庫密碼 |
| hive.metastore.schema.verification | true | 啟用結構驗證 |
| hive.zookeeper.quorum | 10.12.154.77,10.12.154.78,10.12.154.79 | ZK 叢集地址,建議用主機名 |
| hive.metastore.uris | thrift://172.25.40.171:9083 | Metastore RPC 服務位址 |
| hive.metastore.warehouse.dir | /data/hadoop/hive/warehouse | 資料倉庫根目錄,需預先建立 |
| hive.server2.thrift.bind.host | 172.25.40.171 | 綁定 IP,允許遠程訪問;可設 0.0.0.0 |
| hive.exec.scratchdir | /data/hadoop/hive/tmp | 暫存目錄,需建立 |
| hive.exec.local.scratchdir | /data/hadoop/hive/tmp/scratch | 本地暫存目錄 |
| hive.downloaded.resources.dir | /data/hadoop/hive/tmp/resources | 下載資源目錄 |
| hive.querylog.location | /data/hadoop/hive/tmp/querylog | 查詢日誌目錄 |
| hive.server2.logging.operation.log.location | /data/hadoop/hive/tmp/operation | 操作日誌目錄 |
# hive-log4j.properties
hive.log.dir=/data/hadoop/hive/logs
# hive-exec-log4j.properties
hive.log.dir=/data/hadoop/hive/logs/exec
對應建立 /data/hadoop/hive/logs 及 /data/hadoop/hive/logs/exec 目錄。
schematool -dbType mysql -initSchema(僅需在一台機器執行一次)hive --service metastore &hiveserver2 &hive 或使用 Beeline:beeline -u jdbc:hive2://172.25.40.171:10000 -n hive -p hive2016將 hive/bin、hive/lib、hive/conf、hive/examples 打包分發至其他節點,透過 Beeline 遠程執行。注意:直接使用 hive 命令遠程執行可能卡住,建議統一使用 Beeline。
CREATE TABLE pokes(foo INT, bar STRING);
CREATE TABLE invites(foo INT, bar STRING) PARTITIONED BY (ds STRING);
SHOW TABLES;
DESCRIBE invites;
LOAD DATA LOCAL INPATH '../examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2014');
SELECT * FROM invites LIMIT 2;
部署兩套 Hive 服務,元資料庫採用 MySQL 主主同步,Hive 採一主一熱備模式。建議同一時刻僅一個 Hive 提供服務,雙活雖可行但需謹慎評估。
spark-env.sh 加入:export HIVE_HOME=/data/hadoop/hivehive-site.xml、hive-log4j.properties 至 Spark conf 目錄./spark-sql --master yarn --driver-class-path /data/hadoop/hive/lib/mysql-connector-java-5.1.38-bin.jar執行 show tables 即可看到 Hive 建立的表。
export HADOOP_COMMON_HOME=/data/hadoop
export HADOOP_MAPRED_HOME=/data/hadoop/share/hadoop/common
export HBASE_HOME=/data/hbase
export HIVE_HOME=/data/hive
export ZOOCFGDIR=/data/zookeeper/conf
複製模板即可,通常無需修改。
# 列出資料庫
./sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username zhangsan --password zhangsan2016
# 依 MySQL 表建立 Hive 表(支援分區)
./sqoop create-hive-table --connect jdbc:mysql://127.0.0.1:3306/test --username zhangsan --password zhangsan2016 --table t_test --hive-table t_test_2016 --hive-partition-key dt --hive-partition-value 20160101
# 匯入資料至 Hive(建議加 --direct 使用 mysqldump 加速)
./sqoop import --connect jdbc:mysql://127.0.0.1:3306/test --username zhangsan --password 'zhangsan2016' --table t_test --hive-import -m 6 --hive-table t_test_2016 --direct
| 錯誤現象 | 原因分析 | 解決方法 |
|---|---|---|
| TIMESTAMP with implicit DEFAULT value is deprecated | MySQL 5.6+ timestamp 預設值行為變更 | 初始化加參數 --explicit_defaults_for_timestamp |
| Can't find error-message-file '/usr/local/mysql/share/errmsg.sys' | 安裝目錄非預設 /usr/local/mysql,或 data 目錄非空 | 指定 --basedir 與 --datadir,確保 data 目錄為空 |
| Failed to connect to MetaStoreServer | Metastore 服務未啟動或網路不通 | 啟動 metastore;開啟 DEBUG 日誌排查:hive.root.logger=DEBUG,WARN,DRFA |
| Version information not found in metastore | 未執行 schematool 初始化 | 執行 schematool -dbType mysql -initSchema |
| java.net.URISyntaxException: Relative path in absolute URI | hive-site.xml 中使用了 ${system:java.io.tmpdir} | 將 4 處 system:java.io.tmpdir 替換為絕對路徑 |
| Establishing SSL connection without server's identity verification | MySQL 5.5.45+/5.6.26+/5.7.6+ 預設要求 SSL | JDBC URL 加 useSSL=false |
| SPARK_CLASSPATH was detected | Spark 1.0+ 棄用 SPARK_CLASSPATH 環境變數 | 改用 --driver-class-path 或 spark.executor.extraClassPath |