国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決執(zhí)行 spark.sql 時版本不兼容的一種方式

這篇具有很好參考價值的文章主要介紹了解決執(zhí)行 spark.sql 時版本不兼容的一種方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

場景描述

hive 數(shù)據(jù)表的導(dǎo)入導(dǎo)出功能部分代碼如下所示,使用 assemble 將 Java 程序和 spark 相關(guān)依賴一起打成 jar 包,最后 spark-submit 提交 jar 到集群執(zhí)行。

public class SparkHiveApplication {

    public static void main(String[] args){

        long start = System.currentTimeMillis();
        String writeSql = "";
        SparkConf sparkConf = new SparkConf();

        for (String arg : args) {
            if (arg.startsWith("WriteSql=")) {
                writeSql = arg.replaceFirst("WriteSql=", "");
            }
        }

        SparkSession spark = SparkSession
                .builder()
                .appName("write data to hive table")
                .config(sparkConf)
                .enableHiveSupport()
                .getOrCreate();

        // LOAD DATA LOCAL INPATH '/path/to/file.csv' INTO TABLE target_table PARTITION (field='x')
        spark.sql(writeSql);

        long end = System.currentTimeMillis();
        System.out.println("cost time:" + (end - start));
    }
}
  <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.11</artifactId>
      <version>2.4.8</version>
  </dependency>

在CDH6.3.2 集群(后面稱CDH),當(dāng)程序執(zhí)行 spark.sql 導(dǎo)入本地磁盤 csv 數(shù)據(jù)到 hive 表時出現(xiàn)異常(如下),但導(dǎo)出表數(shù)據(jù)到本地磁盤、從 HDFS 導(dǎo)入導(dǎo)出功能卻都是正常的。

Caused by: java.lang.IllegalArgumentException: Wrong FS: file:/input/data/training/csv_test1_1301125633652294217_1690451941587.csv, expected: hdfs://nameservice1
        at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:649)

查資料判定是 spark-hive_2.11 版本不兼容導(dǎo)致的,在調(diào)試的過程中陸續(xù)又出現(xiàn)異常(如下)

Exception in thread "main" org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table csv_test2. Invalid method name: 'get_table_req';
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/ql/metadata/HiveException
        at java.lang.Class.getDeclaredConstructors0(Native Method)

最終使用 spark-hive_2.1.1: 2.4.0-cdh6.3.3 解決了最初的本地磁盤導(dǎo)入異常。

接著用包含 spark-hive_2.1.1: 2.4.0-cdh6.3.3 依賴的 jar 包在 CDP 集群(另一個大數(shù)據(jù)集群)執(zhí)行導(dǎo)入導(dǎo)出時又拋了異常,修改依賴版本為 spark-hive_2.11: 2.4.8 ,異常解決。

java.lang.NoSuchMethodException: org.apache.hadoop.hive.ql.metadata.Hive.alterTable(java.lang.String, org.apache.hadoop.hive.ql.metadata.Table, org.apache.hadoop.hive.metastore.api.EnvironmentContext)

此時兩個集群中參與導(dǎo)入導(dǎo)出的部分組件版本如下:

集群 spark hive Java 中的 spark-hive_2.1
CDH 3.0.x 2.1.1 2.4.0-cdh6.3.3
CDP 3.0.x 3.1.3 2.4.8

備注:導(dǎo)入導(dǎo)出操作采用 spark on k8s 方式執(zhí)行,所以使用是鏡像中的 spark 3.0 而非 CDH 、CDP 集群上安裝的 spark。

異常原因分析

spark.sql 執(zhí)行時要做三件事情:

  1. spark 首先創(chuàng)建 hiveMetaStoreClient 對象;
  2. 再調(diào)用 hiveMetaStoreClient 的方法去跟 CDH(CDP) 中的 hiveMetastoreServer 通信獲取表相關(guān)元信息。
  3. 根據(jù)獲取到的信息生成 sql 的執(zhí)行計劃,真正處理數(shù)據(jù)。

生成對象 jvm 首先需要通過全限定類名找到對應(yīng) Class 文件,通過反射的方式構(gòu)造出對象再執(zhí)行對象方法。問題也在這個地方:包名+類名相同,不同版本可能方法名、方法參數(shù)、方法內(nèi)容不同,對應(yīng)的出現(xiàn) Invalid method name: 'get_table_req' 、 java.lang.NoSuchMethodException 以及方法執(zhí)行時拋出異常。

