簡體   English   中英

跨多個工作節點分布一個 python function

[英]Distributing a python function across multiple worker nodes

我試圖了解什么是一個很好的框架,它可以輕松地與現有的 python 代碼集成,並允許跨多個工作節點分布一個巨大的數據集以對其執行一些轉換或操作。

期望每個工作節點都應根據特定鍵(此處為以下交易數據中給出的國家/地區)分配數據,工作節點執行所需的轉換並將結果返回給領導節點。

最后,領導節點應該對從工作節點獲得的結果進行聚合,並返回一個最終結果。

transactions = [
    {'name': 'A', 'amount': 100, 'country': 'C1'},
    {'name': 'B', 'amount': 200, 'country': 'C2'},
    {'name': 'C', 'amount': 10, 'country': 'C1'},
    {'name': 'D', 'amount': 500, 'country': 'C2'},
    {'name': 'E', 'amount': 400, 'country': 'C3'},
]

我遇到了一個類似的問題,建議將 Ray 作為一個選項,但 Ray 是否允許具體定義哪個工作人員根據密鑰獲取數據?
另一個問題是關於為此使用 pySpark 的,但是由於 pySpark 有自己的 API,您如何使現有的 python 代碼與 PySpark 一起工作,代碼更改最少?

根據您的問題和您引用的帖子,您的帖子實際上涵蓋了三個問題:

  1. 根據特定的鍵將數據分配到不同的節點:正如你提到的,你有多個工作節點,它 forms 一個集群來執行並行計算。 如果你看一些分布式數據處理/查詢引擎,比如 Spark 和 Trino,你不能將特定的關鍵數據分配到專用的工作節點,但你可以將數據均勻分布分區,這樣每個工作節點都可以進行分區和執行並行計算以提高速度。 以Spark為例,它可以根據你輸入的partition key參數和分區個數,對數據進行重新分區。 但真正的問題是,您的數據分區策略如何幫助優化和利用您的集群資源和計算速度?
  2. Does Ray allow definition specifically which worker gets the data based on a key:老實說,我以前沒有用過Ray ,我現在無法回答這個問題,但我只是看了他們的白皮書,看起來就像他們的架構類似於現代分布式處理框架,它使用驅動程序/header/協調器來控制到不同節點的任務。 我懷疑它可以實現第二個問題,但同樣,我不確定這個問題。
  3. PySpark如何以最少的代碼更改實現聚合:不確定 python 代碼中您當前的管道如何。 假設您使用的是Pandas庫, PySpark實際上有 pandas-in-spark api ( https://spark.apache.org/docs/latest/api/python/getting_started/quickstart1786.868 )。 因此,它應該只更改最少的代碼。 即使你沒有使用Pandas而是純粹的 python 邏輯,感謝 Spark 中的貢獻者,它創建了非常方便的 Spark API。例如,如果你想在 Spark SQL API 中執行聚合: df.groupBy('country').agg(func.count('name').alias('name_count'), func.sum('amount').alias('amount_sum')) 編碼級別很簡單,但同樣,Spark 性能調優是利用和優化資源的關鍵部分。

Ray 正是一個框架,用於在集群中對現有代碼(僅@ray.remote注釋)進行最少的更改來分發 python 函數和類。 運行時架構有點像您所期望的,即一個驅動程序節點將任務分發給一組工作節點並協調計算。

您的問題涉及兩件事:執行聚合和根據特定鍵將任務分配給工作人員。 正如@Jonathan Lam 回答的那樣,通常您不直接控制任務到工人的分配。 用戶通常通過 API 處理框架的抽象。

假設是這種情況並且最終目標是聚合,您可以在 Ray 中輕松地進行聚合:

import ray

data = [
    {'name': 'A', 'amount': 100, 'country': 'C1'},
    {'name': 'B', 'amount': 200, 'country': 'C2'},
    {'name': 'C', 'amount': 10, 'country': 'C1'},
    {'name': 'D', 'amount': 500, 'country': 'C2'},
    {'name': 'E', 'amount': 400, 'country': 'C3'},
]

ds = ray.data.from_items(data)

ds = ds.groupby('country').sum('amount')

ds.show()

但是,如果您確實希望對任務到工作人員的分配進行低級控制,Ray(在 Ray Core 級別,而不是像 Ray Datasets 這樣的庫)允許您指定任務的調度策略。 在這種情況下,您可以在啟動遠程任務時使用 NodeAffinitySchedulingStrategy,詳情請參閱: https://docs.ray.io/en/master/ray-core/scheduling/index.html#nodeaffinityschedulingstrategy

暫無
暫無

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

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