如何并行化RDD?

时间:2014-04-25 22:33:32

标签: scala apache-spark

要将文件读入内存我使用:

val lines = sc.textFile("myLogFile*")

类型:

org.apache.spark.rdd.RDD[String] = MappedRDD[1] at textFile at <console>:12

阅读Scala文档:http://spark.apache.org/docs/0.9.1/scala-programming-guide.html#parallelized-collections “通过在现有的Scala集合(Seq对象)上调用SparkContext的parallelize方法来创建并行化集合。”

这似乎不适用于RDD?可以在RDD上进行并行处理吗?我是否需要将RDD转换为Seq对象?

2 个答案:

答案 0 :(得分:11)

弹性分布式数据集(RDD)RDD顾名思义是分布式,容错和并行的。

“RDD是容错的,并行数据结构,允许用户明确地将中间结果保存在内存中,控制其分区以优化数据放置,并且 使用丰富的运算符来控制它们。“ 请参阅此paper

不,您不需要将RDD转换为Seq对象。 RDD上的所有处理都是并行完成的(取决于Spark安装的并行程度)。

答案 1 :(得分:-1)

扩展先前的答案。 可以使用分区以并行方式循环通过rdd。

rdd.foreachPartition { partition =>
  -----some code----
    partition.foreach { item =>  // where item is object of your intended type, our case is Row
    }
}

RDD就像一个(高效且有火花的本机)数据结构,用于保存T型数据。 我们做了一些与RDD相关的工作,其中Row是org.apache.hadoop.hbase.client.Row。

方法:-
1.首先创建一个DataFrame
2.以某种方式转换为RDD。在本例中,仅选择DF的行键。
3.设置分区数并创建一个将与所需分区并行化的RDD。
否则,将使用SparkContext的默认分区(在spark-shell模式下为1)
4.使用rdd.forEachPArtition和partition.forEach

的for循环结构

示例代码:-(在scala中,对于Java,可以使用相同的方法)

    // Assume your DF (intended dataframe is created in some way)
    // in our case df for hbase table was created using catalog approach of spark-hbase-connector of com.hortonworks package  
    // docs.microsoft.com/en-us/azure/hdinsight/hdinsight-using-spark-query-hbase   
    var rdd: RDD[org.apache.hadoop.hbase.client.Row] = df.select("rowkey").rdd()
    var numberOfPartitions = 80
    if (rdd.count > 1000000 && numberOfPartitions < 100)
      numberOfPartitions = 300

    // Optional; to take advantage of partitions during processing   
    var partitionReadyRDD = rdd.distinct(numberOfPartitions)  

    partitionReadyRDD.foreachPartition { partition =>
      partition.foreach { item => //item; each row key
          //.........some code..........   
      }
    }