Spark FAQトラブルシューティング(一)


本人がメンテナンスしているSparkは主に3つのHadoopクラスタで動作し、他にも小さなクラスタやプライバシークラスタがあります.これらの機械は合わせて3万台ぐらいある.現在運行メンテナンスのSparkは主にSpark 2がある.3とSpark 1.6の2つのバージョン.ユーザーが使用する過程で様々な問題が発生することは避けられないが,経験を沈殿させるためにもSparkユーザーに参考を提供するためにも,ここでは様々な問題をどのように処理するかを紹介する.故障の種類が多いので、複数のブログを開いて逐一紹介します.
ここではSpark 1について説明する.6とSpark 2.3はすべて存在するいくつかの故障で、後文は統一的に共通の故障と命名します.
一、通用故障
1、クラスタ環境クラス
1-1、提出したspark任務は、長い間ACCEPTED状態にある.
この問題は、クライアント・ログからtracking URLを見つける必要がある場合によくあります.たとえば、次のようにします.
18/12/14 17:42:29 INFO Client: 
     client token: N/A
     diagnostics: N/A
     ApplicationMaster host: N/A
     ApplicationMaster RPC port: -1
     queue: root.test
     start time: 1544780544655
     final status: UNDEFINED
     tracking URL: http://test.test.net:8888/proxy/application_1543893582405_838478/
     user: test
18/12/14 17:42:32 INFO Client: Application report for application_1543893582405_838478 (state: ACCEPTED)

その中のtracking URLはhttp://test.test.net:8888/proxy/application_1543893582405_838478/を選択して、ブラウザからページを開くと、次のような情報が表示されます.
User: test
Queue:  root.test
clientHost: 
Name: XXXXX
Application Type: SPARK
Application Tags: 
Application Priority: NORMAL (Higher Integer value indicates higher priority)
YarnApplicationState: ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
FinalStatus Reported by AM: Application has not completed yet.
Started:  Fri Dec 14 15:50:20 +0800 2018
Elapsed:  2hrs, 3mins, 55sec
Tracking URL: ApplicationMaster
Diagnostics:  

状態もACCEPTEDであることがわかります.キューはrootですtest.
開くhttp://test.test.net:8888/cluster/scheduler?openQueues=root.testああ、rootを見つけた.testキューのリソースには、次の情報が表示されます.
Used Resources: <799232 vcores:224="" gcores:0="">
Reserved Resources: <0 vcores:0="" gcores:0="">
Num Active Applications:  2
Num Pending Applications: 12
Min Resources:  <40000 vcores:20="" gcores:0="">
Max Resources:  <800000 vcores:400="" gcores:0="">
Accessible Node Labels: CentOS6,CentOS7,DEFAULT_LABEL
Steady Fair Share:  <800000 vcores:0="" gcores:0="">
Instantaneous Fair Share: <800000 vcores:0="" gcores:0=""/>

主にMax ResourcesとUsed Resourcesに注目し、ユーザーキューのリソースが消費されたことを示します.
1-2、Java 8がインストールされていない
ユーザによって発行されたジョブはtaskが実行されない前にAMが終了し、ジョブが失敗した.
Container exited with a non-zero exit code 127
Failing this attempt. Failing the application.
     ApplicationMaster host: N/A
     ApplicationMaster RPC port: -1
     queue: root.default
     start time: 1546850986115
     final status: FAILED
     tracking URL: http://test.test.net:8888/cluster/app/application_1493705730010_45634
     user: test
Moved to trash: /home/spark/cache/.sparkStaging/application_1493705730010_45634
19/01/07 16:48:07 INFO Client: Deleted staging directory hdfs://test.test.net:9000/home/spark/cache/.sparkStaging/application_1493705730010_45634
19/01/07 16:48:07 ERROR SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master.
    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.waitForApplication(YarnClientSchedulerBackend.scala:89)
    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:63)
    at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)
    at org.apache.spark.SparkContext.(SparkContext.scala:502)
    ...
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:879)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:197)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:227)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:136)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Exception in thread "main" java.lang.ExceptionInInitializerError
    ...
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:879)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:197)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:227)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:136)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master.
    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.waitForApplication(YarnClientSchedulerBackend.scala:89)
    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:63)
    at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)
    at org.apache.spark.SparkContext.(SparkContext.scala:502)
    ... 11 more

tracking URLを表示すると、次の情報が表示されます.
/bin/bash: /home/xxx/xxxxx/java8/bin/java: û���Ǹ��ļ���Ŀ¼

明らかにクラスタのいくつかの機械がjava 8を漏らした.
2、spark応用クラス
2-1、executorが接続できないため、タスクが失敗する
Caused by: java.net.ConnectException: Connection refused: /10.160.113.58:39941 
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:735) 
    at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:223)

