hadoop + spark+ hive 集羣搭建(apache版本)

0. 引言

hadoop 集羣,初學者順利將它搭起來,肯定要經過很多的坑。經過一個星期的折騰,我總算將集羣正常跑起來了,所以,想將集羣搭建的過程整理記錄,分享出來,讓大家作一個參考。
由於搭建過程比較漫長,所以,這篇文章應該也會很長,希望大家能耐心看完。

1. 集羣環境和版本說明

3臺CentOS 7.4 的服務器,4CPU,8G內存;
jdk  1.8
hadoop  2.7.7
spark 2.3.0
hive   2.1.1

節點和主機hostname對應關係:

主節點:    172.18.206.224    nn1   Namenode and YARN Resourcemanage 
從節點1:  172.18.206.228    dn1   Datanode and YAR   Nodemanager
從節點2:  172.18.206.229    dn2   Datanode and YARN   Nodemanager

爲hadoop集羣,創建一個non-root 用戶,我使用的用戶名是 hadoop。安裝目錄統一在hadoop用戶的家目錄 /data/hadoop 下。

2. hadoop 集羣安裝

2.1 安裝 jdk 1.8版本

由於 hadoop 集羣需要java 環境的支持,所以,在安裝集羣之前,首先確認你的系統是否已經安裝了jdk,檢查如下:

[root@ND-ES-3 ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

如果沒有安裝 jdk 1.8 以上的版本,則需要卸載舊版本重新安裝,在這裏,我選擇的jdk是oracal提供的版本,其他公司提供的jdk,我測試的時候,好像和apache hadoop 不兼容,總是報錯。

下載 : jdk-8u181-linux-x64.rpm ,
然後上傳到服務器,安裝:

rpm  -ivh  jdk-8u181-linux-x64.rpm

安裝完成後,檢查 java -version 輸出正確,就可以了。

2.2 修改 /etc/hosts 文件,實現ssh免密碼登錄

在 nn1,dn1 和 dn2 服務器上修改 /etc/hosts 文件,方便主機之間通過hostname也能夠訪問通信:
vi /etc/hosts :

172.18.206.224      nn1    nn1.cluster1.com
172.18.206.228      dn1    dn1.cluster1.com
172.18.206.229      dn2    dn2.cluster1.com

其實使用,什麼hostname,都是可以的,看使用習慣。

創建 hadoop 用戶:

在所有服務器上創建,可以先不用密碼

useradd  -d  /data/hadoop/   hadoop

然後,在nn1 上爲hadoop 創建密鑰文件,用來ssh 免密碼登錄,這是爲了在後面hadoop集羣通信時,不需要每次都輸入密碼,那麼麻煩。
創建密鑰對的方式:

su  -  hadoop
ssh-key-gen  -t  rsa
mv   id_rsa.pub  authorized_keys
chmod  0700  /data/hadoop/.ssh 
chmod  0600  /data/hadoop/.ssh/authorized_keys

然後將 authorized_keys 和 id_rsa 密鑰對複製到其他兩臺主機的 /data/hadoop/.ssh 目錄。

測試,用hadoop ssh 登錄其他兩臺服務器:

[root@ND-ES-3 ~]# su - hadoop
Last login: Mon Sep 10 09:32:13 CST 2018 from 183.6.128.86 on pts/1
[hadoop@ND-ES-3 ~]$ ssh dn1
Last login: Thu Sep  6 15:49:20 2018

Welcome to Alibaba Cloud Elastic Compute Service !

[hadoop@ND-DB-SLAVE ~]$ 

[hadoop@ND-ES-3 ~]$ ssh dn2
Last login: Fri Sep  7 16:43:04 2018

Welcome to Alibaba Cloud Elastic Compute Service !

[hadoop@ND-BACKUP ~]$ 

默認第一次ssh登錄的時候,需要輸入確認接收 密鑰登錄的,直接確認就可以了。
ssh 面密碼登錄打通之後,就可以繼續往下做了。

2.3 安裝 hadoop-2.7.7

安裝過程比較簡單,先下載對應版本的壓縮包,再解壓縮就可以使用了,我選的版本是 hadoop-2.7.7.tar.gz。

tar   -xvzf   /usr/local/src/hadoop-2.7.7.tar.gz   
mv   hadoop-2.7.7    /data/hadoop/

2.4 設置hadoop的環境變量

可以修改 hadoop 家目錄 /data/hadoop/.bash_profile文件
vi /data/hadoop/.bash_profile,添加如下:


## JAVA env variables
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
## HADOOP env variables
export HADOOP_HOME=/data/hadoop/hadoop-2.7.7
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

注意根據自己的實際情況修改其中的路徑。

然後, source ~/.bash_profile 使變量設置生效。

2.5 修改hadoop配置文件 core-site.xml

vi /data/hadoop/hadoop-2.7.7/etc/hadoop/core-site.xml

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://nn1:9000</value>
</property>
</configuration>

2.6 修改 hdfs-site.xml

<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/namenode2</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2</value>
</property>
</configuration>

2.7 修改 mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

2.8 修改 yarn-site.xml

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>172.18.206.224:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>172.18.206.224:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>172.18.206.224:8050</value>
</property>
</configuration>

2.9 修改 slaves 文件,添加兩個slave 主機的ip地址

[hadoop@ND-BACKUP hadoop]$ cat slaves
172.18.206.228
172.18.206.229

2.10 修改 hadoop-env.sh

將 hadoop-env.sh 文件裏的 JAVA_HOME 修改爲:

export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))