場景描述中更換依賴版本實際上是在找適配的 hiveMetastore 版本,并且讓 jvm 率先加載到。2.4.0-cdh6.3.3 內(nèi)部包含 hive-metastore:2.1.1-cdh6.3.3,2.4.8內(nèi)部包含 hive-metastore:1.2.1spark2。

另一種解決方式

spark1.4.0 以后的版本支持和不同版本的 Hive Metastore 交互。列表貼的是 spark 3.4.1 兼容的 hive meatstore 版本 0.12.0 到 2.3.9 和 3.0.0 到 3.1.3。不同版本兼容可在官方文檔查看。

解決執(zhí)行 spark.sql 時版本不兼容的一種方式,大數(shù)據(jù),spark,大數(shù)據(jù),spark.sql

怎么配置和不同版本 hive metastore 交互?

(1)內(nèi)置。spark 內(nèi)置了 hive,如果應(yīng)用程序 jar 包中也沒有帶,也沒有外部指定時,默認(rèn)使用內(nèi)置的。不同版本 spark 內(nèi)置的 hive 版本也有差異,spark3.4.1 內(nèi)置 hive2.3.9,spark3.0.3 內(nèi)置 hive2.3.7。在 spark-shell 中使用 spark.sql 時應(yīng)該用的是內(nèi)置的,因為那會沒有 Java jar 包,啟動也僅僅是在命令行敲了“spark-shell”。

(2)當(dāng)場下載。配置spark.sql.hive.metastore.version=2.1.1 spark.sql.hive.metastore.jars=maven ,當(dāng)執(zhí)行spark.sql 時會先從 maven 倉庫下載 2.1.1 相關(guān)的依賴到本地 /root/.livy/jars 路徑下,大概 188 個 jar 包,總大小 200M 左右。但這種方式當(dāng)網(wǎng)速很慢或者 maven 倉庫沒有某些依賴時會下載失敗,而且當(dāng)場下載也不適合生產(chǎn)環(huán)境。

