1. 程式人生 > >spark常見錯誤彙總

spark常見錯誤彙總

原文地址:https://my.oschina.net/tearsky/blog/629201

摘要:

  1Operation category READ is not supported in state standby

  2、配置spark.deploy.recoveryMode選項為ZOOKEEPER

  3、多Master如何配置

  4No Space Left on the deviceShuffle臨時檔案過多)

  5java.lang.OutOfMemory, unable to create new native thread

  6Worker節點中的work

目錄佔用許多磁碟空間

  7spark-shell提交Spark Application如何解決依賴庫

  8、Spark在釋出應用的時候,出現連線不上master問題

  9、開發spark應用程式(和Flume-NG結合時)釋出應用時可能出現org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800

  10spark-shell 找不到hadoop so問題解決

  11、ERROR XSDB6: Another instance of Derby may have already booted the database /home/bdata/data/metastore_db.

  12、java.lang.IllegalArgumentException: java.net.UnknownHostException: dfscluster

  13、Exception in thread "main" java.lang.Exception: When running with master 'yarn-client' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.

  14、Job aborted due to stage failure: Task 3 in stage 0.0 failed 4 times, most recent failure: Lost task 3.3 in

  15、長時間等待無反應,並且看到伺服器上面的web介面有記憶體和核心數,但是沒有分配

  16、記憶體不足或資料傾斜導致Executor Lost(spark-submit提交)

  17、java.io.IOException : Could not locate executable null\bin\winutils.exe in the Hadoop binaries.(spark sql on hive 任務引發HiveContext NullPointerException)

  18、The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx------

  19Exception in thread "main"org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/data":bdata:supergroup:drwxr-xr-x

  20、執行Spark-SQL報錯:org.apache.spark.sql.AnalysisException: unresolved operator 'Project‘

  21、org.apache.spark.shuffle.MetadataFetchFailedException:Missing an output location for shuffle 0/Failed to connect to hostname/192.168.xx.xxx:50268

注意:如果Driver寫好了程式碼,eclipse或者程式上傳後,沒有開始處理資料,或者快速結束任務,也沒有在控制檯中列印錯誤,那麼請進入spark的web頁面,檢視一下你的任務,找到每個分割槽日誌的stderr,檢視是否有錯誤,一般情況下一旦驅動提交了,報錯的情況只能在任務日誌裡面檢視是否有錯誤情況了

1Operation category READ is not supported in state standby

     org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby

     此時請登入Hadoop的管理介面檢視執行節點是否處於standby

如登入地址是:

     如果是,則不可在處於StandBy機器執行spark計算,因為該臺機器為備分機器

2、配置spark.deploy.recoveryMode選項為ZOOKEEPER

     如果不設定spark.deploy.recoveryMode的話,那麼叢集的所有執行資料在Master重啟是都會丟失,可參考BlackHolePersistenceEngine的實現。

3、多Master如何配置

     因為涉及到多個Master,所以對於應用程式的提交就有了一點變化,因為應用程式需要知道當前的Master的IP地址和埠。這種HA方案處理這種情況很簡單,只需要在SparkContext指向一個Master列表就可以了,如spark://host1:port1,host2:port2,host3:port3,應用程式會輪詢列表。

4No Space Left on the deviceShuffle臨時檔案過多)

         由於Spark在計算的時候會將中間結果儲存到/tmp目錄,而目前linux又都支援tmpfs,其實就是將/tmp目錄掛載到記憶體當中。

那麼這裡就存在一個問題,中間結果過多導致/tmp目錄寫滿而出現如下錯誤

No Space Left on the device

解決辦法

第一種:修改配置檔案spark-env.sh,把臨時檔案引入到一個自定義的目錄中去即可

export SPARK_LOCAL_DIRS=/home/utoken/datadir/spark/tmp

第二種:偷懶方式,針對tmp目錄不啟用tmpfs,直接修改/etc/fstab

cloudera manager 新增引數配置:篩選器=>高階=>搜尋“spark_env”字樣,新增引數export SPARK_LOCAL_DIRS=/home/utoken/datadir/spark/tmp到所有配置項

5java.lang.OutOfMemory, unable to create new native thread

Caused by: java.lang.OutOfMemoryError: unable to create new native thread

at java.lang.Thread.start0(Native Method)

at java.lang.Thread.start(Thread.java:640)

