Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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
如何优化下面的spark代码(scala)?_Scala_Apache Spark_Optimization_Apache Spark Sql_Bigdata - Fatal编程技术网

如何优化下面的spark代码(scala)?

如何优化下面的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

我有一些大文件(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-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 spark
    sparkContext.createDataFrame()
    有效,最后您的解决方案对我有效。谢谢。在spark 1.6.1 shell中,我得到以下错误::60:错误:找不到:value spark
    sparkContext.createDataFrame()
    有效,最后您的解决方案对我有效。谢谢。我还没说到代码的这一点。收集阶段出现Java堆空间错误。谢谢你提供的信息。我还没有达到代码的这一点。收集阶段出现Java堆空间错误。谢谢你提供的信息。