2.11 將 /data/hadoop/hadoop-2.7.7 安裝目錄複製到dn1和dn2兩臺服務器

> scp  -r  /data/hadoop/hadoop-2.7.7    hadoop@dn1:/data/hadoop/
> scp  -r  /data/hadoop/hadoop-2.7.7    hadoop@dn2:/data/hadoop/

2.12 在 nn1 創建 NameNode 目錄

mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/namenode2

2.13 在dn1和dn2 創建 datanode 目錄

mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2
chmodu 755 /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2

2.14 關閉 selinux 和 iptables 防火牆

iptabels -F
setenforce 0

2.15 在 nn1 格式化 namenode

hdfs namenode -format

2.16 啓動hadoop 集羣(只在nn1 操作就可以了)

cd /data/hadoop/hadoop-2.7.7/
./sbin/start-all.sh

2.17 檢查

在 nn1 :

$ jps
3042 NameNode
3349 SecondaryNameNode
3574 ResourceManager
11246 Jps

在 dn1或者 dn2:

$ jps
26642 NodeManager
14569 Jps
26491 DataNode

檢查是否有兩個激活的節點

[hadoop@ND-ES-3 ~]$ hdfs dfsadmin -report
Configured Capacity: 3246492319744 (2.95 TB)
Present Capacity: 2910313086244 (2.65 TB)
DFS Remaining: 2907451403556 (2.64 TB)
DFS Used: 2861682688 (2.67 GB)
DFS Used%: 0.10%
Under replicated blocks: 34
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (2):

Name: 172.18.206.228:50010 (dn1)
Hostname: dn1
Decommission Status : Normal
Configured Capacity: 1082119344128 (1007.80 GB)
DFS Used: 1430839296 (1.33 GB)
Non DFS Used: 161390100480 (150.31 GB)
DFS Remaining: 864172031634 (804.82 GB)
DFS Used%: 0.13%
DFS Remaining%: 79.86%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 3
Last contact: Mon Sep 10 17:26:59 CST 2018

Name: 172.18.206.229:50010 (dn2)
Hostname: dn2
Decommission Status : Normal
Configured Capacity: 2164372975616 (1.97 TB)
DFS Used: 1430843392 (1.33 GB)
Non DFS Used: 9560809472 (8.90 GB)
DFS Remaining: 2043279371922 (1.86 TB)
DFS Used%: 0.07%
DFS Remaining%: 94.41%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 3
Last contact: Mon Sep 10 17:26:59 CST 2018

[hadoop@ND-ES-3 ~]$ 

如果上面的檢查都通過了,那麼hadoop集羣就已經順利搭建了。
其實,你還可以通過web頁面訪問,來查看hadoop的情況,例如,通過50070端口:

http://host_ip:50070

或者通過 8088端口,查看resource manager資源情況:

http://host_ip:8088

OK,以上就是hadoop集羣的搭建過程,下面,我們繼續搭建spark集羣。

3. 安裝 spark on yarn

首先,spark 和hadoop 的yarn 整合後的運行模式有兩種,一種是client模式,另一種是cluster 模式。默認情況下,spark 安裝之後,會以cluster模式運行,一般我們都選擇cluster 模式。具體client模式和cluster模式的原理是什麼,請大家有興趣的,可以去搜索更多的文檔來閱讀。

3.1 下載並安裝 spark

我使用的 spark版本是:

spark-2.3.0-bin-hadoop2.7.tgz

上傳到服務器 /usr/local/src/ 目錄,然後解壓:

tar -xvzf /usr/local/src/spark-2.3.0-bin-hadoop2.7.tgz
mv /usr/local/src/spark-2.3.0-bin-hadoop2.7 /data/hadoop/spark-2.3.0
創建軟連接:
cd /data/hadoop
ln -s spark-2.3.0 spark # 別問爲什麼用軟連接,這是爲了以後多個版本切換方便,高手都這麼幹

現在,spark已經安裝在 /data/hadoop/spark 目錄了。

3.2 添加系統關於 spark 的一些環境變量

在 /data/hadoop/.bash_profile 文件添加:

## spark
export SPARK_HOME=/data/hadoop/spark
export HADOOP_CONF_DIR=/data/hadoop/hadoop-2.7.7/etc/hadoop
export LD_LIBRARY_PATH=/data/hadoop/hadoop-2.7.7/lib/native:$LD_LIBRARY_PATH
export PATH=/data/hadoop/spark/bin:$PATH

然後,使配置生效:

source .bash_profiel

這裏其實有一個問題,這樣每次添加環境變量,那麼 PATH變量就會變得越來越長,如果你用的服務器是生產環境長時間都不會重啓的,那也沒辦法了。

3.3 修改 spark-env.xml

複製安裝包裏,自帶的官方模板文件:

cd /data/hadoop/spark/conf
cp spark-env.sh.template spark-env.sh

添加如下的內容:

export SPARK_HOME=/data/hadoop/spark
#export SCALA_HOME=/lib/scala
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
export HADOOP_HOME=/data/hadoop/hadoop-2.7.7
#export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
#export YARN_CONF_DIR=$YARN_HOME/etc/hadoop
#export SPARK_LOCAL_DIRS=/data/haodop/spark
export SPARK_LIBARY_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$HADOOP_HOME/lib/native
#export SPAR_MASTER_PORT=7077
export SPARK_MASTER_HOST=nn1

上面的配置中,有些註釋掉的就是不用的,我複製過來,就不改了。

3.4 修改 slaves 文件

將官方模板複製一份:
mv slaves.template slaves
vi slaves ,添加如下的內容:
nn1
dn1
dn2

3.5 修改 spark-defaults.cof

將官方的複製一份:

mv spark-defaults.conf.templates spark-defaults.conf

添加如下的配置:

vi spark-defaults.conf

spark.eventLog.enabled             true
spark.eventLog.dir                      hdfs://nn1:9000/spark-logs
spark.history.provider             org.apache.spark.deploy.history.FsHistoryProvider
spark.history.fs.logDirectory       hdfs://nn1:9000/spark-logs
spark.history.fs.update.interval   10s
spark.history.ui.port                    18080

這個文件主要是配置spark的內存使用或者分配的,如果你對 memory allocation的分配不熟悉,暫時可以不配置這個文件,讓spark按照默認的參數運行,也是可以的。

 

3.6 測試 spark

如果上面的環境變量設置都沒有問題,那麼可以進行下面的簡單例子測試。
(spark-defaults.conf 文件可以不配置):

[hadoop@ND-ES-3 spark]$ ./bin/run-example SparkPi 10
2018-09-11 11:17:47 INFO SparkContext:54 - Running Spark version 2.3.0
2018-09-11 11:17:47 INFO SparkContext:54 - Submitted application: Spark Pi
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing view acls to: hadoop
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing modify acls to: hadoop
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing view acls groups to:
2018-09-11 11:17:47 INFO SecurityManager:54 - Changing modify acls groups to:

spark 自帶了一些例子。以上是計算圓周率的例子以及部分輸出的內容。如果計算成功,在輸出結束後,你往上翻,會看到:

Pi is roughly 3.141415141415141

3.7 將 spark 的安裝目錄複製到其他節點

chown -R hadoop:hadoop /data/hadoop/spark
scp -r /data/hadoop/spark dn1:/data/hadoop/
scp -r /data/hadoop/spark dn2:/data/hadoop/

