溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SparkSQL 初步應(yīng)用(HiveContext使用)

發(fā)布時(shí)間:2020-07-14 22:46:36 來源:網(wǎng)絡(luò) 閱讀:4887 作者:996440550 欄目:大數(shù)據(jù)

折騰了一天,終于解決了上節(jié)中result3的錯(cuò)誤。至于為什么會(huì)產(chǎn)生這個(gè)錯(cuò)誤,這里,先賣個(gè)關(guān)子,先看看這個(gè)問題是如何發(fā)現(xiàn)的:


首先,找到了這篇文章:http://apache-spark-user-list.1001560.n3.nabble.com/SparkSQL-select-syntax-td16299.html  里面有這么一段:

The issue is that you're using SQLContext instead of HiveContext. SQLContext implements a smaller subset of the SQL language and so you're getting a SQL parse error because it doesn't support the syntax you have. Look at how you'd write this in HiveQL, and then try doing that with HiveContext.

In fact, there are more problems than that. The sparkSQL will conserve (15+5=20) columns in the final table, if I remember well. Therefore, when you are doing join on two tables which have the same columns will cause doublecolumn error. 

這里提及到兩點(diǎn):(1)使用HiveContext;(2)也就是導(dǎo)致這個(gè)錯(cuò)誤的原因。


好吧,說到使用HiveContext,那咱就用HiveContext(尼瑪,這里折騰了半天):

首先呢,看使用HiveContext都需要哪些要求,這里參考了這篇文章:http://www.cnblogs.com/byrhuangqiang/p/4012087.html

文章中有這么三個(gè)要求:

1、檢查$SPARK_HOME/lib目錄下是否有datanucleus-api-jdo-3.2.1.jar、datanucleus-rdbms-3.2.1.jar 、datanucleus-core-3.2.2.jar 這幾個(gè)jar包。

2、檢查$SPARK_HOME/conf目錄下是否有從$HIVE_HOME/conf目錄下拷貝過來的hive-site.xml。

3、提交程序的時(shí)候?qū)?shù)據(jù)庫驅(qū)動(dòng)程序的jar包指定到DriverClassPath,如bin/spark-submit --driver-class-path *.jar。或者在spark-env.sh中設(shè)置SPARK_CLASSPATH。

那咱就按照要求配置,可是,配置完成之后報(bào)錯(cuò)(交互模式):

Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

初步判斷,是hive連接源數(shù)據(jù)庫這塊的問題,于是在hive-site.xml文件中添加連接源數(shù)據(jù)庫的參數(shù):

        <property>
          <name>hive.metastore.uris</name>
          <value>thrift://111.121.21.23:9083</value>
          <description></description>
        </property>

指定好參數(shù)之后,滿懷期待的執(zhí)行了個(gè)查詢,尼瑪又報(bào)錯(cuò)(這個(gè)錯(cuò)誤糾結(jié)了好久):

ERROR ObjectStore: Version information not found in metastore.

這個(gè)錯(cuò)誤說的是,在使用HiveContext時(shí),需要訪問Hive的數(shù)據(jù)源,獲取數(shù)據(jù)源的版本信息,如果獲取不到,此時(shí)就會(huì)拋出該異常。關(guān)于解決方案網(wǎng)上倒是挺多,需要添加參數(shù)到hive-site.xml文件:

         <property>
          <name>hive.metastore.schema.verification</name>
          <value>false</value>
          <description></description>
        </property>

添加完參數(shù),重啟了Hive服務(wù),執(zhí)行Spark 的HiveContext,依舊報(bào)改錯(cuò)。使用IDE將程序編譯打包后,放在服務(wù)器上執(zhí)行:

#!/bin/bash

cd /opt/huawei/Bigdata/DataSight_FM_BasePlatform_V100R001C00_Spark/spark/

./bin/spark-submit \

--class HiveContextTest \

--master local \

--files /opt/huawei/Bigdata/hive-0.13.1/hive-0.13.1/conf/hive-site.xml \

/home/wlb/spark.jar \

