zoukankan      html  css  js  c++  java
  • 51、Spark Streaming之输入DStream和Receiver详解

    输入DStream代表了来自数据源的输入数据流。在之前的wordcount例子中,lines就是一个输入DStream(JavaReceiverInputDStream),
    代表了从netcat(nc)服务接收到的数据流。除了文件数据流之外,所有的输入DStream都会绑定一个Receiver对象,该对象是一个关键的组件,
    用来从数据源接收数据,并将其存储在Spark的内存中,以供后续处理。
    
    Spark Streaming提供了两种内置的数据源支持:
    1、基础数据源:StreamingContext API中直接提供了对这些数据源的支持,比如文件、socket、Akka Actor等。
    2、高级数据源:诸如Kafka、Flume、Kinesis、Twitter等数据源,通过第三方工具类提供支持。这些数据源的使用,需要引用其依赖。
    3、自定义数据源:我们可以自己定义数据源,来决定如何接受和存储数据。
    
    
    
    要注意的是,如果你想要在实时计算应用中并行接收多条数据流,可以创建多个输入DStream。这样就会创建多个Receiver,从而并行地接收多个数据流。
    但是要注意的是,一个Spark Streaming Application的Executor,是一个长时间运行的任务,因此,它会独占分配给Spark Streaming Application的cpu core。
    所以只要Spark Streaming运行起来以后,这个节点上的cpu core,就没法给其他应用使用了。
    
    使用本地模式,运行程序时,绝对不能用local或者local[1],因为那样的话,只会给执行输入DStream的executor分配一个线程。而Spark Streaming底层的
    原理是,至少要有两条线程,一条线程用来分配给Receiver接收数据,一条线程用来处理接收到的数据。因此必须使用local[n],n>=2的模式。
    
    如果不设置Master,也就是直接将Spark Streaming应用提交到集群上运行,那么首先,必须要求集群节点上,有>1个cpu core,其次,给Spark Streaming的
    每个executor分配的core,必须>1,这样,才能保证分配到executor上运行的输入DStream,两条线程并行,一条运行Receiver,接收数据;一条处理数据。
    否则的话,只会接收数据,不会处理数据。
    
    企业工作中,机器肯定是不只一个cpu core,这个问题应该不大。


    image


    所以说,集群的节点上,总共拥有的cpu core,首先,必须是大于Spark Streaming Application的Receiver数量,因为一个Receiver独占一个CPU core;
    
    其次,在spark-submit脚本中,给Application分配的总的cpu core,肯定小于等于集群的cpu core的数量,大于Receiver的数量;
  • 相关阅读:
    U盘安装CentOS 7系统
    生产库中遇到mysql的子查询
    mysql 储存类型自增主键区别
    MySQL主从数据库同步延迟问题解决
    MySQL 加锁处理分析
    120篇精华文章打包送,干货慎入!
    mysql批量删除相同前缀的表和修改表名
    用pt-online-schema-change给大表在线加字段的时候导致从库数据丢失的问题
    【MySQL】online ddl 工具之pt-online-schema-change
    互联网公司为啥不使用mysql分区表?
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/11327747.html
Copyright © 2011-2022 走看看