Spark
本文匯總了使用AnalyticDB for MySQL Spark的常見問題及解決方案。
常見問題概覽
如何解決提交Spark應用時,出現User %s do not have right permission [ *** ] to resource [ *** ]報錯?
如何解決運行Spark應用時,出現No space left on device或設備上沒有空間報錯?
如何解決提交Spark應用時,出現Current Query Elastic Resource Failed報錯?
如何解決Spark應用日志中出現的ClassNotFound報錯?
如何解決Spark應用日志中出現的NoSuchMethod報錯?
如何解決Spark SQL應用讀內表時,出現No such file or directory報錯?
運行Spark應用時,為什么Spark Executor節點會出現Dead?
Spark SQL應用使用SHOW TABLES或SHOW DATABASE命令查詢庫表時,為什么顯示的庫表與實際庫表不符?
如何查看Spark應用信息?
您可在Spark Jar開發頁面,搜索應用ID,查看Spark應用信息。具體操作,請參見Spark開發編輯器。
如何解決提交Spark應用時,出現User %s do not have right permission [ *** ] to resource [ *** ]報錯?
原因:當前RAM用戶沒有調用該接口的權限。
解決方法:按以下步驟為RAM用戶添加對應的權限。
如何解決運行Spark應用時,出現No space left on device或設備上沒有空間報錯?
原因:可能由于Executor本地磁盤不足,導致以上報錯。
解決方法:在Spark Jar開發頁面的應用列表頁簽中,單擊對應Spark應用操作列的UI,查看Spark UI中Executor的Stderr日志信息。如果Executor本地磁盤不足,可通過配置spark.adb.executorDiskSize參數,增加Spark Executor節點中掛載的額外磁盤容量。具體操作,請參見Spark應用配置參數說明。
當前Executor本地磁盤最大為100Gi。如果本地磁盤已經為100Gi,仍然提示空間不足,可以增加Executor的數量。
如何解決提交Spark應用時,出現Current Query Elastic Resource Failed報錯?
原因:通過JDBC方式提交XIHE BSP應用所使用的數據庫賬號綁定了Job型資源組,資源拉起速度慢,導致應用超時。
解決方法:解除Job型資源組綁定的數據庫賬號。具體操作,請參見綁定或解綁數據庫賬號。
如何解決Spark應用日志中出現的ClassNotFound報錯?
原因:提交Spark應用時,上傳的JAR包缺少類。
解決方法:您可以打開上傳的JAR包,檢查該類是否存在。
如果是業務相關的類,您需要重新打包,并確保JAR包中含目標類。
如果是第三方JAR包,您可以采用如下兩種方式上傳:
使用Maven依賴的Shade或Assembly插件,需手動添加所需的依賴包。
將第三方JAR包上傳至OSS中,并在提交Spark應用時配置jars參數。詳細信息請參見Spark應用開發介紹。
如何解決Spark應用日志中出現的NoSuchMethod報錯?
原因:導入的JAR包與Spark沖突,導致以上報錯。
解決方法:您可以通過Spark的conf配置參數添加以下配置,在日志中打印類加載過程中涉及的JAR包,從而排查哪些JAR包與Spark沖突。然后通過Maven常見的沖突解決方式Provided和Relocation解決該報錯。詳情請參見Conf配置參數。
"spark.executor.extraJavaOptions":"-verbose:class",
"spark.driver.extraJavaOptions":"-verbose:class"
如何解決Spark SQL應用讀JSON外表(包含日志投遞自建)時,出現ClassNotFoundException: org.apache.hadoop.hive.serde2.JsonSerDe報錯?
您需下載hive-serde-3.1.2.jar和hive-hcatalog-core-2.3.9.jar并上傳至OSS中,在提交Spark SQL應用時添加add jar oss://<testBucketName>/hive-hcatalog-core-2.3.9.jar;add jar oss://<testBucketName>/hive-serde-3.1.2.jar;
語句。
<testBucketName>
需替換為hive-serde-3.1.2.jar和hive-hcatalog-core-2.3.9.jar所在的實際OSS路徑。
如何解決Spark SQL應用讀內表時,出現No such file or directory報錯?
原因:內表熱數據默認存儲在Worker節點上,而Spark離線讀取數據時,會從OSS中讀取,此時OSS中沒有內表熱數據,會導致Spark SQL執行失敗。
解決方法:在查詢內表熱數據前,使用XIHE引擎執行以下SQL修改配置參數,然后手動BUILD表。BUILD完成后再查詢該表的熱數據。具體操作,請參見BUILD。
SET ADB_CONFIG CSTORE_HOT_TABLE_ALLOW_SINGLE_REPLICA_BUILD=true;
SET ADB_CONFIG ELASTIC_ENABLE_HOT_PARTITION_HAS_HDD_REPLICA=true;
SET ADB_CONFIG ELASTIC_PRODUCT_ENABLE_MIXED_STORAGE_POLICY=true;
運行Spark應用時,為什么Spark Executor節點會出現Dead?
在Spark Jar開發頁面,單擊目標Spark應用操作列的UI,跳轉到對應的Spark UI頁面,如果應用失敗原因為Failed to connect to /xx.xx.xx.xx:xxxx
,或者在Spark UI頁面的Executors頁簽下出現狀態為Dead的Executor節點,則說明Spark Executor節點由于某種原因退出了。進入Spark UI的具體方法,請參見Spark開發編輯器。
原因和解決方法如下:
原因1:
Executor進程使用的內存超出限制。Spark Executor除了JVM本身使用的內存外,還包括堆外內存(Shuffle、Cache),以及Python UDF等使用的內存。容器使用的內存超過了容器允許使用內存的限制,導致Spark進程被kill命令強制終止。此時Driver日志出現如下報錯:
ERROR TaskSchedulerImpl: Lost executor xx on xx.xx.xx.xx:The executor with id xx exited with exit code 137.
。解決方法:
調大spark.executor.memoryOverhead參數,該參數表示容器內部非Spark Executor進程可使用的內存容量(單位MB),默認為Executor容器總內存容量的百分之三十。例如您當前配置的Executor規格是Medium(2核8 GB),則容器內部非Spark Executor進程可使用的內存容量默認為是2.4 GB。調整語句如下:
spark.executor.memoryOverhead: 4000MB
原因2:
日志中出現java.lang.OutOfMemoryError的日志。您可在Spark Jar開發頁面,單擊目標Spark應用操作列的UI,跳轉到對應的Spark UI頁面,在Executors頁簽下,查看狀態為Dead的Executor節點對應的stderr或stdout日志,查看具體報錯原因。
解決方法:
優化Spark應用,避免大內存占用。
調大Executor資源規格(spark.executor.resourceSpec)。
原因3:
集群開啟了動態資源分配(spark.dynamicAllocation.enabled),狀態為Dead的Executor節點日志中包含Driver commend a shutdown錯誤信息。
解決方法:
該報錯不會影響業務的正常運行,您無需處理。
除上述原因外,如果還有其他報錯,您可查看狀態為Dead的Executor節點日志。如果報錯位置在業務代碼中,您需要提交工單聯系技術支持解決;其他錯誤信息,您可以搜索相關報錯信息自行解決。
Spark訪問外部數據源時,為什么會出現網絡連接失敗問題?
原因:通過VPC訪問外部數據源時未開啟ENI。
解決方法:您需在提交的Spark應用中設置spark.adb.eni.enabled
、spark.adb.eni.vswitchId
、spark.adb.eni.securityGroupId
參數,不同數據源數參數的配置方法不同。詳情請參見Spark應用配置參數說明和訪問外部數據源。
Spark SQL應用使用SHOW TABLES或SHOW DATABASE命令查詢庫表時,為什么顯示的庫表與實際庫表不符?
您需先確認AnalyticDB for MySQL企業版、基礎版及湖倉版集群提交的Spark SQL應用使用的元數據服務版本是否為adb,如果元數據服務版本為adb,您只能看到具有讀權限的庫表,其他庫表無法查看。如果為指定Hive MetaStore的版本,您需排查自建元數據服務的權限和連通性。元數據服務版本信息,請參見Spark應用配置參數說明。
Spark應用為什么提示錯誤日志oss object 403?
原因1:AnalyticDB for MySQL Spark不支持跨地域讀取JAR包或文件。
解決方法:您需排查JAR包和文件所在的OSS Bucket是否與AnalyticDB for MySQL企業版、基礎版及湖倉版集群位于同一地域。
原因2:spark.adb.roleArn參數指定的角色沒有讀取OSS的權限。
解決方法:您需為RAM用戶授予對應權限。具體操作,請參見跨賬號授權。
原因3:文件地址填寫錯誤。
解決方法:您需在Spark應用代碼中填寫正確的OSS路徑。
原因4:文件與文件之間沒有用英文逗號(,)隔開或寫成JSON的格式。
解決方法:您需確保Spark應用代碼為正確的JSON格式,且多個文件之間用英文逗號(,)分隔。
如何定位Spark應用運行速度變慢的原因?
進入Spark UI的具體方法,請參見Spark開發編輯器。
Spark應用異常導致運行速度變慢,您可以通過如下兩種方法排查:
查看Spark Executor節點的狀態是否為Dead。
查看方法:
在Spark Jar開發頁面,單擊目標Spark應用操作列的UI,跳轉到對應的Spark UI頁面,在Executors頁簽下,查看Executors列表中Status字段信息。
解決方法:
查看Driver日志,是否有異常信息導致Task終止并重試。
查看方法:
在Spark Jar開發頁面,單擊目標Spark應用操作列的UI,跳轉到對應的Spark UI頁面,在Executors頁簽下,查看Executor ID為driver的stderr日志。
解決方法:
通過日志中的報錯信息查看異常的具體原因,大部分異常原因跟業務邏輯相關,您可以對其進行排查或搜索相關報錯信息自行解決。
說明如果出現OOM異常,則需要檢查業務邏輯是否有大內存占用,特別是某個字段特別大的情況。如果確實需要更大內存,您可以使用更大規格的Executor或Driver節點。
Spark應用無異常但運行速度變慢,您可以通過如下三種方法排查:
查看資源是否充足。
查看方法:
在Spark Jar開發頁面,單擊目標Spark應用操作列的UI,跳轉到對應的Spark UI頁面,在Stages頁簽下,查看執行速度較慢的Stage,并查看該Stage的并發度(表中字段為:Tasks: Succeeded/Total)。如果Tasks的總數大于
Executor個數*Executor核數
的值,則存在資源不足。例如:某個Tasks的總數是100,spark.executor.instances=5,spark.executor.resourceSpec=medium(2核8 GB),那么每次只能運行10個Tasks,需要運行10次。
解決方法:
您需要增加Spark應用的資源總量,調大Executor節點的個數(spark.executor.instances),或調大Executor規格(spark.executor.resourceSpec)。建議
Executor個數*Executor核數
的值不超過同時運行Tasks的總數,否則會導致資源浪費。查看GC Time時間是否過長。
查看方法:
在Spark Jar開發頁面,單擊目標Spark應用操作列的UI,跳轉到對應的Spark UI頁面,在Executors頁簽下,查看Executors列表中Task Time (GC Time)字段信息。
解決方法:
如果某些Executor節點的GC Time時間較長時,可以選擇以下兩種方案解決:
優化Spark應用的業務邏輯。
增大Executor(spark.executor.resourceSpec)或Driver(spark.driver.resourceSpec)的節點規格。
查看Driver或Executor堆棧信息。
查看方法:
在Spark Jar開發頁面,單擊目標Spark應用操作列的UI,跳轉到對應的Spark UI頁面,在Executors頁簽下,查看Thread Dump字段。
重要堆棧信息僅在Status字段為running時才能查看。
解決方法:
多次刷新堆棧查看Spark應用運行中的問題:
如果無法成功調用某些函數,則表示應用中函數邏輯的設計可能引入了熱點問題,或函數實現效率較低,建議您優化該部分的業務邏輯。
如果無法調用某些Spark,建議通過搜索報錯信息來解決。
如何定期刪除Spark應用日志信息?
查看Spark應用日志信息的保存路徑。
在Spark UI頁面,單擊Environment頁簽。
說明進入Spark UI的具體方法,請參見Spark開發編輯器。
在Environment頁簽下,單擊Spark Properties,查看
spark.app.log.rootPath
參數對應的Value,該Value即目標Spark應用日志信息的保存路徑。
設置日志信息的生命周期,自動刪除過期日志。具體操作,請參見基于最后一次修改時間的生命周期規則。
如何解決創建UDF時,Spark應用卡住的問題?
原因:Spark社區版本從OSS下載文件時的已知Bug。
解決方法:在Spark應用中需要添加以下配置參數。參數說明,請參見Spark應用配置參數說明。
SET spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES=oss://testBucketname/udf.jar;
SET spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES=oss://testBucketname/udf.jar;
SET spark.driver.extraClassPath=/tmp/testBucketname/udf.jar;
SET spark.executor.extraClassPath=/tmp/testBucketname/udf.jar;