【发布时间】:2017-06-20 00:39:52
【问题描述】:
我写了一个火花作业,它在下面的操作中进行
-
从 HDFS 文本文件中读取数据。
-
执行 distinct() 调用以过滤重复项。
-
做一个mapToPair阶段并生成pairRDD
-
做一个 reducebykey 调用
-
为分组元组做聚合逻辑。
-
现在在 #5 上调用 foreach
在这里
- 调用 cassandra db
- 创建 aws SNS 和 SQS 客户端连接
- 做一些 json 记录格式化。
- 将记录发布到 SNS/SQS
当我运行此作业时,它会创建三个火花阶段
第一阶段 - 大约需要 45 秒。执行不同的 第二阶段 - mapToPair 和 reducebykey = 需要 1.5 分钟
第三阶段 = 需要 19 分钟
我做了什么
- 我关闭了 cassandra 调用,所以请查看 DB 命中原因 - 这需要更少的时间
- 我发现的违规部分是为每个分区创建 SNS/SQS 连接
它占用了整个工作时间的 60% 以上
我正在 foreachPartition 中创建 SNS/SQS 连接以减少连接。我们有更好的方法吗
我无法在驱动程序上创建连接对象,因为它们不可序列化
我没有使用 executor 9,executore core 15,driver memory 2g,executor memory 5g
我正在使用 16 核 64 gig 内存 集群大小 1 主 9 从 全部相同的配置 EMR 部署火花 1.6
【问题讨论】:
-
您确定
create an aws SNS and SQS client connection占用了 60% 的工作时间还是publish the record to SNS/SQS这个?这两者之间存在细微差别。对于第一种情况,您需要最小化连接创建的数量,而对于第二种情况,您需要分发数据(并创建更多连接实例)。有趣!!!! -
如果是第二种情况,我会发布一个带有解决方案的答案。
标签: apache-spark connection spark-streaming amazon-sns