問題
集群開始減速,並可能顯示以下症狀的組合:
- 報告不健康集群事件:
- 請求超時。驅動程序暫時不可用。
- 亞穩態癱瘓了。
- DBFS已關閉。
- 您沒有看到任何與驅動程序進程相關的高GC事件或內存利用率。
- 當您在驅動程序節點上使用top時,您會看到間歇性的高平均負載。
- 與Ganglia相關的gmetad進程顯示間歇性的高CPU使用率。
- 根磁盤顯示了較高的磁盤使用率Df -h /.具體地說,/var/lib/ganglia/rrds顯示磁盤使用率高。
- Ganglia UI無法顯示負載分布。
您可以通過查找文件來驗證問題當地的在前綴In中/var/lib/ganglia/rrds.通常,這個目錄應該隻包含前綴為應用程序——< applicationId >.
例如:
%sh ls - ltrhr /var/lib/ganglia/rrds/ | grep -i local rw-rw-rw- 1 ganglia ganglia 616K Jun 29 18:00 local-1593453624916.driver. databicks . directorycommit . markerreaderrors .countrrd -rw-rw-rw- 1 ganglia ganglia 616K Jun 29 18:00 local-1593453614595.driver. databicks . directorycommit . deletedfilesfilters .count.rrd -rw-rw- 1 ganglia ganglia 616K Jun 29 18:00 local-1593453614595.driver. databicks . directorycommit . autovacuumcount .count。rrd -rw-rw-rw- 1 ganglia ganglia 616K 6月29日18:00 local- 1593453605185 .driver. codegenerator . generatedmethodsize .min.rrd
導致
Ganglia指標通常使用不到10GB的磁盤空間。但是,在某些情況下,可能會發生“數據爆炸”,導致根分區被Ganglia指標填滿。數據爆炸還會創建一個髒緩存。當發生這種情況時,Ganglia指標可能會在根目錄上消耗超過100GB的磁盤空間。
如果在Python文件中將spark會話變量定義為全局變量,然後調用同一文件中定義的函數對數據執行Apache spark轉換,就會發生這種“數據爆炸”。當這種情況發生時,Spark會話邏輯可以被序列化,以及所需的函數定義,從而在工作節點上創建一個Spark會話。
以Spark會話定義為例:
%python從pyspark。sql import SparkSession def get_spark(): """返回一個spark會話""" return SparkSession.builder.getOrCreate() if "spark"不在globals(): spark = get_spark() def generator(partition): print(globals()['spark']) for row in partition: yield [word.lower() for word in row["value"]]]
如果您使用以下示例命令,當地的創建有前綴的文件:
%python from repro import ganglia_test df = spark。createDataFrame((((“你好 "], ), ([" 火花 "], )], [" 價值”)df.rdd.mapPartitions (ganglia_test.generator) .toDF((“價值”)),告訴()
的print (globals()(“火花”))聲明發電機()函數不會導致錯誤,因為它在工作節點中作為全局變量可用。在某些情況下,它可能會因無效鍵錯誤而失敗,因為該值不能作為全局變量使用。在短批處理間隔上執行的流作業容易受到此問題的影響。
解決方案
確保你沒有使用SparkSession.builder.getOrCreate ()將Spark會話定義為全局變量。
在進行故障排除時,可以使用帶有本地前綴的文件上的時間戳來幫助確定第一次引入有問題的更改的時間。