gpt4 book ai didi

python - 如何创建可作为python集合而不是文件使用的大数据的rdd

转载 作者:行者123 更新时间:2023-12-02 20:34:48 26 4
gpt4 key购买 nike

我是新手,尝试使用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上移动并最终再次读取以进行处理?

最佳答案

Earlier my understanding was whenever we parallelize() a collection, spark distributes it across nodes.



这只是部分正确。 ParallelCollectionRDD保留对原始数据的引用,因此它至少需要驱动程序上的内存,因此无法伸缩。

而不是使用 parallelize,您应该使用一些高阶函数来获取数据:
urls = sc.parallelize([url1, url2, url3, ..., urlN])

urls.map(make_request)

关于python - 如何创建可作为python集合而不是文件使用的大数据的rdd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51640623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com