首先,要明確spark on hive和hive on spark 的區別。
--spark on hive:是spark 通過spark-sql 使用hive 語句操作hive,底層運行的還是 spark rdd。它是通過sparksql來加載hive的配置文件,獲取到hive的元數據信息,這樣就可以拿到hive的所有表的數據,接下來就可以用sparksql來操作hive表中的數據。
--hive on spark:是hive的執行引擎變成了spark,不再是mapreduce。這個要相對于麻煩,需要重新編譯spark源碼,打成jar包,將hive的執行引擎換成spark。
其次,hive的meta數據支持三種方式存儲,一種遠端存儲,兩種本地存儲。遠端存儲比較適合生產環境。詳細信息查看 hive metastore。
一、本地derby存儲
這種方式是最簡單的存儲方式,本人只在hive-site.xml中添加如下配置:
<configuration>
<property>?
<name>javax.jdo.option.ConnectionURL</name>?
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>?
</property>? ?
<property>?
<name>javax.jdo.option.ConnectionDriverName</name>?
<value>org.apache.derby.jdbc.EmbeddedDriver</value>?
</property>? ?
<property>?
<name>hive.metastore.local</name>?
<value>true</value>?
</property>? ?
<property>?
<name>hive.metastore.warehouse.dir</name>?
<value>/user/hive/warehouse</value>?
</property>? ?
<property>?
<name>hive.metastore.warehouse.dir</name>?
<value>/user/hive/warehouse</value>?
</property>? ?
</configuration>
注意:使用derby存儲方式時,運行hive會在當前目錄生成一個derby文件和一個metastore_db目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用數據庫,否則會提示如下錯誤:
hive>?show?tables;??
FAILED:?Error?in?metadata:?javax.jdo.JDOFatalDataStoreException:?Failed?to?start?database?'metastore_db',?see?the?next?exception?for?details.??
NestedThrowables:??
java.sql.SQLException:?Failed?to?start?database?'metastore_db',?see?the?next?exception?for?details.??
FAILED:?Execution?Error,?return?code?1?from?org.apache.hadoop.hive.ql.exec.DDLTask?
二、本地mysql存儲
這種方式存儲需要在本地運行一個mysql服務器,并做如下配置(需要將mysql的jar包拷貝到$HIVE_HOME/lib目錄下)
<configuration>??
<property>??
<name>hive.metastore.warehouse.dir</name>??
<value>/user/hive_remote/warehouse</value>??
</property>??
<property>??
<name>hive.metastore.local</name>??
<value>true</value>??
</property>??
<property>??
<name>javax.jdo.option.ConnectionURL</name>??
<value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>??
</property>??
<property>??
<name>javax.jdo.option.ConnectionDriverName</name>??
<value>com.mysql.jdbc.Driver</value>??
</property>??
<property>??
<name>javax.jdo.option.ConnectionUserName</name>??
<value>hive</value>??
</property>??
<property>??
<name>javax.jdo.option.ConnectionPassword</name>??
<value>password</value>??
</property>??
</configuration>
三、遠端mysql
這種方式存儲需要在遠端服務器運行一個mysql服務器,并且需要在Hive服務器啟動meta服務。遠程mysql服務器ip:192.168.200.110,數據庫hive_remote,配置如下:
<configuration>??
<property>??
????<name>hive.metastore.warehouse.dir</name>??
????<value>/user/hive/warehouse</value>??
</property>??
<property>??
????<name>javax.jdo.option.ConnectionURL</name>??
????<value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</value>??
</property>??
<property>??
????<name>javax.jdo.option.ConnectionDriverName</name>??
????<value>com.mysql.jdbc.Driver</value>??
</property>??
<property>??
????<name>javax.jdo.option.ConnectionUserName</name>??
????<value>hive</value>??
</property>??
<property>??
????<name>javax.jdo.option.ConnectionPassword</name>??
????<value>password</value>??
</property>??
<property>??
????<name>hive.metastore.local</name>??
????<value>false</value>??
</property>??
<property>??
????<name>hive.metastore.uris</name>??
????<value>thrift://192.168.1.188:9083</value>??
</property>??
</configuration>??
注意:這里把hive的服務端和客戶端都放在同一臺服務器上了。服務端和客戶端可以拆開,將hive-site.xml配置文件拆為如下兩部分:
1)服務端配置:
<configuration>??
<property>??
????<name>hive.metastore.warehouse.dir</name>??
????<value>/user/hive/warehouse</value>??
</property>??
<property>??
????<name>javax.jdo.option.ConnectionURL</name>??
????<value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</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>test1234</value>??
</property>??
</configuration>
2)客戶端配置:
<configuration>??
<property>??
????<name>hive.metastore.warehouse.dir</name>??
????<value>/user/hive/warehouse</value>??
</property>??
<property>??
????<name>hive.metastore.local</name>??
????<value>false</value>??
</property>??
<property>??
????<name>hive.metastore.uris</name>??
????<value>thrift://192.168.1.188:9083</value>??
</property>??
</configuration>
啟動hive服務端程序:hive?--service?metastore
客戶端直接使用hive命令即可
由于公司使用的是內網環境,網盤用不了,自己裝的虛擬環境也不能通過yum來進行安裝,下載的rpm包又缺少其他的依賴,只能選擇本地derby存儲。接下來,配置spark on hive(前提hdfs、yarn、hive已經搭建好了):
1、hive-site.xml配置:
<configuration>
<property>
????<name>hive.cli.print.header</name>
????<value>true</value>
????<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
????<name>hive.cli.print.current.db</name>
????<value>true</value>
????<description>Whether to include the current database in the Hive prompt.</description>
</property>
<property>
????<name>hive.metastore.uris</name>
????<value>thrift://hadoop110:9083</value>
</property>
<property>
???????? <name>hive.metastore.warehouse.dir</name>
???????? <value>hdfs://hadoop110:9000/user/hive/warehouse</value>
</property>
</configuration>
2、在spark的conf中創建hive-site.xml的軟連接 ln -s /xxx/xxx/hive-site.xml
3、配置spark-env.sh:
export JAVA_HOME=/opt/module/jdk1.8.0_211
export SCALA_HOME=/opt/module/scala-2.11.12
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export HADOOP_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
4、將spark的jars中的所有包上傳到hdfs上,然后在spark-default.xml中配置路徑。這樣可以提高程序運行過程中尋找jar包的效率
hadoop fs -put spark/jars/* /spark_jars/
spark-default.xml中配置:
spark.yarn.jars=hdfs://hadoop110:9000/spark_jars/*
5、啟動hive服務:hive --service metastore &
6、啟動spark的thriftserver服務:/opt/module/spark-2.1/sbin/start-thriftserver.sh
7、啟動beeline,注意:下次啟動需要在同一個目錄下,否則就會生成新的元數據文件。
啟動多個beeline窗口也可以訪問滴。哈哈哈!!!