我正面临一个与火花的持久化机制有关的奇怪问题。我试图使用以下spark (2.1.1)配置来持久化相当大的数据集(MEMORY_AND_DISK_SER):
-num-执行程序27 --执行程序-内存30 27-执行程序-核心5
节点数: 9,每个节点内存:100 15,每个节点核心:15
810个分区(27*5*6)
数据集的内存大小为1.4TB,这就解释了为什么我要使用MEMORY_AND_DISK_SER持久性。但是,在某个时候,当每个节点的15G (30*0.5)被完全用于内存持久性,而不是写入磁盘时,火花执行器就会失败,火花程序也会失败。有没有人面临过这样的问题?有人能提出另一种解决方案吗?我绝对需要持久化我的数据集,因为重新计算它们非常(非常!)太贵了。
同样地,我有一个关于持久性顺序的问题。让我们假设,我的代码如下:
Dataset<T> mydataset = loading a file;
mydataset.map(...).persist().count();
Dataset<T> mydataset2 = mydataset.map(...);
mydataset.unpersist();
mydataset2.persist().count();我知道坚持是一种懒惰的行为。如果我分解代码,我会假设我的数据集将被计算并持久化,那么,mydataset2将使用mydataset (它是持久化的)进行计算。Mydataset立即取消持久化,并被内存存储中的mydataset2所取代。对吧?我在SparkUI上注意到的是,在计算mydataset2之前,我的数据集是非持久化的。这是预期的行为还是我遗漏了什么?
谢谢。
发布于 2018-04-13 11:19:43
我的建议是(如果您有选择的话),只需将数据集写到HDFS中,然后将其读取回HDFS。保持简单!在过去,我发现了缓存/持久化的各种奇怪问题,并且通常得出结论,稍微长一点的运行时比我花时间进行持久工作更值得;如果一开始制作数据集的代价很高,那么这种情况就会特别严重。
https://stackoverflow.com/questions/49815391
复制相似问题