ノード上のnodemanager上のcontainerのログ表示
INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Memory usage of ProcessTree 29181 for container-ia
container e124 1 888381: 10.7 GB of 11 GB physical memory used; 11.7 GB of 23.1 GB virtual memory used
INFO org.apac e.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl: Container container e124 1543893582485 1154818 81 
transitioned f om RUNNING to KILLING
INFO org.apache.hadoop.yarn.server.nodemanager.contaxnermanager.launcher.ContaznerLaunch. Cleaning up container container e124 1543893582485 1154
18 
INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Memory usage of ProcessTree 29181 for container-ia container e124 1543893582485 1154818 81 888381: -1B of 11 GB physical memory used; -1B of 23.1 GB virtual memory used
INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl: Container container e124 1543893582485 1154818 81 
transitioned from KILLING to EXITED WITH FAIIURE
WARN org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger: USER=hdp-portrait OPERATION=Container Finished — Failed TARGET=ContainerImpl P SULT=FAILURE DESCRIPTION=Container failed with state: EXITED WITH FAILURE APPID=application 1543893582485 1154818 CONTAINERID=container e124 1543893582485 115481 1 888381
INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl: Container container e124 1543893582485 1154818 81 888381 transitioned from EXITED WITH FAILURE to DONE

またはタスクログ表示
ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL 15: SIGTERM

理由:
                executor   ,           ,      。

解決方法:
           ,             ,  excutor-memory        executor-cores                  。

2-2、spark kryo size設定が小さすぎたり最大値を超えたり(<2 G)
Job aborted due to stage failure: Task 2 in stage 3.0 failed 4 times, most recent failure: 
Lost task 2.3 in stage 3.0 (TID 28, hpc152.sys.lycc.qihoo.net, executor 11): 
org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 2, required: 8

sparkを合理的に設定する.kryoserializer.buffer.max,spark.kryoserializer.buffer spark.kryoserializer.buffer.maxは2 Gより小さいはずです2 Gより小さいか間違っているかを設定すると、入力データが大きすぎたり、論理的に複雑に生成されたデータが多い可能性があります.taskあたりの処理データ量を減らすことをお勧めします.
2-3、executorメモリオーバーフロー
executor java.lang.OutOfMemoryError:Java heap space

解決方法:
  excutor-memory      executor-cores                 。

2-4、sparkジョブタイムアウト
Connection to /10.203.34.203:36650 has been quiet for 300000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong.
Connection to /10.203.34.203:36650 has been quiet for 300000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong.
Connection to /10.203.34.203:36650 has been quiet for 300000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong.
Connection to /10.203.34.203:36650 has been quiet for 300000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong.
Connection to /10.203.34.203:36650 has been quiet for 300000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong

理由:
 executor gc    ,    

解決方法:
1、  excutor-memory      executor-cores                 。
2、    spark.network.timeout

2-5、WARN cannot remove/xxxxx/data_mode=d/xxx:No such file or directory
18/12/17 17:17:17 WARN FileSystem:java.io.FileNotFoundException: 
cannot remove /xxxxx/data_mode=d/hist_dur=1/part-00000-cad0a9bc-0c8b-4298-b636-207f107732c1-c000: 
No such file or directory. at org.apache.hadoop.fs.FsShell.delete(FsShell.java:1423) 
at org.apache.hadoop.hdfs.DistributedFileSystem.deleteUsingTrash(DistributedFileSystem.java:956)  

このような警告情報については、ジョブに影響を及ぼさず、ユーザは無視することができる.
2-6、WARN fs.TrashPolicyDefault: Can’t create trash directory: hdfs://xxx/xxx/...
19/01/07 11:51:31 WARN fs.TrashPolicyDefault: Can’t create trash directory: hdfsold://xxxxx:9000/user/xxxxx/.Trash/Current/home/xxxxx/project/bool/userdata/optimization/targeting/xxxxxxxxxx/xxxxxxx
Problem with Trash.java.io.FileNotFoundException: Parent path is not a directory: /user/xxxxx/.Trash/Current/home/xxxxx/project/bool/userdata/optimization/targeting/xxxxxxxxxx/xxxxxxx
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.mkdirs(FSDirectory.java:1637)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:4177)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:4107)
at org.apache.hadoop.hdfs.server.namenode.NameNode.mkdirs(NameNode.java:1184)
at sun.reflect.GeneratedMethodAccessor122.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.ipc.RPCServer.call(RPC.java:743) at org.apache.hadoop.ipc.ServerServer.call(RPC.java:743)atorg.apache.hadoop.ipc.ServerHandler1.run(Server.java:1189) at org.apache.hadoop.ipc.Server1.run(Server.java:1189)atorg.apache.hadoop.ipc.ServerHandler1.run(Server.java:1185) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.ipc.Server1.run(Server.java:1185)atjava.security.AccessController.doPrivileged(NativeMethod)atjavax.security.auth.Subject.doAs(Subject.java:415)atorg.apache.hadoop.ipc.ServerHandler.run(Server.java:1183)
. Consider using -skipTrash option

