Spark foreachpartition连接改进

时间:2017-02-02 19:28:31

标签: apache-spark connection spark-streaming amazon-sns

我写了一个火花作业,它在操作之下

  1. 从HDFS文本文件中读取数据。
  2. 执行distinct()调用以过滤重复项。
  3. 执行mapToPair阶段并生成pairRDD
  4. 执行reducebykey通话
  5. 为分组元组执行聚合逻辑。
  6. 现在打电话给#5

    的foreach

    这里确实

    1. 拨打cassandra db
    2. 创建aws SNS和SQS客户端连接
    3. 做一些json记录格式化。
    4. 将记录发布到SNS / SQS
  7. 当我运行这个工作时,它会创建三个火花阶段

    第一阶段 - 需要将近45秒。执行一个独特的 第二阶段 - mapToPair和reducebykey =需要1.5分钟

    第三阶段=需要19分钟

    我做了什么

    1. 我关闭了cassandra电话,所以看到DB命中原因 - 这花费的时间更少
    2. 我发现的违规部分是创建SNS / SQS连接foreach分区
    3. 占整个工作时间的60%以上

      我在foreachPartition中创建SNS / SQS连接以改善连接。我们有更好的方式

      我无法在驱动程序上创建连接对象,因为它们不可序列化

      我没有使用执行程序9的数量,执行核心15,驱动程序内存2g,执行程序内存5g

      我正在使用16核64 gig内存 簇大小1主9从属所有相同的配置 EMR部署火花1.6

1 个答案:

答案 0 :(得分:1)

听起来你想要为每个节点设置一个SNS / SQS连接,然后用它来处理每个节点上的所有数据。

我认为foreachPartition在这里是正确的想法,但您可能希望事先合并您的RDD。这将折叠同一节点上的分区而不进行混洗,并允许您避免启动额外的SNS / SQS连接。

见这里: https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.RDD@coalesce(numPartitions:Int,shuffle:Boolean,partitionCoalescer:Option[org.apache.spark.rdd.PartitionCoalescer])(implicitord:Ordering[T]):org.apache.spark.rdd.RDD[T]