1. 程式人生 > >基於Spark2.0搭建Hive on Spark環境(Mysql本地和遠端兩種情況)

基於Spark2.0搭建Hive on Spark環境(Mysql本地和遠端兩種情況)

Hive的出現可以讓那些精通SQL技能、但是不熟悉MapReduce 、程式設計能力較弱與不擅長Java語言的使用者能夠在HDFS大規模資料集上很方便地利用SQL 語言查詢、彙總、分析資料,畢竟精通SQL語言的人要比精通Java語言的多得多。Hive適合處理離線非實時資料。

hive on spark大體與SparkSQL結構類似,只是SQL引擎不同,但是計算引擎都是spark!

這裡說的Hive on Spark是Hive跑在Spark上,用的是Spark執行引擎,而不是MapReduce。

sparksql和hive on spark時間差不多,但都比hive on mapreduce快很多,官方資料認為spark會比傳統mapreduce快10-100倍。


1、mysql在本地的情況

依賴環境

JDK:1.8    Hadoop 2.7.4    spark版本2.1.1  centos:7.3  
hadoop001(master)  主機: 192.168.119.51
hadoop002(slave1)  從機: 192.168.119.52 
hadoop003(slave2)  從機: 192.168.119.53

一臺物理機(windows10 64位),安裝三臺虛擬機器(master ,slave1 ,slave2)。

安裝

Mysql,Hive都安裝在master這臺機器上。首先在master上面安裝Mysql5.7(參考其他資料安裝)。

下載解壓

下載apache-hive-2.3.2-bin.tar.gz,通過rz命令上傳到master。

解壓檔案,tar -zxvf apache-hive-2.3.2-bin.tar.gz。修改資料夾名稱,mv apache-hive-2.3.2-bin hive。

環境變數

如果是對所有的使用者都生效就修改vi /etc/profile 檔案

如果只針對當前使用者生效就修改 vi ~/.bahsrc 檔案

sudo vi /etc/profile

#hive
export PATH=${HIVE_HOME}/bin:$PATH
export HIVE_HOME=/home/hadoop/app/hive/

使環境變數生效,執行 source /etc/profile使/etc/profile檔案生效

Hive 配置 Hadoop HDFS


在conf目錄下,拷貝模板進行配置:
mv hive-default.xml.template hive-site.xml

mv hive-env.sh.template hive-env.sh

在目錄$HIVE_HOME/bin下面,修改檔案hive-env.sh,增加以下內容:
export HADOOP_HOME=/home/hadoop/app/hadoop
export HIVE_CONF_DIR=/home/hadoop/app/hive/conf

export HIVE_AUX_JARS_PATH=/home/hadoop/app/hive/lib

修改hive-site.xml檔案,修改內容如下:

<configuration>
<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://192.168.119.51:3306/hive_db?createDatabaseIfNotExist=true</value>
   <description>JDBC connect string for a JDBC metastore</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.jdbc.Driver</value>
   <description>Driver class name for a JDBC metastore</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionUserName</name>
   <value>hive</value>
   <description>username to use against metastore database</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>hive</value>
   <description>password to use against metastore database</description>
 </property>
 </configuration>


防止hive啟動報錯:system:java.io.tmpdir等
解決方法:
在hive-site.xml中新增

<property>
   <name>system:java.io.tmpdir</name>
   <value>/home/hadoop/app/hive/tmpdir</value>
</property>
<property>
     <name>system:user.name</name>
     <value>hive</value>
</property>


hive-site配置內的其他內容可以不用動。

執行進入mysql,新增hive使用者,並授權。

mysql> create user 'hive'@'%' identified by 'hive';
mysql> grant all on *.* to 'hive'@localhost identified by 'hive';
mysql> flush privileges;

拷貝一個mysql的連線jar包到lib目錄下,我用的是 mysql-connector-java-5.1.42.jar

