spark 2.X 疑難問題匯總
當前spark任務都是運行在yarn上,所以不用啟動長進程worker,也沒有master的HA問題,所以主要的問題在任務執行層面。
作業故障分類
故障主要分為版本,內存和權限三方面。
- 各種版本不一致
- 各種內存溢出
- 其他問題
版本不一致
1)java版本不一致
報錯:java.lang.UnsupportedClassVersionError: com/immomo/recommend/RedisDao: Unsupported major.minor version 52.0
處理:該問題一般是spark的java版本與作業編譯的java版本不一致,建議將本地java版本改為與spark一致的版本(目前集群是1.7.0_71)。
1
2
2)scala版本不一致
報錯:
java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/
JavaMirrors JavaMirror;
1
2
處理:該報錯就是本地使用的scala版本與集群的不一致,建議把本地scala版本替換為集群版本scala 2.11.8
1
3) 本地jar包跟hdfs遠程的不一致
報錯:
local class incompatible: stream classdesc serialVersionID = -6965587383804958479374, local class serialVersionID = -2231952633394736947
4) spark版本不一致
報錯:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.SparkContext.assertNotStopped()at org.apache.spark.sql.SparkSession.<init>(SparkSession.scala:80)
處理:檢查bash和spark-env.sh中的SPARK_HOME,看是不是目標版本,如果不是就修改。這個問題在spark新老版本遷移中可能出現。
5) hive metastore與spark的編譯hive版本不一致(spark sql 插入語句失敗)
報錯:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to alter table. Invalid method name: ‘alter_table_with_cascade‘
Caused by: org.apache.thrift.TApplicationException: Invalid method name: ‘alter_table_with_cascade‘
解決方法:任務啟動加參數 –conf spark.sql.hive.metastore.version=”0.14.0” –conf spark.sql.hive.metastore.jars=maven
在hdfs上創建文件,並在SPARK_HOME/conf/hive-site.xml設置對應參數:hive.exec.stagingdir值為/tmp/hive/spark-${user.name}
該參數權限設置為777
這個maven涉及包有~/.m2 ~/.ivy2的jar文件
參考:https://discourse.looker.com/t/fixing-spark-default-metastore-and-hive-metastore-mismatch-issues-prior-to-looker-3-44/2123
內存問題
1)GC開銷超過限制
報錯:
java.lang.OutOfMemoryError: GC overhead limit exceeded at scala.collection.immutable.HashMap.scala.collection.immutable.HashMap makeHashTrieMap(HashMap.scala:175)
處理:分為兩個角度,一是是檢查代碼,減少不必要的冗余,重用的RDD要序列化緩存,減少shuffle數據,加大並行度;二從參數配置看,加大executor內存,增加shuffle buffer緩存,但有時候也因為job寫的太低效而出現無效。
2)空指針異常
報錯:
java.lang.NullPointerException at com.immomo.recommend.recommend_molive anonfun 1.apply(recommend_molive.scala:83)
處理:該問題一般是代碼中的,檢查數組,對象內容是否可能為空;尤其是表數據,能有字段的值為null,但沒有處理null,出現這個錯誤。
3)kyro 緩存溢出
報錯:
java.lang.OutOfMemoryError: Java heap space at com.esotericsoftware.kryo.io.Output.require(Output.java:168)
處理:該報錯堆棧可以看到是kyro請求空間,結果不夠出現溢出,因為kyro序列化器能序列化的單個對象最大限制為spark.kryoserializer.buffer.max定義,這個值最大為2g。所以建議優先檢查代碼中的大對象,想辦法裁剪對象大小,如果不行再考慮增大spark.kryoserializer.buffer.max數值。
4)driver端數據溢出
報錯:
Job aborted due to stage failure: Total size of serialized results of 334502 tasks (1024.0 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)
處理:對於collect和一些操作,driver會接收各task執行後的數據,spark.driver.maxResultSize參數控制接收數據大小,建議先檢查代碼,避免或減少take,collect操作,如果不成功再考慮增大該參數。
5)container內存不足被kill
報錯:
Job aborted due to stage failure ExecutorLostFailure (executor 2101 exited caused by one of the running tasks) Reason: Container marked as failed: container_1491814332016_46280_01_009179 on host
處理:1、增大分區數,使用 set spark.sql.shuffle.partitions=1000(或更大)
2、調整代碼,減少數據讀取量
5)單個分區數據空間超過2G
報錯:
java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:828)
at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:103) at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:91)
at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1307)
at org.apache.spark.storage.DiskStore.getBytes(DiskStore.scala:105)
at org.apache.spark.storage.BlockManager.org$apache$spark$storage$BlockManager$$doGetLocalBytes(BlockManager.scala:496) at org.apache.spark.storage.BlockManager$$anonfun$getLocalBytes$2.apply(BlockManager.scala:474)
at org.apache.spark.storage.BlockManager$$anonfun$getLocalBytes$2.apply(BlockManager.scala:474)
at scala.Option.map(Option.scala:146)
處理:該問題是分區數據存儲的時候出現報錯,因為單個分區上限是2G,超過該限制則報錯,解決方法是調大分區,使用repartition或對含有shuffle算子指定一個大分區即可。
不僅如此,shuffle 過程fetch block的最大size也是2G。此外還有多項與2G有關的limitation需要註意
其他問題
1)代碼不規範
報錯:
org.apache.spark.SparkException: This RDD lacks a SparkContext. It could happen in the following cases:
(1) RDD transformations and actions are NOT invoked by the driver, but inside of other transformations; for example, rdd1.map(x => rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. For more information, see SPARK-5063.
處理:這個報錯是因為RDD的transformation中嵌套transformation或action,導致計算失敗,可以先從報錯那一行找到嵌套的trans或action操作,把這個操作拿出來運算。
2)磁盤臨時文件空間不足
報錯:
java.io.IOException: No space left on device
處理:在shuffle過程中,中間文件都放在/tmp目錄,當shuffle文件達到磁盤空間上限,就報錯。解決方法可以增大executor個數,分擔壓力,如果仍不可以的話就聯系平臺同學配置spark-default.conf中設置spark.local.dir(默認是/tmp)為磁盤空間足夠的目錄即可解決。在yarn模式則配置LOCAL_DIRS。
3)文件沒有訪問權限
報錯:
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=dm, access=EXECUTE, inode="/user/hadoop/.sparkStaging/application_1480755301936_1884":hadoop:supergroup:drwx------
處理:查看這個job是什麽用戶執行,要確定任務執行的權限,一般是使用其他組件調用,導致執行用戶變化,導致沒有文件權限。
4)yarn cluster模式使用SQL找不到表
報錯:
org.apache.spark.sql.AnalysisException: Table or view not found:
at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.getTable(Analyzer.scala:306)
處理: 在提交代碼參數中增加 –files */hive-site.xml,參數,表示提交代碼時提交hive相關配置信息。
5) 參數提交順序不當,導致job不能提交到yarn
有同學submit任務參數順序不當,導致參數沒有傳遞成功,一般–class參數放後面,–master –conf之類參數在前面
6) 系統存在多版本python情況下執行bin/pyspark報錯
報錯:
`pyenv: python2.7: command not found
The python2.7‘ command exists in these Python versions:
2.7.7
2.7.8
處理:手動指定使用的python版本,如執行: pyenv shell 2.7.8
7) jdbc連接hiveserver2出錯
報錯:
ExecuteStatement failed: out of sequence response 或者Read a negative frame size (-2147418110)!
處理方法:參考HIVE-10410的patch
8)使用spark集群模式,報表找不到(用戶錯位,導致權限報錯)
報錯:
pyspark.sql.utils.AnalysisException: u‘Table or view not found:online.ml_molive_user_anchor_attr; line 1 pos 33‘
處理方法:–files /opt/spark2/conf/hive-site.xml
9) 使用spark sql查詢報錯文件找不到
報錯:
java.io.IOException not a file: hdfs:// **** java.sql.SQLException
處理:設置參數即可,SET mapred.input.dir.recursive=true; SET hive.mapred.supports.subdirectories=true;
10) 賬戶拆分,導致執行spark sql沒權限
報錯:
`py4j.protocol.Py4JJavaError: An error occurred while calling o205.sql.
java.lang.RuntimeException: java.lang.RuntimeException: java.io.IOException: Permission denied
…….
Caused by: java.io.IOException: Permission denied
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:1006)
at java.io.File.createTempFile(File.java:1989)
at org.apache.hadoop.hive.ql.session.SessionState.createTempFile(SessionState.java:818)
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:513)`
解決方法:查詢得知是參數hive.exec.local.scratchdir對應的路徑沒有權限,刷權限後解決。
11) Container marked as failed
問題:
scheduler.TaskSetManager: Lost task 53.0 in stage 2.2 (TID 440, bigdata38.webmedia.int): ExecutorLostFailure (executor 9 exited caused by one of the running tasks) Reason: Container marked as failed: container_e50_1490337980512_0006_01_000010 on host: bigdata38.webmedia.int. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143
ERROR CoarseGrainedExecutorBackend: RECEIVED SIGNAL TERM
org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [20 seconds]. This timeout is controlled by spark.executor.heartbeatInterval
1
2
3
4
5
(以上是分析不同進程日誌匯總得到)
問題原因:雖然以上報錯不能直接看出原因,但大概率與內存相關,因為作業內存不足,導致GC,GC可能導致executor與AM通信超時,故AM認為executor掛了,會發停止的signal。
解決:1、增加硬件資源 2、增大作業並發度,加大executor通信超時時間spark.executor.heartbeatInterval
12)java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
復現過程:spark 2.2.1 運行SparkThriftserver,點擊查看executor後沒有數據信息。
報錯:
第一次點擊查看exevutor頁面報如下錯誤:
java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:331)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:392)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.spark_project.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:640)
at org.spark_project.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:496)
at org.spark_project.jetty.servlet.ServletHolder.ensureInstance(ServletHolder.java:788)
at org.spark_project.jetty.servlet.ServletHolder.prepare(ServletHolder.java:773)
at org.spark_project.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:578)
at org.spark_project.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180)
at org.spark_project.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
at org.spark_project.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.spark_project.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.spark_project.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:461)
at org.spark_project.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
at org.spark_project.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.spark_project.jetty.server.Server.handle(Server.java:524)
.....
第二次點擊查看executor的tab
17/12/04 12:48:36 WARN ServletHandler: /api/v1/applications/application_1511942712793_0065/allexecutors
java.lang.NullPointerException
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
at org.spark_project.jetty.servlet.ServletHolder.handle(ServletHolder.java:845)
at org.spark_project.jetty.servlet.ServletHandlerCachedChain.doFilter(ServletHandler.java:1689)
at org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter.doFilter(AmIpFilter.java:159)
at org.spark_project.jetty.servlet.ServletHandlerCachedChain.doFilter(ServletHandler.java:1676)
at org.spark_project.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
.........
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
解決方法:報錯是因為 Application#getProperties() 方法屬於JAX-RS 2協議(javax.ws.rs-api-2.0.1.jar),而不是JAX-RS 1(jsr311-api.jar),所以項目中可能jar包版本沖突導致。
於是查找$SPARK_HOME/jars下的包,把jsr311-api-1.1.1.jar刪掉就解決以上問題。
(以上均為工作中遇見過的問題,分享出來,後面持續更新…)
參考:
spark 2.x yarn errors and some solution
13) spark因為輸入小文件過多導致task數目很大,作業效率下降。
使用 newAPIHadoopFile API完成數據輸入,選擇org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat類可以將多個小文件合並生成一個Split(一個split對應一個patition,一個partition對應一個task),從而減小task數目
參考:spark輸入小文件合並
14)Spark 讀取Hbase 映射到Hive中的外部表報
報錯:
1)java.lang.NoSuchMethodError: org.apache.hadoop.hive.serde2.lazy.LazySim
java.lang.NoSuchMethodError:
2)org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.initSerdeParams(Lorg/apache/hadoop/conf/Configuration;Ljava/util/Properties;Ljava/lang/String;)Lorg/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe$SerDeParameters;
1
2
3
spark執行hive引入的hbase外部表,需要在spark的jars中加入hbase相關的包,除了包含hbase*的包,還需要htrace-core-2.04.jar、hive-serde-*.jar
加入進入後還要引入hbase-site.xml到$SPARK_HOME/conf中
參考:spark sql讀hbase數據
---------------------
作者:xwc35047
來源:CSDN
原文:https://blog.csdn.net/xwc35047/article/details/53933265
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
spark 2.X 疑難問題匯總