Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建可作为python集合而不是文件使用的大型数据的rdd_Python_Apache Spark_Hadoop_Pyspark - Fatal编程技术网

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

如何创建可作为python集合而不是文件使用的大型数据的rdd,python,apache-spark,hadoop,pyspark,Python,Apache Spark,Hadoop,Pyspark,我是spark的新手,尝试使用Pyspark将数据从Web服务摄取到orc hive表。webservice响应(Json)是一批记录,其中包含下一批的url Rdd=sc.parallelize(response1) 接下来,我将所有后续响应合并到 使用union的现有Rdd Rdd=Rdd.union(sc.parallelize(response2)) Rdd=Rdd.union(sc.parallelize(response3)) ... Rdd=Rdd.union(sc.parall

我是spark的新手,尝试使用Pyspark将数据从Web服务摄取到orc hive表。webservice响应(Json)是一批记录,其中包含下一批的url

Rdd=sc.parallelize(response1)
接下来,我将所有后续响应合并到 使用union的现有Rdd

Rdd=Rdd.union(sc.parallelize(response2))
Rdd=Rdd.union(sc.parallelize(response3))
...
Rdd=Rdd.union(sc.parallelize(responseN))
然而,上述方法在合并第15或第16个响应时给了我Spark java.lang.OutOfMemoryError

我之前的理解是,每当我们并行化一个集合时,spark都会在节点之间分发它。多个节点共同能够容纳如此大的数据集。但由于数据的局部性,它似乎将所有响应保留在驱动程序主内存中。我的理解正确吗

2-我是否可以获得分区在集群上的确切位置的信息

3-我是否可以强制spark跨节点重新分配分区

4-后来,我试图将Rdd的存储级别设置为DISK_,只是希望数据能够保存在磁盘上,而不是RAM上。但我又犯了完全相同的错误,所以我更加困惑于这个选项的作用是什么

5-解决这个问题的更好方法是什么。我想在不需要将整个数据集转储到磁盘上的情况下,动态地进行所有转换,移动hdfs并最终再次读取以进行处理

我之前的理解是,每当我们并行化一个集合时,spark都会在节点之间分发它

这只是部分正确
ParallelCollectionRDD
保留对原始数据的引用,因此它在驱动程序上至少需要同样多的内存,因此不可扩展

您不应该使用
并行化
,而应该使用一些高阶函数来获取数据:

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

urls.map(make_request)

你可以试着增加遗嘱执行人memory@cricket_007我们将尝试确认。但spark不应该自动管理这个,比如在ram空间不足时将几个分区移动到磁盘或其他节点。我的意思是,我们可能无法控制返回的数据量,因此即使它对某些执行器内存卷组合有效,如果数据量超过某个限制,它也可能再次失败。不幸的是,否。
spark.executor.memory
默认为
1g
,所有重试都将使用相同数量的最大值。另外,Python和JVMOne之间存在一些开销,我使用的数据源的限制是,只有在我点击第n-1个url提取数据后,才能获取第n个url。所以我之前不会有所有的url,它们只能一个接一个地连续获取。对这个rdd执行的任何操作不会再次在驱动程序上运行,因为原始url列表是驱动程序的本地列表吗?或者在执行操作之前会分发它吗?