這樣就可以開始初始化了,先啟動hadoop,然後在hive的bin目錄下執行命令:

./schematool -initSchema -dbType mysql
如果看到如下,表示初始化成功
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Initialization script completed

schemaTool completed

配置hive on spark

將hadoop的配置檔案core-site.xml和hive的配置檔案hive-site.xml拷貝到spark的conf目錄下,並將mysql-connector-java-5.1.42.jar拷貝到spark的jars目錄下。

進入spark的bin目錄,執行如下命令:

[email protected] bin]$ ./spark-sql \
> --master spark://hadoop001:7077 \
> --executor-memory 1g \
> --total-executor-cores 2 \

> --driver-class-path /home/hadoop/app/hive/lib/mysql-connector-java-5.1.42-bin.jar;

mysql-connector-java-5.1.42.jar拷貝到spark的jars目錄後--driver該條命令可以省略

進入spark-sql。

測試spark-sql

首先在本地新建一個叫person.txt的檔案,內容如下:

1,zhangsan,18
2,lisi,20
3,wangwu,22
4,zhaoliu,24

spark-sql>show databases;

可以看到有一個預設的資料庫名字叫default。(就是配置中的初始化的hive_db資料庫)

使用預設資料庫

spark-sql>use default;

新建person資料表

spark-sql>create table person(id int,name string,age int) row format delimited fields terminated by ",";

載入本地資料資訊

spark-sql>load data local inpath "/home/hadoop/files/person.txt" into table person;

查詢表資訊

spark-sql>select * from person order by age desc;

可以得到測試資料:

4,zhaoliu,24
3,wangwu,22
2,lisi,20
1,zhangsan,18

說明hive on spark 安裝成功。

2、mysql在遠端的情況

依賴環境

JDK:1.8    Hadoop 2.7.4    spark版本2.1.1  centos:7.3  
hadoop001(master)  主機: 192.168.119.51
hadoop002(slave1)  從機: 192.168.119.52 
hadoop003(slave2)  從機: 192.168.119.53

一臺物理機(windows10 64位),安裝三臺虛擬機器(master ,slave1 ,slave2)。

Mysql在遠端的情況是Mysql安裝在物理機(windows10)上面。Hive要安裝在master上面。

關鍵的區別在於Hive的hive-site.xml配置中的IP地址要修改成物理機的地址。

由於物理機與虛擬機器之間使用的連線是:VMware Virtual Ethernet Adapter for VMnet8

IPv4 地址: 192.168.119.1,所以將hive-site.xml修改如下:

<configuration>
<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://192.168.119.1:3306/hive_db?createDatabaseIfNotExist=true</value>
   <description>JDBC connect string for a JDBC metastore</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.jdbc.Driver</value>
   <description>Driver class name for a JDBC metastore</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionUserName</name>
   <value>hive</value>
   <description>username to use against metastore database</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>hive</value>
   <description>password to use against metastore database</description>
 </property>
 </configuration>

關鍵點說明:要保證虛擬機器的hive與物理機的mysql正確連線一定要注意以下幾點:

1、關閉物理機的防火牆!!!關閉物理機的防火牆!!!關閉物理機的防火牆!!!重要的事情說三遍!

有些時候配置都正確,ping物理機也能通,但是就是連不通,報一些連線失敗的資訊,其實是防火牆在作怪。

2、在物理機mysql執行命令:

mysql> create user 'hive'@'%' identified by 'hive';
mysql> grant all on *.* to 'hive'@localhost identified by 'hive';

mysql> flush privileges;

建立hive使用者,授權可以遠端訪問。

3、在物理機Mysql新建hive_db資料庫後,執行命令:

alter database hive character set latin1;

因為物理機預設是UTF-8的編碼,而centos預設的編碼是latin1。

4、修改hive-site.xml配置之後,對hive進行初始化

./schematool -initSchema -dbType mysql

其他步驟和Mysql本地的配置安裝步驟相同,就不再贅述。