当我使用缓存存储数据时,我认为火花运行速度很慢。但是,当我不使用缓存存储数据时,速度非常好。我的主要简介如下:
SPARK_JAVA_OPTS+="-Dspark.local.dir=/home/wangchao/hadoop-yarn-spark/tmp_out_info
-Dspark.rdd.compress=true -Dspark.storage.memoryFraction=0.4
-Dspark.shuffle.spill=false -Dspark.executor.memory=1800m -Dspark.akka.frameSize=100
-Dspark.default.parallelism=6"
我的测试代码是:
val file = sc.textFile("hdfs://10.168.9.240:9000/user/bailin/filename")
val count = file.flatMap(line => line.split(" ")).map(word => (word, 1)).cache()..reduceByKey(_+_)
count.collect()
非常感谢任何有关如何解决此问题的答案或建议。
答案 0 :(得分:3)
cache
在您使用它的上下文中无用。在这种情况下,cache
表示将地图.map(word => (word, 1))
的结果保存在内存中。如果您没有调用它,则reducer可以链接到地图的末尾,并且在使用它们之后将丢弃地图结果。 cache
更好地用于在RDD创建后在RDD上调用多个转换/动作的情况。例如,如果您要创建要加入2个不同数据集的数据集,则缓存它是有帮助的,因为如果您不在第二个连接上,则将重新计算整个RDD。这是来自spark网站的一个易于理解的例子。
val file = spark.textFile("hdfs://...")
val errors = file.filter(line => line.contains("ERROR")).cache() //errors is cached to prevent recalculation when the two filters are called
// Count all the errors
errors.count()
// Count errors mentioning MySQL
errors.filter(line => line.contains("MySQL")).count()
// Fetch the MySQL errors as an array of strings
errors.filter(line => line.contains("MySQL")).collect()
内部正在执行的缓存是通过将RDD的祖先保存在内存中/保存到磁盘(取决于存储级别)来删除RDD的祖先,RDD必须保存其祖先的原因是可以根据需要重新计算,这是RDD的恢复方法。