繁体   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