你好,
我麵臨一些性能問題的pyspark udf post數據的REST API函數(使用宇宙數據庫後端存儲的數據)。
請找到下麵的細節:
#火花dataframe (df)包含關於數據30-40k附近。
#我是使用python udf張貼在rest api函數:
例如final_df = df。withColumn(“地位”,save_data (A, B, C))
# udf功能:
@udf (returnType = IntegerType ())
def save_data (A, B, C):
post_data =列表()
post_data.append ({
A:,
B: B,
“C”: C,
})
retry_strategy =重試(
總= 5,
status_forcelist = [400、500、502、503、504),
method_whitelist =(“文章”),
backoff_factor = 0.1
)
適配器= HTTPAdapter (max_retries = retry_strategy)
s = requests.Session ()
年代。山(“https://”,適配器)
年代。山(“http://”,適配器)
年代。keep_alive = False
試一試:
響應= s.post (
url = rest_api_url,
頭={“授權”:“持票人”+ api_token,“內容類型”:“application / json "},
data = json.dumps (post_data)
)
返回response.status_code
除了:
響應= requests.post (
url = rest_api_url,
頭={“授權”:“持票人”+ api_token,“內容類型”:“application / json "},
data = json.dumps (post_data)
)
返回response.status_code
#問題:磚工作被絞死的無限次rest api調用(save_data()),從未成功。
#當檢查從API,它顯示了服務接觸最大資源利用率(100%)。
對我來說它就像python udf是一次發送大量數據淹沒了api服務在某種程度上的時間和它停止響應。
我們將是最好的辦法可以解決這個問題?
我們應該把dataframe分成多個塊和一個一個發送還是
把它轉換成熊貓df然後發送逐行(可能是慢)
請建議。
@Sanjoy森:
看起來UDF函數使得同步HTTP請求dataframe中的每一行的REST API,這可能會導致性能問題在處理大量的數據。
為了提高性能,您可以考慮以下方法:
一般來說,從一個UDF可以發送數據逐行效率低下,導致性能問題,尤其是在處理大型數據集。最好使用批處理和異步HTTP請求來提高性能。
@Sanjoy森:
看起來UDF函數使得同步HTTP請求dataframe中的每一行的REST API,這可能會導致性能問題在處理大量的數據。
為了提高性能,您可以考慮以下方法:
一般來說,從一個UDF可以發送數據逐行效率低下,導致性能問題,尤其是在處理大型數據集。最好使用批處理和異步HTTP請求來提高性能。