如何优化下面的spark代码(scala)?
我有一些大文件(19GB、40GB等)。我需要对这些文件执行以下算法:如何优化下面的spark代码(scala)?,scala,apache-spark,optimization,apache-spark-sql,bigdata,Scala,Apache Spark,Optimization,Apache Spark Sql,Bigdata,我有一些大文件(19GB、40GB等)。我需要对这些文件执行以下算法: 读文件 按1列进行排序 取前70%的数据: a) 获取列子集的所有不同的记录 b) 将其写入列车文件 取最后30%的数据: a) 获取列子集的所有不同的记录 b) 将其写入测试文件 我尝试在spark中运行以下代码(使用Scala) 以下是我启动spark shell的方式: ./bin/spark-shell --packages com.databricks:spark-csv_2.11:1.4.0 --total-ex
b) 将其写入列车文件
./bin/spark-shell --packages com.databricks:spark-csv_2.11:1.4.0 --total-executor-cores 70 --executor-memory 10G --driver-memory 20G
我在一个分布式集群上执行这段代码,每个集群有一个主集群和多个从集群,每个集群都有足够的RAM。到目前为止,这段代码最终占用了大量内存,我还遇到了java堆空间问题
有没有办法优化上述代码(最好是在spark中)?我非常感谢在优化上述代码方面提供的任何最小帮助。coalesce(1,false)
意味着将所有数据合并到一个分区中,即在一个节点的内存中保留40GB的数据
切勿尝试通过coalesce(1,false)
获取一个文件中的所有数据。
相反,您应该只调用saveAsTextFile(因此输出看起来像part-00001、part00002等),然后在外部合并这些分区文件。
合并操作取决于您的文件系统。对于HDFS,您可以使用coalesce(1,false)将所有数据合并到一个分区中,即在一个节点的内存中保留40GB数据
切勿尝试通过coalesce(1,false)
获取一个文件中的所有数据。
相反,您应该只调用saveAsTextFile(因此输出看起来像part-00001、part00002等),然后在外部合并这些分区文件。
合并操作取决于您的文件系统。对于HDFS,您可以使用问题是您根本不分发。资料来源如下:
val csvOuterJoin = offers.orderBy("utcDate")
val trainDF = csvOuterJoin.limit((csvOuterJoin.count*.7).toInt)
limit
操作不是为大规模操作而设计的,它将所有记录移动到单个分区:
val df=spark.范围(0,10000,1,1000)
df.rdd.partitions.size
Int=1000
//按限制获取所有记录
df.orderBy($“id”).limit(10000).rdd.partitions.size
Int=1
您可以使用RDD
API:
val ordered = df.orderBy($"utcDate")
val cnt = df.count * 0.7
val train = spark.createDataFrame(ordered.rdd.zipWithIndex.filter {
case (_, i) => i <= cnt
}.map(_._1), ordered.schema)
val test = spark.createDataFrame(ordered.rdd.zipWithIndex.filter {
case (_, i) => i > cnt
}.map(_._1), ordered.schema)
val ordered=df.orderBy($“utcDate”)
val cnt=df.count*0.7
val train=spark.createDataFrame(ordered.rdd.zipWithIndex.filter{
案例(u,i)=>i>cnt
}.map(u._1),ordered.schema)
问题是你根本不分发。资料来源如下:
val csvOuterJoin = offers.orderBy("utcDate")
val trainDF = csvOuterJoin.limit((csvOuterJoin.count*.7).toInt)
limit
操作不是为大规模操作而设计的,它将所有记录移动到单个分区:
val df=spark.范围(0,10000,1,1000)
df.rdd.partitions.size
Int=1000
//按限制获取所有记录
df.orderBy($“id”).limit(10000).rdd.partitions.size
Int=1
您可以使用RDD
API:
val ordered = df.orderBy($"utcDate")
val cnt = df.count * 0.7
val train = spark.createDataFrame(ordered.rdd.zipWithIndex.filter {
case (_, i) => i <= cnt
}.map(_._1), ordered.schema)
val test = spark.createDataFrame(ordered.rdd.zipWithIndex.filter {
case (_, i) => i > cnt
}.map(_._1), ordered.schema)
val ordered=df.orderBy($“utcDate”)
val cnt=df.count*0.7
val train=spark.createDataFrame(ordered.rdd.zipWithIndex.filter{
案例(u,i)=>i>cnt
}.map(u._1),ordered.schema)
这并不能明确地解决您的问题,因此我将把它作为一个注释。有一个dataframe.randomspilt()
函数,允许您将数据帧(尽管是随机的)拆分为指定的小数部分。记住这一点,以备将来之用!我寻找的是时间分割,而不是随机分割。但很高兴知道dataframe.randomspilt()的存在。这并不能明确地解决您的问题,所以我将把它作为一个注释。有一个dataframe.randomspilt()
函数,允许您将数据帧(尽管是随机的)拆分为指定的小数部分。记住这一点,以备将来之用!我寻找的是时间分割,而不是随机分割。但是很高兴知道dataframe.randomSplit()存在。在spark 1.6.1 shell中,我得到了以下错误::60:错误:找不到:value sparksparkContext.createDataFrame()
有效,最后您的解决方案对我有效。谢谢。在spark 1.6.1 shell中,我得到以下错误::60:错误:找不到:value sparksparkContext.createDataFrame()
有效,最后您的解决方案对我有效。谢谢。我还没说到代码的这一点。收集阶段出现Java堆空间错误。谢谢你提供的信息。我还没有达到代码的这一点。收集阶段出现Java堆空间错误。谢谢你提供的信息。