簡體   English   中英

如何從執行者那里以正確的順序獲取數據 pyspark

[英]How to get data in correct order from executors pyspark

這是代碼:

oRdd = new_Rdd.sortBy(priceToInt)
oRdd.foreach(printFunc)

完成此操作后,我幾乎正確地對數據集進行了排序。 我想在最后對數據集進行整體排序。 上面我得到排序的數據集,但每個執行者。

Output(例如):

'8000'
'8500'
'8500'
20/04/13 20:37:30 INFO PythonRunner: Times: total = 598, boot = 558, init = 22, finish = 18
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\shuffle.py:60: UserWarning: Please install psutil to have better support with spilling
'2600'
'4400'
'4700'
20/04/13 20:37:30 INFO PythonRunner: Times: total = 1131, boot = 1108, init = 3, finish = 20
20/04/13 20:37:31 INFO Executor: Finished task 0.0 in stage 4.0 (TID 10). 1807 bytes result sent to driver
20/04/13 20:37:31 INFO Executor: Finished task 1.0 in stage 4.0 (TID 11). 1850 bytes result sent to driver
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\shuffle.py:60: UserWarning: Please install psutil to have better support with spilling
20/04/13 20:37:31 INFO TaskSetManager: Finished task 0.0 in stage 4.0 (TID 10) in 1713 ms on DESKTOP-NK51QUH (executor driver) (1/3)
20/04/13 20:37:31 INFO TaskSetManager: Finished task 1.0 in stage 4.0 (TID 11) in 1718 ms on DESKTOP-NK51QUH (executor driver) (2/3)
'13000'
'13400'
'13500'

我想:

'2600'
'4400'
'4700'

'8000'
'8500'
'8500'

'13000'
'13400'
'13500'

一切似乎都井井有條。

oRdd.foreach(println)將在您的執行程序中並行運行,並單獨打印其排序 RDD 分區的每個 RDD 元素。

您的 Spark 應用程序似乎與 3 個執行程序一起運行。 您可以在下圖中看到每個執行程序如何僅托管 RDD(彈性分布式數據集)的特定分區。

在此處輸入圖像描述

在您生成的這些打印件中,每個執行者都必須以有序的方式打印其數據部分。 不要試圖按照記錄的順序拼接所有打印,並得出 RDD 未排序的結論。

如果您想確保 Spark 按照您希望的方式對 RDD 進行排序,只需執行oRdd.collect().foreach(println)即可將整個 RDD 收集到驅動程序。

在你的情況下,你的驅動程序進程似乎有足夠的 memory 將整個 RDD 帶到 Spark 應用程序驅動程序(見圖)。 這不是您通常會對大型數據集執行的操作。這只是為了滿足您的訂單驗證。

對於大數據集,將整個 RDD 引入 Spark Application Driver 可能會導致 Driver 進程的 Out of Memory:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM