原文地址:https://my.oschina.net/tearsky/blog/629201
摘要:
1、Operation category READ is not supported in state standby
2、配置spark.deploy.recoveryMode選項爲ZOOKEEPER
3、多Master如何配置
4、No Space Left on the device(Shuffle臨時文件過多)
5、java.lang.OutOfMemory, unable to create new native thread
6、Worker節點中的work目錄佔用許多磁盤空間
7、spark-shell提交Spark Application如何解決依賴庫
8、Spark在發佈應用的時候,出現連接不上master問題
9、開發spark應用程序(和Flume-NG結合時)發佈應用時可能出現org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800
10、spark-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------
19、Exception 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
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
25、pyspark TypeError: 'JavaPackage' object is not callable
26、spark als StackOverflowError
注意:如果Driver寫好了代碼,eclipse或者程序上傳後,沒有開始處理數據,或者快速結束任務,也沒有在控制檯中打印錯誤,那麼請進入spark的web頁面,查看一下你的任務,找到每個分區日誌的stderr,查看是否有錯誤,一般情況下一旦驅動提交了,報錯的情況只能在任務日誌裏面查看是否有錯誤情況了
1、Operation 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,應用程序會輪詢列表。
4、No Space Left on the device(Shuffle臨時文件過多)
由於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到所有配置項
5、java.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
6、Worker節點中的work目錄佔用許多磁盤空間
目錄地址:/home/utoken/software/spark-1.3.0-bin-hadoop2.4/work
這些是Driver上傳到worker的文件,需要定時做手工清理,否則會佔用許多磁盤空間
7、spark-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: 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啓動問題 - 推酷》
10、spark-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]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集羣或者客戶端時,報以上錯誤,
[bdata@bdata4 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:
HOME/.local/bin:HOME/bin:SQOOP_HOME/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.orgapache
sparkscheduler
DAGScheduler$$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方式提交即可,如:
[bdata@bdata4 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才行
下載地址:https://github.com/srccodes/hadoop-common-2.2.0-bin/archive/master.zip (記得FQ哦)
任何項目都生效,需要配置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有問題,建議最好把任務程序發佈到服務器上面解決
19、Exception 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 error already tried 45 time(s); maxRetries=45
場景描述:spark提交任務,發現9個節點用8個運行都很快,只有一個節點一直失敗,查看ui頁面也沒有發現數據傾斜
問題定位:通過查看節點的work日誌發現如下輸出:
問題解決:修改spark的最大重試參數:spark.port.maxRetries 值從45=>16
23.cloudera 更改spark高級配置:
業務場景:在使用cloudera manager搭建spark集羣的過程中總是有些參數在配置界面中搜索不到
問題解決:集羣=>配置=>高級,找到右側的顯示所有說明,找到你要修改的配置文件就可以了
24.Exception in thread "Thread-2" java.lang.OutOfMemoryError: PermGen space
問題原因:在JVM中,PermGen用於保存加載的類,yarn Client模式的持久代默認大小是32M;
解決方案:spark-submit時增加如下參數:“--driver-java-options -XX:MaxPermSize=256m"
25.pyspark TypeError: 'JavaPackage' object is not callable
場景:
原文地址:https://my.oschina.net/tearsky/blog/629201
摘要:
1、Operation category READ is not supported in state standby
2、配置spark.deploy.recoveryMode選項爲ZOOKEEPER
3、多Master如何配置
4、No Space Left on the device(Shuffle臨時文件過多)
5、java.lang.OutOfMemory, unable to create new native thread
6、Worker節點中的work目錄佔用許多磁盤空間
7、spark-shell提交Spark Application如何解決依賴庫
8、Spark在發佈應用的時候,出現連接不上master問題
9、開發spark應用程序(和Flume-NG結合時)發佈應用時可能出現org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800
10、spark-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------
19、Exception 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
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,查看是否有錯誤,一般情況下一旦驅動提交了,報錯的情況只能在任務日誌裏面查看是否有錯誤情況了
1、Operation 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,應用程序會輪詢列表。
4、No Space Left on the device(Shuffle臨時文件過多)
由於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到所有配置項
5、java.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
6、Worker節點中的work目錄佔用許多磁盤空間
目錄地址:/home/utoken/software/spark-1.3.0-bin-hadoop2.4/work
這些是Driver上傳到worker的文件,需要定時做手工清理,否則會佔用許多磁盤空間
7、spark-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: 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啓動問題 - 推酷》
10、spark-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]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集羣或者客戶端時,報以上錯誤,
[bdata@bdata4 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:
HOME/.local/bin:HOME/bin:SQOOP_HOME/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.orgapache
sparkscheduler
DAGScheduler$$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方式提交即可,如:
[bdata@bdata4 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才行
下載地址:https://github.com/srccodes/hadoop-common-2.2.0-bin/archive/master.zip (記得FQ哦)
任何項目都生效,需要配置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有問題,建議最好把任務程序發佈到服務器上面解決
19、Exception 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 error already tried 45 time(s); maxRetries=45
場景描述:spark提交任務,發現9個節點用8個運行都很快,只有一個節點一直失敗,查看ui頁面也沒有發現數據傾斜
問題定位:通過查看節點的work日誌發現如下輸出:
問題解決:修改spark的最大重試參數:spark.port.maxRetries 值從45=>16
23.cloudera 更改spark高級配置:
業務場景:在使用cloudera manager搭建spark集羣的過程中總是有些參數在配置界面中搜索不到
問題解決:集羣=>配置=>高級,找到右側的顯示所有說明,找到你要修改的配置文件就可以了
24.Exception in thread "Thread-2" java.lang.OutOfMemoryError: PermGen space
問題原因:在JVM中,PermGen用於保存加載的類,yarn Client模式的持久代默認大小是32M;
解決方案:spark-submit時增加如下參數:“--driver-java-options -XX:MaxPermSize=256m"
25.pyspark TypeError: 'JavaPackage' object is not callable
場景:pyspark使用py4j調用java對象ALS,這裏有興趣同學可以根據報錯去跟讀源碼
問題原因:運行時找不到ALS類,也即沒有spark-mllib包
解決方案:spark-submit時添加如下參數“--jars /path/to/spark-mllib_scala.version−
{spark.version}.jar”
26、spark als StackOverflowError
場景:
als = ALS(maxIter=15, rank=rank, regParam=0.01, userCol="userId", itemCol="itemId", ratingCol="rating")
model = als.fit(ratings)
解決方案:
一般情況下ALS收斂是非常快的,將iteration設置爲<30的數字就可以了,絕大多數情況下,設置爲15就行。次數過多的情況下就會出現:java.lang.StackOverflowError。當然,也可也通過設置checkpoint來解決。
spark.sparkContext.setCheckpointDir("/tmp/als_checkpoint")
als = ALS(maxIter=numIterations, rank=rank, regParam=0.01, userCol="userId", itemCol="itemId", ratingCol="rating",checkpointInterval=2)
model = als.fit(ratings)