上面這段錯誤提示的本質是Linux作業系統無法建立更多程序,導致出錯,並不是系統的記憶體不足。因此要解決這個問題需要修改Linux允許建立更多的程序,就需要修改Linux最大程序數。

[[email protected] ~]$ulimit -a

臨時修改允許開啟的最大程序數

[[email protected] ~]$ulimit -u 65535

臨時修改允許開啟的檔案控制代碼

[[email protected] ~]$ulimit -n 65535

永久修改Linux最大程序數量

[[email protected] ~]$ vim /etc/security/limits.d/90-nproc.conf

*          soft    nproc     60000

root       soft    nproc     unlimited

永久修改使用者開啟檔案的最大控制代碼數,該值預設1024,一般都會不夠,常見錯誤就是not open file

[[email protected] ~]$ vim /etc/security/limits.conf

bdata  soft    nofile  65536

bdata  hard    nofile  65536

6Worker節點中的work目錄佔用許多磁碟空間

目錄地址:/home/utoken/software/spark-1.3.0-bin-hadoop2.4/work

這些是Driver上傳到worker的檔案,需要定時做手工清理,否則會佔用許多磁碟空間 

7spark-shell提交Spark Application如何解決依賴庫

spark-shell的話,利用--driver-class-path選項來指定所依賴的jar檔案,注意的是--driver-class-path後如果需要跟著多個jar檔案的話,jar檔案之間使用冒號(:)來分割。

8、Spark在釋出應用的時候,出現連線不上master問題,如下

15/11/19 11:35:50 INFO AppClient$ClientEndpoint: Connecting to master spark://s1:7077...

15/11/19 11:35:50 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://[email protected]:7077] has failed, address is now gated for [5000] ms. Reason: [Disassociated]

解決方式

檢查所有機器時間是否一致、hosts是否都配置了對映、客戶端和伺服器端的Scala版本是否一致、Scala版本是否和Spark相容

檢查是否相容問題請參考官方網站介紹:

9、開發spark應用程式(和Flume-NG結合時)釋出應用時可能出現org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800

15/11/27 10:33:44 ERROR ReceiverSupervisorImpl: Stopped receiver with error: org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800
15/11/27 10:33:44 ERROR Executor: Exception in task 0.0 in stage 2.0 (TID 70)
org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800

        at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)

Caused by: java.net.BindException: Cannot assign requested address

由於spark通過Master釋出的時候,會自動選取傳送到某一臺的worker節點上,所以這裡繫結埠的時候,需要選擇相應的worker伺服器,但是由於我們無法事先了解到,spark釋出到哪一臺伺服器的,所以這裡啟動報錯,是因為在 192.168.10.156:18800的機器上面沒有啟動Driver程式,而是釋出到了其他伺服器去啟動了,所以無法監聽到該機器出現問題,所以我們需要設定spark分發包時,釋出到所有worker節點機器,或者釋出後,我們去尋找釋出到了哪一臺機器,重新修改繫結IP,重新發布,有一定機率釋出成功。詳情可見《印象筆記-戰5渣系列——Spark Streaming啟動問題 - 推酷》

10spark-shell 找不到hadoop so問題解決

[main] WARN  org.apache.hadoop.util.NativeCodeLoader  - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

在Spark的conf目錄下,修改spark-env.sh檔案,加入LD_LIBRARY_PATH環境變數,值為HADOOP的native庫路徑即可.

11、ERROR XSDB6: Another instance of Derby may have already booted the database /home/bdata/data/metastore_db.

在使用Hive on Spark模式操作hive裡面的資料時,報以上錯誤,原因是因為HIVE採用了derby這個內嵌資料庫作為資料庫,它不支援多使用者同時訪問,解決辦法就是把derby資料庫換成mysql資料庫即可

變更方式

12、java.lang.IllegalArgumentException: java.net.UnknownHostException: dfscluster

解決辦法:

找不到hdfs叢集名字dfscluster,這個檔案在HADOOP的etc/hadoop下面,有個檔案hdfs-site.xml,複製到Spark的conf下,重啟即可

如:執行指令碼,分發到所有的Spark叢集機器中,

[[email protected] hadoop]foriin34,35,36,37,38;doscphdfs−site.xml192.168.10.foriin34,35,36,37,38;doscphdfs−site.xml192.168.10.i:/u01/spark-1.5.1/conf/ ; done

13、Exception in thread "main" java.lang.Exception: When running with master 'yarn-client' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.

