基於Spark2.0搭建Hive on Spark環境(Mysql本地和遠端兩種情況)
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。
環境變數
如果是對所有的使用者都生效就修改vi /etc/profile 檔案
如果只針對當前使用者生效就修改 vi ~/.bahsrc 檔案
sudo vi /etc/profile
#hiveexport 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本地的配置安裝步驟相同,就不再贅述。