Design Patterns for using foreachRDD

dstream.foreachRDD是一个强大的原语,允许将数据发送到外部系统。然而,了解如何正确有效地使用该原语很重要。避免一些常见的错误如下。

通常向外部系统写入数据需要创建一个连接对象(例如与远程服务器的TCP连接),并使用它将数据发送到远程系统。为此,开发人员可能无意中尝试在Spark驱动程序创建连接对象,然后尝试在Spark workers中使用它来将记录保存在RDD中。例如(在Scala中):

dstream.foreachRDD { rdd =>val connection = createNewConnection()  // executed at the driverrdd.foreach { record =>connection.send(record) // executed at the worker
  }
}

这是不正确的,因为这需要将连接对象序列化并从驱动程序发送给worker。这样的连接对象很少能跨机器传输。此错误可能会显示为序列化错误(连接对象不可序列化),初始化错误(连接对象需要在工作人员初始化)等。正确的解决方案是在worker创建连接对象。

但是,这可能会导致另一个常见的错误 - 为每个记录创建一个新的连接。例如,

dstream.foreachRDD { rdd =>rdd.foreach { record =>val connection = createNewConnection()connection.send(record)connection.close()}
}

通常,创建连接对象具有时间和资源开销。因此,创建和销毁每个记录的连接对象可能会引起不必要的高开销,并可显着降低系统的总体吞吐量。一个更好的解决方案是使用rdd.foreachPartition - 创建一个连接对象,并使用该连接在RDD分区中发送所有记录。

dstream.foreachRDD { rdd =>rdd.foreachPartition { partitionOfRecords =>val connection = createNewConnection()partitionOfRecords.foreach(record => connection.send(record))connection.close()}
}

这样可以在多个记录上摊销连接创建开销。

最后,可以通过在多个RDD /batches 之间重复使用连接对象来进一步优化。可以维护连接对象的静态池,而不是多个批次的RDD被推送到外部系统时可以重用,从而进一步减少开销。

dstream.foreachRDD { rdd =>rdd.foreachPartition { partitionOfRecords =>// ConnectionPool is a static, lazily initialized pool of connectionsval connection = ConnectionPool.getConnection()partitionOfRecords.foreach(record => connection.send(record))ConnectionPool.returnConnection(connection)  // return to the pool for future reuse
  }
}

请注意,池中的连接应根据需要懒惰创建,如果不使用一段时间,则会超时。这实现了最有效地将数据发送到外部系统。

其他要记住的要点

1.DStreams通过输出操作进行延迟执行,就像RDD由RDD actions懒惰执行一样。具体来说,DStream输出操作中的RDD动作强制处理接收到的数据。因此,如果您的应用程序没有任何输出操作,或者在dstream.foreachRDD()中没有任何RDD action操作,那么任何操作都将不会被执行。系统将简单地接收数据并将其丢弃。

2.默认情况下,输出操作是一次一个执行的。它们按照它们在应用程序中定义的顺序执行。

转载于:https://www.cnblogs.com/Dhouse/p/7646189.html

Spark官方3 ---------Spark Streaming编程指南(1.5.0)相关推荐

  1. Spark Streaming 编程指南[中英对照]

    2019独角兽企业重金招聘Python工程师标准>>> 基于Spark 2.0 Preview的材料翻译,原[英]文地址: http://spark.apache.org/docs/ ...

  2. Spark编程指南V1.4.0(翻译)

    Spark编程指南V1.4.0 ·        简介 ·        接入Spark ·        Spark初始化 ·        使用Shell ·        在集群上部署代码 ·  ...

  3. 高质量C++/C编程指南 ver 1.0

    高质量C++/C编程指南 ver 1.0 转载于:https://www.cnblogs.com/gavinhughhu/archive/2009/12/25/1631800.html

  4. 编程实现将rdd转换为dataframe:源文件内容如下(_第四篇|Spark Streaming编程指南(1)

    Spark Streaming是构建在Spark Core基础之上的流处理框架,是Spark非常重要的组成部分.Spark Streaming于2013年2月在Spark0.7.0版本中引入,发展至今 ...

  5. spark RDD官网RDD编程指南

    http://spark.apache.org/docs/latest/rdd-programming-guide.html#using-the-shell Overview(概述) 在较高的层次上, ...

  6. hive编程指南电子版_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  7. spark-sql建表语句限制_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  8. hive编程指南_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  9. 农行app怎么开消息服务器,农行网上支付平台-交易市场接口编程指南.doc

    农行网上支付平台-交易市场接口编程指南 中国农业银行网上支付平台 交易市场 PHP商户接口编程指南 Java Edition V1.0 修订历史纪录 日期版本说明作者2009/11/18V1.0初稿童 ...

  10. SPARK STREAMING之1:编程指南(翻译v1.4.1)

    SPARK STREAMING之1:编程指南(翻译v1.4.1) @(SPARK)[spark, 大数据] SPARK STREAMING之1编程指南翻译v141 概述 快速入门例子 基本概念 Lin ...

最新文章

  1. Linux下文件如果没有权限不能被Apache访问
  2. 测试使用2mH的工字型电感在接收150kHz导航信号中性能
  3. matlab编程选择语句,matlab编程控制语句
  4. C++ String类写时拷贝 4
  5. Python(20)-高级数据类型的公共方法
  6. perl python json_Perl解析JSON数据精解
  7. webdrive不更新_关于selenium 用Webdrive打开Firefox不含有插件的问题(python)
  8. 小Q正在给一条长度为n的道路设计路灯安置方案。 为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用'.'表示, 不需要照亮的障碍物格子用'X'表示。
  9. 必备的查询网址:查征信、婚姻、交友借钱明明白白
  10. html飞机大战论文,7.HTML5--飞机大战
  11. 基于格的密码与SABER
  12. Ubuntu环境下用docker从0到1部署Elasticsearch 7集群
  13. iOS 5G网络判断
  14. Adobe Premiere Pro CS6打开报错(Oxc000007b)解决办法
  15. android水平wheelview,android:自定义横向滚动的WheelView
  16. android电视原理图,电视机的基本工作原理及结构组成
  17. The Design of design
  18. 如何创建自己的云盘-私有云盘
  19. 技术汇之物联网设备网关技术架构设计
  20. jquery 视觉特效(新闻滚动浏览)

热门文章

  1. Linux 之 CentOS 7.2 安装 Java JDK
  2. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_09-webpack研究-webpack介绍
  3. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_05-CMS需求分析-什么是CMS...
  4. 【共读Primer】8.[2.1] 基本内置类型(2) Page32
  5. 音视频重新封装的流程
  6. centos6.5和centos7如何搭建php环境(包括php7)
  7. python学习-3.一些常用模块用法
  8. jQuery实用小技巧--输入框文字获取和失去焦点
  9. 防止恶意登录的设计思路
  10. weka连接mysql数据库