我正在使用collectAsList方法从spark数据帧创建列表。 spark java作业在多节点群集上运行,在该群集上,配置被设置为生成多个执行程序。我知道这不是编写Spark代码的好方法。我不确定有什么不利和影响。请分享大致相同
List<Row> list = df.collectAsList();
for(Row r: list) {
<Does some processing here on the row>
}
[请提出一些替代方法。
谢谢
Spark的优势在于,您可以使用内存和处理器跨多个节点上的多个执行程序来处理大量数据。您遇到的问题可能是由于使用collectAsList
然后处理数据所致。 collectAsList
将所有数据带入“驱动程序”,该驱动程序是单个节点上的单个JVM。处理数据后,应该将其用作最后一步来收集结果。如果您尝试将大量数据带入驱动程序然后进行处理,则可能会非常缓慢或失败,并且此时您实际上并没有使用Spark来处理数据。代替使用collectAsList
,使用DataFrame
上可用的方法来处理数据,例如map()
驱动程序和执行程序https://spark.apache.org/docs/latest/cluster-overview.html的定义
在Java API中,DataFrame是一个DataSet。这是DataSet文档。使用此处的方法来处理您的数据https://spark.apache.org/docs/latest/api/java/index.html?org/apache/spark/sql/Dataset.html
我遇到了同样的问题。我使用toLocalIterator()方法保存较少的数据,该方法将返回Iterator对象。 collectAsList()此方法将以列表形式返回总数据,但是Iterator会在读取时直接从驱动程序中获取数据。代码如:
Iterator<Row> itr = df.toLocalIterator();
while(itr.hasNext()){
Row row = itr.next();
//do somthing
}
@@ Tony在现场。这里还有几点-大数据需要可伸缩,以便使用更大的处理能力可以同时处理更多数据。这可以通过使用多个执行程序的并行处理来实现。
火花也是弹性,如果一些执行者死亡,那么它可以轻松恢复。
使用collect()使您的处理过程严重依赖于1个进程/节点(即驱动程序)。它不会扩展,更容易失败。