問題:在執行yarn叢集或者客戶端時,報以上錯誤,

[[email protected] bin]$ ./spark-sql --master yarn-client

Exception in thread "main" java.lang.Exception: When running with master 'yarn-client' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.

解決辦法

根據提示,配置HADOOP_CONF_DIR or YARN_CONF_DIR的環境變數即可

export HADOOP_HOME=/u01/hadoop-2.6.1

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

PATH=PATH:PATH:HOME/.local/bin:HOME/bin:HOME/bin:SQOOP_HOME/bin:HIVEHOME/bin:HIVEHOME/bin:HADOOP_HOME/bin

14、Job aborted due to stage failure: Task 3 in stage 0.0 failed 4 times, most recent failure: Lost task 3.3 in

[Stage 0:>                                                         (0 + 4) / 42]2016-01-15 11:28:16,512 [org.apache.spark.scheduler.TaskSchedulerImpl]-[ERROR] Lost executor 0 on 192.168.10.38: remote Rpc client disassociated

[Stage 0:>                                                         (0 + 4) / 42]2016-01-15 11:28:23,188 [org.apache.spark.scheduler.TaskSchedulerImpl]-[ERROR] Lost executor 1 on 192.168.10.38: remote Rpc client disassociated

[Stage 0:>                                                         (0 + 4) / 42]2016-01-15 11:28:29,203 [org.apache.spark.scheduler.TaskSchedulerImpl]-[ERROR] Lost executor 2 on 192.168.10.38: remote Rpc client disassociated

[Stage 0:>                                                         (0 + 4) / 42]2016-01-15 11:28:36,319 [org.apache.spark.scheduler.TaskSchedulerImpl]-[ERROR] Lost executor 3 on 192.168.10.38: remote Rpc client disassociated

2016-01-15 11:28:36,321 [org.apache.spark.scheduler.TaskSetManager]-[ERROR] Task 3 in stage 0.0 failed 4 times; aborting job

Exception in thread "main" org.apache.spark.SparkException : Job aborted due to stage failure: Task 3 in stage 0.0 failed 4 times, most recent failure: Lost task 3.3 in stage 0.0 (TID 14, 192.168.10.38): ExecutorLostFailure (executor 3 lost)

Driver stacktrace:

      at org.apache.spark.scheduler.DAGScheduler.orgapacheapachesparkschedulerschedulerDAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1283)

解決方案

這裡遇到的問題主要是因為資料來源資料量過大,而機器的記憶體無法滿足需求,導致長時間執行超時斷開的情況,資料無法有效進行互動計算,因此有必要增加記憶體

15、長時間等待無反應,並且看到伺服器上面的web介面有記憶體和核心數,但是沒有分配,如下圖

[Stage 0:>                                                         (0 + 0) / 42]

或者日誌資訊顯示:

16/01/15 14:18:56 WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

解決方案

出現上面的問題主要原因是因為我們通過引數spark.executor.memory設定的記憶體過大,已經超過了實際機器擁有的記憶體,故無法執行,需要等待機器擁有足夠的記憶體後,才能執行任務,可以減少任務執行記憶體,設定小一些即可

16、記憶體不足或資料傾斜導致Executor Lost(spark-submit提交)

TaskSetManager: Lost task 1.0 in stage 6.0 (TID 100, 192.168.10.37): java.lang.OutOfMemoryError: Java heap space

16/01/15 14:29:51 INFO BlockManagerInfo: Added broadcast_8_piece0 in memory on 192.168.10.37:57139 (size: 42.0 KB, free: 24.2 MB)

16/01/15 14:29:53 INFO BlockManagerInfo: Added broadcast_8_piece0 in memory on 192.168.10.38:53816 (size: 42.0 KB, free: 24.2 MB)
16/01/15 14:29:55 INFO TaskSetManager: Starting task 3.0 in stage 6.0 (TID 102, 192.168.10.37, ANY, 2152 bytes)
16/01/15 14:29:55 WARN TaskSetManager: Lost task 1.0 in stage 6.0 (TID 100, 192.168.10.37): java.lang.OutOfMemoryError: Java heap space
        at java.io.BufferedOutputStream.<init>(BufferedOutputStream.java:76)
        at java.io.BufferedOutputStream.<init>(BufferedOutputStream.java:59)
        at org.apache.spark.sql.execution.UnsafeRowSerializerInstance$$anon$2.<init>(UnsafeRowSerializer.scala:55)
        at org.apache.spark.sql.execution.UnsafeRowSerializerInstance.serializeStream(UnsafeRowSerializer.scala:52)
        at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:92)
        at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.insertAll(BypassMergeSortShuffleWriter.java:110)
        at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:73)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
        at org.apache.spark.scheduler.Task.run(Task.scala:88)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

16/01/15 14:29:55 ERROR TaskSchedulerImpl: Lost executor 6 on 192.168.10.37: remote Rpc client disassociated
16/01/15 14:29:55 INFO TaskSetManager: Re-queueing tasks for 6 from TaskSet 6.0
16/01/15 14:29:55 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://[email protected]:42250] has failed, address is now gated for [5000] ms. Reason: [Disassociated]

16/01/15 14:29:55 WARN TaskSetManager: Lost task 3.0 in stage 6.0 (TID 102, 192.168.10.37): ExecutorLostFailure (executor 6 lost)

16/01/15 14:29:55 INFO DAGScheduler: Executor lost: 6 (epoch 8)
16/01/15 14:29:55 INFO BlockManagerMasterEndpoint: Trying to remove executor 6 from BlockManagerMaster.
16/01/15 14:29:55 INFO BlockManagerMasterEndpoint: Removing block manager BlockManagerId(6, 192.168.10.37, 57139)
16/01/15 14:29:55 INFO BlockManagerMaster: Removed 6 successfully in removeExecutor
16/01/15 14:29:55 INFO AppClient$ClientEndpoint: Executor updated: app-20160115142128-0001/6 is now EXITED (Command exited with code 52)
16/01/15 14:29:55 INFO SparkDeploySchedulerBackend: Executor app-20160115142128-0001/6 removed: Command exited with code 52

16/01/15 14:29:55 INFO SparkDeploySchedulerBackend: Asked to remove non-existent executor 6

.......

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 6.0 failed 4 times, most recent failure: Lost task 0.3 in stage 6.0 (TID 142, 192.168.10.36): ExecutorLostFailure (executor 4 lost)

......

WARN TaskSetManager: Lost task 4.1 in stage 6.0 (TID 137, 192.168.10.38): java.lang.OutOfMemoryError: GC overhead limit exceeded

解決辦法:

     由於我們在執行Spark任務是,讀取所需要的原資料,資料量太大,導致在Worker上面分配的任務執行資料時所需要的記憶體不夠,直接導致記憶體溢位了,所以我們有必要增加Worker上面的記憶體來滿足程式執行需要。

在Spark Streaming或者其他spark任務中,會遇到在Spark中常見的問題,典型如Executor Lost 相關的問題(shuffle fetch 失敗,Task失敗重試等)。這就意味著發生了記憶體不足或者資料傾斜的問題。這個目前需要考慮如下幾個點以獲得解決方案:

A、相同資源下,增加partition數可以減少記憶體問題。 原因如下:通過增加partition數,每個task要處理的資料少了,同一時間內,所有正在執行的task要處理的數量少了很多,所有Executor佔用的記憶體也變小了。這可以緩解資料傾斜以及記憶體不足的壓力。

B、關注shuffle read 階段的並行數。例如reduce,group 之類的函式,其實他們都有第二個引數,並行度(partition數),只是大家一般都不設定。不過出了問題再設定一下,也不錯。

C、給一個Executor 核數設定的太多,也就意味著同一時刻,在該Executor 的記憶體壓力會更大,GC也會更頻繁。我一般會控制在3個左右。然後通過提高Executor數量來保持資源的總量不變。

16、 Spark Streaming 和kafka整合後讀取訊息報錯:OffsetOutOfRangeException

解決方案:如果和kafka訊息中介軟體結合使用,請檢查訊息體是否大於預設設定1m,如果大於,則需要設定fetch.message.max.bytes=1m,這裡需要把值設定大些

17、java.io.IOException : Could not locate executable null\bin\winutils.exe in the Hadoop binaries.(spark sql on hive 任務引發HiveContext NullPointerException)

解決辦法

在開發hive和Spark整合的時候,如果是Windows系統,並且沒有配置HADOOP_HOME的環境變數,那麼可能找不到winutils.exe這個工具,由於使用hive時,對該命令有依賴,所以不要忽視該錯誤,否則將無法建立HiveContext,一直報Exception in thread "main" java.lang.RuntimeException:java.lang.NullPointerException

因此,解決該辦法有兩個方式