このような警告情報については、ジョブに影響を及ぼさず、ユーザは無視することができる.
2-7、Total size of serialized results of ... is bigger than spark.driver.maxResultSize (1024.0 MB)
ユーザーが実行するエラーメッセージ:
ERROR TaskSetManager: Total size of serialized results of 329 tasks (1025.4 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

この問題は一般に,spark−sqlでユーザが直接クエリして返すデータ量が大きすぎるためである.ユーザーアプリケーションでdriver側にデータを抽出するAPI(collect、showなど)が使用されている可能性もあります.
解決方法:ユーザーはdriver側にデータを引き出すのが合理的かどうかを考慮すべきですか?合理的でない場合は、フィルタ条件を増やしたり、insert overwrite directoryコマンドを使用して解決したりします.合理的であればsparkを適宜増加する.driver.maxResultSizeのサイズ.
2-8、 Current usage: 3.5 GB of 3.5 GB physical memory used
ユーザー・ジョブで次のエラーが発生しました.
19/01/10 16:01:01 ERROR YarnScheduler: Lost executor 70 on 10.162.90.26: Executor for container container_e46_1545125871120_683318_01_000071 exited because of a YARN event (e.g., pre-emption) and not because of an error in the running j
ob.
19/01/10 16:02:32 ERROR YarnScheduler: Lost executor 265 on 10.160.98.120: Container marked as failed: container_e46_1545125871120_683318_01_000252 on host: 10.160.98.120. Exit status: 137. Diagnostics: Container killed on request. Exit
code is 137. More Information
Container exited with a non-zero exit code 137
Killed by external signal
​
19/01/10 16:02:35 ERROR YarnScheduler: Lost executor 159 on 10.160.107.169: Container marked as failed: container_e46_1545125871120_683318_01_000164 on host: 10.160.107.169. **\*==Exit status: 15. Diagnostics: Container [pid=31942,containerID=container_e46_1545125871120_683318_01_000164] is running beyond physical memory limits. Current usage: 3.5 GB of 3.5 GB physical memory used; 5.3 GB of 7.3 GB virtual memory used. Killing container.**==*

このような問題が発生した場合は、まずデータが傾いているかどうかを確認し、傾いていない場合は、パーティション数を適切に増加できるかどうかを確認したり(パーティションの設定が多すぎるのは代価がある)、ソースからフィルタリングしたり、データ量を減らしたりする必要があります.最後にできません.executorのメモリを高くします.
3、PySpark関連
3-1、python不適切な使用
ERROR ApplicationMaster: User class threw exception: java.io.IOException: Cannot run 
program "./python27/bin/python": error=2, No such file or directory
java.io.IOException:Cannot run program "./python27/bin/python": error=2, 
No such file or directory   

解決方法:ユーザーはarchives方式でpython 2をコミットする.7.tgz、このtgzはマルチレベルディレクトリで指定されたPythonのパスが間違っています.
3-2、pythonタスクが長時間終了しない
ユーザーのexecutorスレッドを表示すると、次のことがわかります.
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:152)
java.net.SocketInputStream.read(SocketInputStream.java:122)
java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
java.io.BufferedInputStream.read(BufferedInputStream.java:334)
java.io.DataInputStream.readFully(DataInputStream.java:195)
java.io.DataInputStream.readFully(DataInputStream.java:169)
org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:142)
org.apache.spark.api.python.PythonRunner$$anon$1.next(PythonRDD.scala:129)
org.apache.spark.api.python.PythonRunner$$anon$1.next(PythonRDD.scala:125)
org.apache.spark.InterruptibleIterator.next(InterruptibleIterator.scala:43)
scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:149)
org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73)
org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
org.apache.spark.scheduler.Task.run(Task.scala:89)
org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:724)

pysparkは実際にpythonプロセスとjavaプロセスがsocket通信によって実現されるように作成され、pysparkはアーキテクチャ上生まれつき効率的で性能が悪いという問題を実行する.scala実装に変更することをお勧めします.sparkの同業者はapache arrowで最適化できると教えてくれたが、現在は調査していない.
4、ユーザープログラム自身の問題
このような問題は、空のポインタ異常、配列アクセスの限界など、ユーザーコード自体のエラーです.
4-1、テストコード
ユーザーフィードバック:yarn-clientモードで実行に成功しましたが、clusterモードに切り替えることに失敗しました.調査の結果,ユーザのコードのテストコードが正式に変更されていないことが分かった.ユーザーのコードの一部は次のとおりです.
def main(args: Array[String]): Unit={
  val spark = SparkSession.builder().master("local")
  .appName("test****").getOrCreate()
​
  //         
  spark.stop()
}

4-2、SparkSession、SparkContextなどのコアクラスはmain関数の外に書かない
ユーザのジョブコミット実行は成功せず,チェックした結果コードの使い方が間違っていることが分かった.
val sparkConf = new SparkConf().setAppName("xxxxxx")
.set("spark.driver.maxResultSize","3g")
.setMaster("yarn-client")
val sc = new SparkContext(sparkConf)
​
def main (args: Array[String]): Unit = {
val checklist = sc.textFile("hdfs://xxxxxx:9000/home/xxxxx/xxxxx/*/*.txt")
.filter(x=>x.split(",").length==9).map(x=>x.toString.replace(" ",""))

今後も他のSparkタスクのトラブルシューティングの記事が続々と掲載されます.