--archives datanucleus-api-jdo-3.2.6.jar,datanucleus-core-3.2.10.jar,datanucleus-rdbms-3.2.9.jar \

--classpath /opt/huawei/Bigdata/hive-0.13.1/hive-0.13.1/lib/*.jar


無奈,又報(bào)另一個(gè)錯(cuò)(真是崩潰?。簀ava.net.UnknownHostException: hacluster

這是hadoop的dfs.nameservices

嗯,不能解析主機(jī)名hacluster拋出的異常,那么繼續(xù),網(wǎng)上給的結(jié)果是:

需要把配置hdfs-site.xml復(fù)制到spark的conf目錄下,果然,復(fù)制完成后,程序打成的jar包終于能在服務(wù)器上成功運(yùn)行了。

但是回想起來,那么這個(gè)錯(cuò)誤:ERROR ObjectStore: Version information not found in metastore.

到底是由于什么原因?qū)е碌???zhí)行jar包和shell模式有什么區(qū)別呢?

繼續(xù),使用shell模式執(zhí)行基于HiveContext的SQL,還是報(bào)這個(gè)錯(cuò),那么,打開spark的debug看看有什么有價(jià)值的信息,找個(gè)許久,沒有發(fā)現(xiàn)任何有價(jià)值的日志。繼續(xù)在網(wǎng)上搜索,網(wǎng)上的這個(gè)問題,都是WARN級(jí)別的,而我的是ERROR級(jí)別的。

到這里,實(shí)在是沒有什么思路了。哎,既然我的jar包能夠執(zhí)行成功,那么就看看使用jar包執(zhí)行和該模式有什么區(qū)別?

首先想到的是,為什么hive-site.xml的參數(shù):hive.metastore.schema.verification 沒有生效?我重啟服務(wù)了呀,是不是沒有引用到該參數(shù)?!

哎,那我就添加HIVE_HOME環(huán)境變量,執(zhí)行了一下,還是沒生效,也就是說沒有引用到該參數(shù)。。。已經(jīng)瀕臨崩潰,過了許久,突然想到,我執(zhí)行的spark-shell命令來源于哪?那么看一下:which spark-shell


好像發(fā)現(xiàn)了什么,該spark-shell是來自spark客戶端程序的bin目錄(之前為了使用命令方便,設(shè)置和了環(huán)境變量---華為的產(chǎn)品),也就是說,我默認(rèn)的環(huán)境變量是指向spark客戶端程序目錄的?。。?/p>

終于找到了問題的根本,于是,將hive-site.xml、hdfs-site.xml復(fù)制到客戶端程序的conf目錄下,重啟hive服務(wù),一切OK!

過了一會(huì),還有點(diǎn)不放心,到底是不是這個(gè)問題導(dǎo)致的呢?好吧,那么就在其他節(jié)點(diǎn)上測(cè)試了一下,首先客戶端程序目錄中沒有該參數(shù),執(zhí)行失敗,添加后,hive.metastore.schema.verification是生效的!


大功告成!整個(gè)過程,spark的debug功能一直是打開的,但是在日志中沒有發(fā)現(xiàn)有價(jià)值的信息。


對(duì)了,要想使用IDE調(diào)試Spark的HiveContext程序,需要在main目錄下添加resource目錄(類型為Resources),并且將hive-site.xml、hdfs-site.xml添加到該目錄中。

并且將三個(gè)驅(qū)動(dòng)包引入:

datanucleus-api-jdo-3.2.6.jar,datanucleus-core-3.2.10.jar,datanucleus-rdbms-3.2.9.jar


差點(diǎn)忘了,我是為了解決上節(jié)中的result3問題,哈哈,這個(gè)問題其實(shí)是由于SparkSQL對(duì)SQL語法支持的問題??梢钥紤]使用其他方式(不在IN里面嵌套子查詢),比如設(shè)置多個(gè)RDD或者左右連接等(有待測(cè)試)。


下節(jié),大概說下Scala IDE如何配置(這個(gè)問題在清明假期折騰了兩天,總結(jié)了兩種方式)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI