[英]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.