複製完成之後,注意修改 dn1 和 dn2 節點上的 /data/hadoop/.bash_profile的系統變量

3.8 啓動spark

啓動spark 前,要確認 hadoop集羣已經在運行,
啓動spark:

cd /data/hadoop/spark

爲了省事,一次性啓動所有master和worker:

./sbin/start-all.sh

3.9 檢查啓動情況

nn1 啓動情況:

[hadoop@ND-ES-3 conf]$ jps
3042 NameNode
8627 RunJar
3349 SecondaryNameNode
3574 ResourceManager
10184 Master
10332 Worker
4654 Jps

dn1 和 dn2:

[hadoop@ND-DB-SLAVE ~]$ jps
26642 NodeManager
10679 Jps
29960 Worker
26491 DataNode
[hadoop@ND-DB-SLAVE ~]$

看到 worker 和 master 啓動就可以了。

4. 安裝scala

在安裝完spark 之後,先安裝 scala ,過程比較簡單,
下載,並上傳安裝包到服務器,解壓縮:

tar xvzf scala-2.12.6.tgz
創建軟連接:
ln -s scala-2.12.6 /data/hadoop/scala

修改scalac 的PATH 變量:

vi .bash_profile

# scala 
export SCALA_HOME=/lib/scala
export PATH=${SCALA_HOME}/bin:$PATH

生效:

source .bash_profiel

Ok,scala 就配置好,可以使用了。  

5. 安裝 hive

當你的hadoop 集羣,和spark 集羣都安裝完成之後,就可以開始安裝hive 了。
hive是這篇文章的最後一部分了,也是依賴條件比較多的一個組件。

先將我自己在安裝hive後,總結的一些坑寫出來吧:

第一,hadoop和spark功能要正常。
第二,hive需要和mysql數據庫結合,所以又要配置好mysql數據庫,做好用戶授權。
第三,注意在hive-site.xml配置文件裏,把jdbc驅動、spark引擎配置好。

特別是第三點,在很多資料裏都沒提過的。如果發現自己配置已經做好了,在做測試驗證的時候,總是不成功,那麼,最好的辦法,就是根據報錯,一個個問題去解決。

5.1 安裝mysql-5.7

hive需要和數據庫結合使用,這樣在進行SQL語句操作時就可以像操作mysql那樣,不需要寫複製的代碼了。
我是用二進制編譯安裝mysql的方式,因爲可以自己配置mysql的參數。
下載安裝包的地址:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

創建用戶和用戶組

groupadd mysql
useradd -g mysql -s /sbin/nologin mysql

解壓到指定目錄

tar -zxvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz -C /usr/local
cd /usr/local/
ln -s mysql-5.7.17-linux-glibc2.5-x86_64 mysql
或者
mv mysql-5.7.17-linux-glibc2.5-x86_64 mysql

配置PATH目錄

vi /etc/profile.d/mysql.sh
添加:
export PATH=$PATH:/usr/local/mysql/bin
然後,source /etc/profile.d/mysql.sh

mysql目錄資源規劃

文件類型 實例3306 軟鏈
數據datadir /usr/local/mysql/data /data/mysql/data
參數文件my.cnf /usr/local/mysql/etc/my.cnf
錯誤日誌log-error /usr/local/mysql/log/mysql_error.log
二進制日誌log-bin /usr/local/mysql/binlogs/mysql-bin /data/mysql/binlogs/mysql-bin
慢查詢日誌slow_query_log_file /usr/local/mysql/log/mysql_slow_query.log
套接字socket文件 /usr/local/mysql/run/mysql.sock   
pid文件 /usr/local/mysql/run/mysql.pid   

備註:考慮到數據和二進制日誌比較大,需要軟鏈,實際/data/mysql 在服務器的數據盤,磁盤空間充足,如果你不考慮磁盤空間問題,可以安裝默認的路徑安排。

mkdir -p /data/mysql/{data,binlogs,log,etc,run}
ln -s /data/mysql/data /usr/local/mysql/data
ln -s /data/mysql/binlogs /usr/local/mysql/binlogs
ln -s /data/mysql/log /usr/local/mysql/log
ln -s /data/mysql/etc /usr/local/mysql/etc
ln -s /data/mysql/run /usr/local/mysql/run
chown -R mysql.mysql /data/mysql/
chown -R mysql.mysql /usr/local/mysql/{data,binlogs,log,etc,run}