(3)指定版本以及依賴的路徑。

  • spark 3.1.0 之前配置 spark.sql.hive.metastore.version=2.1.1 spark.sql.hive.metastore.jars=/path-to-hive-jars/* 。執(zhí)行 spark.sql 時就會率先從 path-to-hive-jars 路徑下尋找依賴。
  • spark 3.1.0 之后需要配置 spark.sql.hive.metastore.version=2.1.1 、spark.sql.hive.metastore.jars=path 、spark.sql.hive.metastore.jars.path=path-to-hive-jars?!皃ath-to-hive-jars” 可以是 HDFS 上的路徑,具體細(xì)節(jié)看表格介紹。

? 這種方式可以用在生產(chǎn)環(huán)境中。

如果采用方式(3)怎么提前獲取到正確的依賴,既能跟 spark 兼容又能和集群 hive 通信沒問題?

要操作哪個集群如果該集群 hive 在 spark 版本兼容的范圍內(nèi)。直接將集群 hive/lib 下的全部 jar 包(200M左右)“懟” 給 spark 就可以了。(可能用不了那么多,但篩選需要做實驗測試)。

下面是在 CDH 集群執(zhí)行導(dǎo)入操作時的 spark-submit 命令。提前將 CDH 的 hive/lib 下的 jar 包拿出來掛載到容器的 /opt/ml/input/data/training/sparkjar/hive-jars 路徑下。

#  在 k8s 容器中執(zhí)行
/usr/local/spark/bin/spark-submit \
--conf spark.driver.bindAddress=172.16.0.44 \
--deploy-mode client \
--conf spark.sql.hive.metastore.jars=/data/training/sparkjar/hive-jars/* \
--conf spark.sql.hive.metastore.version=2.1.1 \
--properties-file /opt/spark/conf/spark.properties \
--class com.spark.SparkHiveApplication \
local:///data/training/sparkjar/hive-metastore-spark-app-jar-with-dependencies.jar \
WriteSql=TE9BRCBEQVRBIExPQ0FMIElOUEFUSCAnL29wdC9tbC9vdXRwdXQvMTc1NjQ2NDY2MDY3Mzk4NjU3LzE3NTY0NjQ2NjA2NzM5ODY1Ny9wYXJ0LTAwMDAwLWVhYjA2ZWZiLTcwNTktNGI4MS04YmRhLWE3NGE5Yzg3OTY2MS1jMDAwLmNzdicgSU5UTyBUQUJMRSBkdF90aW9uZV90ZXN0XzIwMjIwNzIyIHBhcnRpdGlvbiAocGFydF9udW09JzEnKQ==

與工程結(jié)合時肯定能獲取到全部 jar 包以及找到合適的“懟”方式。這里列舉的只是一種向 spark 任務(wù)添加依賴的方式。

嘗試打“瘦”包

在創(chuàng)建 assembly jar 的時候,將 spark-hive_2.1 的生命周期設(shè)置為 provided,即不將該依賴打入最后的 jar 包。因為在運(yùn)行 jar 任務(wù)時集群管理器可以自己提供依賴的 jar。而且 spark-hive 在 maven 官網(wǎng)的生命周期就被給定是 provided。

沒有 spark-hive 依賴的 jar 包大小 9M (之前是 144M),分別在 CDP 和 CDH 上執(zhí)行導(dǎo)入導(dǎo)出操作。結(jié)果:

  • CDP 集群測試通過。

  • CDH 集群異常。猜測是原生 spark3 和 hive-metastore:2.1.1-cdh6.3.3 不兼容(發(fā)行版有時會在原生基礎(chǔ)上做改動),改用方式(3)中的配置后導(dǎo)入導(dǎo)出功能正常。

如果集群采用發(fā)行版部署,大版本下各組件兼容的可能性更大些。而且當(dāng)頻繁調(diào)試 Java jar 功能時 9M 大小縮短了上傳時間,效率也變高了。

小結(jié)

通過配置的方式可以指定 spark 使用的 hiveMetastore。優(yōu)先使用集群自帶的依賴可以在一定程度上減少組件不兼容異常。Java jar 包中只管應(yīng)用程序怎么寫,依賴讓集群提供,可以解除 jar 包與某個大數(shù)據(jù)集群的強(qiáng)綁定關(guān)系。但外部配置只是一種解決方案,如果要與工程結(jié)合還需要根據(jù)場景需求進(jìn)一步設(shè)計實現(xiàn)方案并做實驗。文章來源地址http://www.zghlxwxcb.cn/news/detail-655587.html

到了這里,關(guān)于解決執(zhí)行 spark.sql 時版本不兼容的一種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • htb monitored root方式其中的一種(僅作記錄)

    htb monitored root方式其中的一種(僅作記錄)

    快下班時候?qū)彸鰜淼?,目前root的第5種方式 其中 會重啟nagios服務(wù),看下manage_services.sh 能看到會是識別完系統(tǒng)做對應(yīng)的服務(wù)操作,其實等同于是一個systemctl 有趣的是 $BASEDIR/manage_services.sh restart nagios 會重啟nagios服務(wù) systemctl status nagios能看到服務(wù)的位置 這個是有權(quán)限修改的 所以

    2024年01月18日
    瀏覽(14)
  • 3dmax面片建模給面片增加厚度的一種方式

    3dmax面片建模給面片增加厚度的一種方式

    進(jìn)入面片建模,新建一個面片; 給面片增加一個殼修改器,shell; ? 加了以后視圖會有一點變化; ? 看一下參數(shù)里面有內(nèi)部量和外部量,這應(yīng)是設(shè)置殼的內(nèi)外部,給它設(shè)為6; ? 然后看一下厚度出來了;參數(shù)里面也可以設(shè)置殼的段數(shù); ? ?

    2024年02月16日
    瀏覽(21)
  • 【LabVIEW學(xué)習(xí)】5.數(shù)據(jù)通信之TCP協(xié)議,控制電腦的一種方式

    【LabVIEW學(xué)習(xí)】5.數(shù)據(jù)通信之TCP協(xié)議,控制電腦的一種方式

    一。tcp連接以及寫數(shù)據(jù)(登錄) ???????? 數(shù)據(jù)通信--》協(xié)議--》TCP 注意: 事件結(jié)構(gòu)要寫延遲?。?! 1.tcp連接 ? ? ? ? 創(chuàng)建while循環(huán),中間加入事件結(jié)構(gòu),創(chuàng)建tcp連接,寫入IP地址與端口號 2.寫入tcp數(shù)據(jù) ? ? ? ? 登錄服務(wù)器除了要知道IP地址以及端口以外,需要用戶名與密

    2024年02月04日
    瀏覽(21)
  • 【Android】RecyclerView實現(xiàn)列表中的Item之間設(shè)置間距的一種方式

    RecyclerView 的 Item 默認(rèn)沒有間距是因為 RecyclerView 是一個高度自定義的控件,它的目標(biāo)是提供一個高效靈活的列表展示,并且適應(yīng)各種不同的布局需求。 為了讓開發(fā)者能夠充分自定義列表項的布局和樣式,RecyclerView 沒有默認(rèn)設(shè)置項來添加 item 之間的間距。這樣設(shè)計的好處是,

    2024年02月13日
    瀏覽(24)
  • vscode打開c_cpp_properties.json文件的一種方式

    vscode打開c_cpp_properties.json文件的一種方式

    點擊win32 點擊json 自動生成了

    2024年01月19日
    瀏覽(21)
  • <Python>PyQt5中UI界面和邏輯函數(shù)分開寫的一種方式

    <Python>PyQt5中UI界面和邏輯函數(shù)分開寫的一種方式

    前言 如果經(jīng)常使用PyQt5這種模塊來編寫帶UI界面的程序,那么很自然的就會涉及到,一旦程序比較大,UI控件多的時候,需要將UI和邏輯程序分離,這樣方便管理,也方便維護(hù)。 配置: 平臺:windows 工具:visual studio code 語言:python 庫:PyQt5 本文將提供一個簡單但可用的實例,

    2024年02月02日
    瀏覽(56)
  • Linux下獲取另外一個程序的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出的一種實現(xiàn)方式

    Linux下獲取另外一個程序的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出的一種實現(xiàn)方式

    問題:一個程序如何獲取另外一個程序的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出? 標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯誤輸出是一個程序的基本組成,在Linux下一個程序調(diào)用另外一個程序,如何獲取其標(biāo)準(zhǔn)輸出和錯誤輸出呢? 分析:一個程序獲取另外一個程序的信息,本質(zhì)上是IPC(基于進(jìn)程的通

    2024年02月13日
    瀏覽(18)
  • 云計算、大數(shù)據(jù)技術(shù)的智慧工地,實現(xiàn)對建筑工地實時監(jiān)測、管理和控制的一種新型建筑管理方式

    云計算、大數(shù)據(jù)技術(shù)的智慧工地,實現(xiàn)對建筑工地實時監(jiān)測、管理和控制的一種新型建筑管理方式

    智慧工地是利用物聯(lián)網(wǎng)、云計算、大數(shù)據(jù)等技術(shù),實現(xiàn)對建筑工地實時監(jiān)測、管理和控制的一種新型建筑管理方式。 智慧工地架構(gòu): 1、終端層: 充分利用物聯(lián)網(wǎng)技術(shù)、移動應(yīng)用、智能硬件設(shè)備提高現(xiàn)場管控能力。通過RFID、傳感器、攝像頭、手機(jī)等終端設(shè)備,實現(xiàn)對項目建

    2024年02月04日
    瀏覽(21)
  • 【運(yùn)維】解決 mac office 中亂碼的一種方法

    【運(yùn)維】解決 mac office 中亂碼的一種方法

    由于微軟 office 在 mac 中的代碼不匹配等問題,造成部分在 windows 中生成的文檔用 mac office 中打開時會有部分亂碼?,F(xiàn)在筆者找到一種方法,可以解決該問題。 1.安裝最新版本的 mac office,我這里是 office2021 2.對windows 中生成有亂碼的文檔,使用 keynote或者pages 打開,亂碼消失

    2024年02月05日
    瀏覽(23)
  • 安全審計——等級保護(hù)日志審計要求的一種解決方案

    安全審計——等級保護(hù)日志審計要求的一種解決方案

    ????在網(wǎng)絡(luò)安全等級保護(hù)中,對日志有著一系列的要求,通常以部署日志審計系統(tǒng)來滿足等保的要求,此處我們選擇syslog來實現(xiàn)日志的集中收集,統(tǒng)一管理。 ????在這里我們主要目標(biāo)是滿足安全區(qū)域邊界、安全管理中心里的下面兩條的要求。其中安全管理中心的日志

    2024年02月16日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包