A、把任務打包成jar,上傳到伺服器上面,伺服器是配置過HADOOP_HOME環境變數的,並且不需要依賴winutils,所以只需要通過spark-submit方式提交即可,如:

[[email protected] app]$ spark-submit --class com.pride.hive.HiveOnSparkTest --master spark://bdata4:7077 spark-simple-1.0.jar

B、解決winutils.exe命令不可用問題,配置Windows上面HADOOP_HOME的環境變數,或者在程式最開始的地方設定HADOOP_HOME的屬性配置,這裡需要注意,由於最新版本已經沒有winutils這些exe命令了,我們需要在其他地方下載該命令放入HADOOP的bin目錄下,當然也可以直接配置下載專案的環境變數,變數名一定要是HADOOP_HOME才行

任何專案都生效,需要配置Windows的環境變數,如果只在程式中生效可在程式中配置即可,如

//用於解決Windows下找不到winutils.exe命令

System. setProperty("hadoop.home.dir", "E:\\Software\\hadoop-common-2.2.0-bin" );

18、The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx------

解決辦法

1、程式中設定環境變數:System.setProperty("HADOOP_USER_NAME", "bdata")

2、修改HDFS的目錄許可權

Update the permission of your /tmp/hive HDFS directory using the following command

#hadoop dfs -chmod 777 /tmp/hive

此問題暫未解決,估計是17點解決winutils有問題,建議最好把任務程式釋出到伺服器上面解決

19Exception in thread "main"org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/data":bdata:supergroup:drwxr-xr-x

解決辦法

1、在系統的環境變數或java JVM變數裡面新增HADOOP_USER_NAME,如程式中新增System.setProperty("HADOOP_USER_NAME", "bdata");,這裡的值就是以後會執行HADOOP上的Linux的使用者名稱,如果是eclipse,則修改完重啟eclipse,不然可能不生效

2、hdfs dfs -chmod 777 修改相應許可權地址

20、執行Spark-SQL報錯:org.apache.spark.sql.AnalysisException: unresolved operator 'Project

解決辦法:

在Spark-sql和hive結合時或者單獨Spark-sql,執行某些sql語句時,偶爾出現上面錯誤,那麼我們可以檢查一下sql的問題,這裡遇到的問題是巢狀語句太多,導致spark無法解析,所以需要修改sql或者改用其他方式處理;特別注意該語句可能在hive裡面沒有錯誤,spark才會出現的一種錯誤。

21、org.apache.spark.shuffle.MetadataFetchFailedException:Missing an output location for shuffle 0/Failed to connect to hostname/192.168.xx.xxx:50268

解決方法:

1.優化shuffle操作(比如groupby,join)

2.加大executor記憶體(spark.executor.memory)

3.加大並行化引數(spark.default.parallelism)

參考連結:

http://blog.csdn.net/lsshlsw/article/details/49155087

22、場景描述:spark提交任務,發現9個節點用8個執行都很快,只有一個節點一直失敗,檢視ui頁面也沒有發現數據傾斜
問題定位:通過檢視節點的work日誌發現如下輸出:

問題解決:修改spark的最大重試引數:spark.port.maxRetries 值從45=>16

23.spark streaming程式異常終止:

18/01/27 09:52:35 ERROR scheduler.DAGScheduler: Failed to update accumulators for ShuffleMapTask(421, 2)
java.net.SocketException: Broken pipe (Write failed)

18/01/27 09:52:36 ERROR scheduler.JobScheduler: Error generating jobs for time 1517017956000 ms
py4j.Py4JException: Cannot obtain a new communication channel

24.cloudera 更改spark配置:

業務場景:在使用cloudera  manager搭建spark叢集的過程中總是有些引數在配置介面中搜索不到

問題解決:叢集=>配置=>高階,找到右側的顯示所有說明,找到你要修改的配置檔案就可以了

25.java.io.IOException: Cannot run program “/etc/hadoop/conf.cloudera.yarn/topology.py” (in directory “/home/108857”): error=2。

Java.io.IOException: Cannot run program "/etc/hadoop/conf.cloudera.yarn/topology.py" (in directory "/etc/hadoop/conf.cloudera.yarn"): error=13, Permission denied
 

解決方案:

把datanode上的 /etc/hadoop/conf.cloudera.yarn/topology.py和topology.map 複製到執行spark-shell的機器上即可。

chmod 777 /etc/hadoop/conf.cloudera.yarn/topology.py