備註:也可以只對 datadir 和 binlog 目錄進行軟連接

配置 my.cnf 文件
刪除系統自帶的 my.cnf

rm -rf /etc/my.cnf

編輯 my.cnf

vi /usr/local/mysql/etc/my.cnf
添加以下內容:
[client]
port = 3306
socket = /usr/local/mysql/run/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/run/mysql.sock
pid_file = /usr/local/mysql/run/mysql.pid
datadir = /usr/local/mysql/data
default_storage_engine = InnoDB
max_allowed_packet = 512M
max_connections = 2048
open_files_limit = 65535
skip-name-resolve
lower_case_table_names=1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
innodb_buffer_pool_size = 1024M
innodb_log_file_size = 2048M
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 0
key_buffer_size = 64M
log-error = /usr/local/mysql/log/mysql_error.log
log-bin = /usr/local/mysql/binlogs/mysql-bin
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/log/mysql_slow_query.log
long_query_time = 5
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_type = 0
query_cache_size = 0
server-id=1

初始化數據庫

mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

在數據庫會有一個臨時密碼生成,請記錄下來,等會要用到:

[hadoop@ND-ES-3 mysql]$ sudo grep 'temporary password' /usr/local/mysql/log/mysql_error.log 
2018-09-08T05:03:32.509910Z 1 [Note] A temporary password is generated for root@localhost: <,Nhx3+7z)UY

生成ssl

mysql_ssl_rsa_setup --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/

設置啓動項(CentOS 7)

cd /usr/lib/systemd/system
touch mysqld.service

輸入如下內容:

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/usr/local/mysql/run/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables
#ExecStartPre=/usr/bin/mysqld_pre_systemd

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/run/mysqld.pid $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 65535

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

加載並啓動mysql

systemctl daemon-reload
systemctl enable mysqld.service
systemctl is-enabled mysqld

systemctl start mysql

Securing the Initial MySQL Accounts

執行 /usr/local/mysql/bin/mysql_secure_installation
剛剛記錄下來的臨時密碼在這裏可以排上用場了,重新配置root密碼,清空測試數據庫,禁止匿名用戶。

導入時區

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

安裝完mysql,就可以正式開始hive 安裝了

5.2. 安裝hive

相同的套路,將hive的安裝包上傳到服務器,然後解壓縮,創建軟連接,,我使用的版本是:apache-hive-2.1.1-bin.tar.gz

tar xvzf apache-hive-2.1.1-bin.tar.gz
mv apache-hive-2.1.1-bin /data/hadoop/hive-2.1.1
cd /data/hadoop
ln -s hive-2.1.1 hive

修改 PATH
vi /etc/profile.d/hive.sh

export HIVE_HOME=/data/hadoop/hive
export HIVE_CONF_DIR=$HIVE_HOME/conf
export PATH=$PATH:$HIVE_HOME/bin

生效:

source /etc/profile.d/hive.sh

下載mysql-connector 驅動
因爲hive 要和mysql結合使用,所以,需要下載 驅動jar包。我下載用的是:mysql-connector-java-5.1.47.tar.gz。將它解壓縮後,將裏面的jar包,複製到/data/hadoop/hive/lib 目錄。如:

[hadoop@ND-ES-3 lib]$ ls /data/hadoop/hive/lib | grep "mysql-connector*"
mysql-connector-java-5.1.47-bin.jar
mysql-connector-java-5.1.47.jar

登錄mysql數據庫,創建一個用戶,給hive連接用,設置好授權密碼:

grant all privileges on . to 'hive'@'%' identified by '123456';

以上,創建了一個用戶hive,它的密碼是 123456;

整合spark 和 hive

將 spark/jars 文件下得scala-library spark-core spark-network-common包複製到hive/lib下

這步不能少!!!

配置 hive-env.sh文件
vi hive-env.sh
添加如下內容:

#hadoop_home路徑
HADOOP_HOME=/data/hadoop/hadoop-2.7.7
#hive配置文件存放路徑
export HIVE_CONF_DIR=/data/hadoop/hive/conf
#hive相關jar存放路徑
export HIVE_AUX_JARS_PATH=/data/hadoop/hive/lib

