簡體   English   中英

如何創建可作為python集合而不是文件使用的大數據的rdd

[英]How to create rdd of large data available as python collection instead of file

我是新手,嘗試使用Pyspark從Web服務將數據提取到Orc Hive表中。 Webservice響應(Json)是一批記錄,其中包含下一批的url。我將每個響應轉換為一個集合,並使用以下命令進行並行化。

Rdd=sc.parallelize(response1)

接下來,我將使用聯合將所有后續響應合並到現有的Rdd中。

Rdd=Rdd.union(sc.parallelize(response2))
Rdd=Rdd.union(sc.parallelize(response3))
...
Rdd=Rdd.union(sc.parallelize(responseN))

但是上述方法在合並第15個或第16個響應時給了我Spark Spark java.lang.OutOfMemoryError。

之前我的理解是,每當我們對一個集合進行parallelize()時,spark便將其分布在各個節點上。 多個節點共同能夠保存如此大的數據集。 但是由於數據的局部性,它似乎將所有響應都保留在Drivers主內存中。 我的理解正確嗎?

2-無論如何,我是否可以獲得有關群集上分區確切位置的信息?

3-無論如何,我是否可以強制spark在節點之間重新分配分區?

4-稍后,我嘗試將Rdd的存儲級別設置為DISK_ONLY,以希望將數據保留在磁盤而不是RAM上。 但是我又遇到了完全相同的錯誤,因此我對選項的作用感到困惑。

5-什么是解決此問題的更好方法。 我想到了進行所有轉換的過程,而無需將整個數據集轉儲到磁盤上,在hdfs上移動並最終再次讀取以進行處理?

之前我的理解是,每當我們對一個集合進行parallelize()時,spark便將其分布在各個節點上。

這只是部分正確。 ParallelCollectionRDD保留對原始數據的引用,因此它至少需要驅動程序上的內存,因此無法伸縮。

而不是使用parallelize ,您應該使用一些高階函數來獲取數據:

urls = sc.parallelize([url1, url2, url3, ..., urlN])

urls.map(make_request)

暫無
暫無

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

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