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:Failedtobindto:/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 任務引發HiveContextNullPointerException)

  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:Missingan output locationfor shuffle0/Failed to connect to hostname/192.168.xx.xxx:50268

  22、spark error already tried 45 time(s); maxRetries=45

  23.cloudera 更改spark高階配置

  24、spark Exception in thread "Thread-2" java.lang.OutOfMemoryError: PermGen space

注意:如果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

如登入地址是:

http://192.168.50.221:50070/dfshealth.html#tab-overview

如果是,則不可在處於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最大程序數。

[utoken@nn1 ~]$ulimit -a

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

[utoken@nn1 ~]$ulimit -u 65535

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

[utoken@nn1 ~]$ulimit -n 65535

永久修改Linux最大程序數量

[utoken@nn1 ~]$ vim /etc/security/limits.d/90-nproc.conf

* soft nproc 60000

root soft nproc unlimited

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

[utoken@nn1 ~]$ 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://sparkMaster@s1: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:Failedtobindto:/192.168.10.156:18800

15/11/2710:33:44ERRORReceiverSupervisorImpl:Stoppedreceiverwitherror:org.jboss.netty.channel.ChannelException:Failedtobindto:/192.168.10.156:18800
15/11/2710:33:44ERRORExecutor:Exceptionintask0.0instage2.0(TID70)
org.jboss.netty.channel.ChannelException:Failedtobindto:/192.168.10.156:18800

atorg.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)

Causedby:java.net.BindException:Cannotassignrequestedaddress

由於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叢集機器中,

[bdata@bdata4 hadoop]