配置 hive-site.xml 文件
cp hive-default.xml.template hive-site.xml ,然後修改其中的一些默認參數。

修改,使用mysql connector:

<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
</property>

修改,配置msyql地址:

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://dn2:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
    <description>JDBC connect string for a JDBC metastore</description>
</property>

修改,數據庫名字hive

<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>Username to use against metastore database</description>
</property>

修改,連接mysql的密碼是123456:

<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
</property>

在/data/hadoop/hive 創建 temp 目錄:

mkdir /data/hadoop/hive/temp

然後,繼續修改hive-site.xml 文件中對應參數的<value>
1

<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/data/hadoop/hive/temp/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>

2

<property>
<name>hive.exec.local.scratchdir</name>
<value>/data/hadoop/hive/temp</value>
<description>Local scratch space for Hive jobs</description>
</property>

3

<property>
<name>hive.downloaded.resources.dir</name>
<value>/data/hadoop/hive/temp</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>

創建以下的dfs 目錄

hadoop fs -mkdir /data
hadoop fs -mkdir /data/hive
hadoop fs -mkdir /data/hive/warehouse
hadoop fs -mkdir /data/hive/tmp
hadoop fs -mkdir /data/hive/log

然後,繼續修改 hive-site.xml文件
1.

<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://nn1:9000/data/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>

2.

<property>
<name>hive.querylog.location</name>
<value>hdfs://nn1:9000/data/hive/log</value>
<description>Location of Hive run time structured log file</description>
</property>

3.

<property>
<name>spark.enentLog.dir</name>
<value>hdfs://nn1:9000/spark-logs</value>
</property>

4.

<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://nn1:9000/data/hive/tmp</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description>

其他的修改,同樣重要,
1.

<property>
<name>hive.stats.dbclass</name>
<value>jdbc:msyql</value>
<description>

最後, 將 spark/jars 文件下得scala-library spark-core spark-network-common包複製到hive/lib下
hive-site.xml添加:

<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>
<property>
<name>spark.home</name>
<value>/data/hadoop/spark</value>
</property>
<property>
<name>spark.enentLog.enabled</name>
<value>true</value>
</property>
<property>
<name>spark.enentLog.dir</name>
<value>hdfs://nn1:9000/spark-logs</value>
</property>
<property>
<name>spark.serializer</name>
<value>org.apache.spark.serializer.KryoSerializer</value>
</property>
<property>
<name>spark.executor.extraJavaOptions</name>
<value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value>
</property>

這裏要注意,如果spark-logs 路徑沒有創建,則需要先用hadoop創建:

hadoop fs -mkdir /spark-logs

另一個,spark需要開啓日誌記錄的功能,參考上面提到的 spark-defaults.conf 文件。

OK,經過漫長的配置,終於將hive-site.xml 文件配置完成了。下面開始測試。

初始化hive元數據庫

schematool -dbType mysql -initSchema

啓動hive數據庫
直接在命令行輸入hive進入CLI模式:

[hadoop@ND-ES-3 hive]$ hive
which: no hbase in (/lib/scala/bin:/data/hadoop/spark/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/java/jdk1.8.0_181-amd64/bin:/data/hadoop/hadoop-2.7.7/sbin:/data/hadoop/hadoop-2.7.7/bin:/usr/local/mysql/bin:/data/hadoop/hive/bin:/data/hadoop/.local/bin:/data/hadoop/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/hadoop/hive-2.1.1/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Logging initialized using configuration in file:/data/hadoop/hive-2.1.1/conf/hive-log4j2.properties Async: true
hive> show databases;
OK
default
Time taken: 0.769 seconds, Fetched: 1 row(s)
hive> 

剛開始的輸出信息,不影響使用,只要show databases;命令能輸出正確信息,就已經配置好了。

6. 結語

不得不說,配置這個 hadoop+spark+hive的環境,對於初學者來說確實太麻煩了。
我的安裝過程,雖然能將集羣順利運行了,但是仍然有很多地方需要優化,例如對於spark、hadoop、hive 它們的內存資源分配,這篇文章就沒有做深入的討論。希望文章能幫助更多的人在搭建集羣時,節省更多的時間,將時間花在更有意思的地方,幫助大家能儘早開始體驗hadoop的各種功能。
後續的優化方向,會深入學習hadoop集羣的性能,有時間還要看看它們的源代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章