<<Spark Streaming Programming Guide>> - Part 2 基本概念


包的依赖

比较简单,有时间再翻译,先作为placeholder


初始化StreamingContext

StreamingContext通过SparkContext来创建。

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

sc = SparkContext(master, appName)
ssc = StreamingContext(sc, 1)

其中appName指定了Spark程序的名字,在运行多个程序的Spark集群中会用来标识区分不同的程序;master参数指定Spark cluster的Master地址,根据使用不同的集群管理器 (standalone, YARN, Mesos) 会有不同的地址格式,另外还有一个特殊格式local[N]来指定本地模式(非集群模式),N用来指定线程个数,也是最多允许task的并发数目,另外可以使用特殊格式local[*]让Spark自动选择,它会探测的CPU的内核数(core)来用作N的值. 在实际的集群部署中,master参数都不会写死在代码里或者配置文件里,最方便的方式就是在通过spark-submit在提交程序到集群的时候通过--master参数运行时指定。

批处理的间隔在如上的例子里设置为1,单位为秒。具体值的设置取决于业务自身的需求,可用的集群资源,以及程序实际的处理能力。

context建立之后,需要做以下事情:
  • 通过创建输入离散数据流(DStream)来定义输入流;
  • 通过应用DStream的各种转换操作和最终的输出操作来定义流的计算方式;
  • 启动数据流的接收和处理: streamingContext.start().
  • 等待程序运行被终止: streamingContext.awaitTermination().
  • 程序可以通过手动方式来结束终止: streamingContext.stop().

需要记住的要点:

  1. 一旦StreamingContext被启动,流处理的计算方式不能被修改;
  2. 一旦StreamingContext被停止,则不能继续启动,只能重新启动;
  3. 在同一时刻,一个JVM里只能有一个被启动的StreamingContext
  4. 终止 StreamingContext 同时也终止了关联的 SparkContext。如果只想终止StreamingContext 而不终止SparkContext,则在调用stop方法时指定可选参数stopSparkContext为false (默认为true,停止SparkContext)。StreamingContext.stop(stopSparkContext=True, stopGraceFully=False)
  5. SparkContext可以被StreamingContexts重用,只要不违反上面提到的约束3 - 在同一时刻一个JVM内只能有一个被启动的StreamingContext - 则当前一个StreamingContext停止后,就可以启动下一个StreamingContext。


离散数据流 (DStream)

离散数据流是Spark Streaming提出的一个抽象概念,用来代表持续的数据流,数据流或者从数据源获得如kafka,或者通过其他的DStream转换而来。在内部,DStream实际是一组连续的RDD(RDD的解释具体参照Spark核心包),每一个RDD包含的是数据流在一定时间间隔的数据,如下图所示 -
Spark Streaming

所有对DStream的操作实际是对内在的RDD的操作。例如在综述中的wordCount例子中将句子转换为单词的flatMap操作,会作用到每一个时间间隔对应的RDD上,如下如所示。

Spark Streaming
还是Spark的核心引擎对RDD进行转换操作,DStream操作只是在上面封装了一下,从而掩盖了大多数RDD操作的细节,对外暴漏出的是更高层易用的接口。具体的操作会在后面详述。



输入数据流和接收器

每一种输入数据流(除了文件流以外),都包含一个接收器(Receiver),接收器负责从数据源接收收据然后存储在Spark中。
两类数据源:
  • 基本数据源:直接存在在Spark Streaming的类库中,包括文件流和Socket流;
  • 高级数据源:例如Kafka,Flume和Kinesis需要依赖外部的工具类。所以需要加入额外的依赖引入到工程中,例如pom中的dependency。

基本数据源

基本数据源除了从TCP Socket监听的文本数据流外,还可以把文件作为输入源。
文件数据流

可以从任何兼容HDFS API的文件系统目录中读取数据(也就是HDFS, S3, NFS), 可以通过以下方式创建DStream -

 streamingContext.textFileStream(dataDirectory)

Spark Streaming会监控目录dataDirectory,然后处理任何在此目录下创建的文件 (不支持递归的处理子目录),注意
- 文件必须具有相同格式
- 文件必须一次改名或者移动到此目录下。
- 一旦文件移动到此目录后,后续对文件内容的修改不能被监听到。 对于简单的文本文件,不需要创建receive接收器,所以不需要分配额外的内核。


基于定制化的接收器(Receiver)

可以自己实现接收器来创建DStream。


RDD队列作为Stream: 

为了方便测试,可以基于RDD队列来创建DStream,使用streamingContext.queueStream(queueOfRDDs)。每一个加入队列的RDD被作为DSream中的一次批处理需要处理的数据。


高级数据源

Spark 2.0的Python API中可以使用了Kafka,Keneis 和 Flume的数据源。
这列数据源需要第三方的类库支持,例如kafak和Flume有着比较复杂的依赖。因此,为了减少依赖之间的版本冲突,因此把从这类数据源创建DStream的功能被移到了单独的类库中,只有当需要的时候才把它引入到工程的依赖中。



定制数据源

Python API不支持。


接收器的可靠性

根据可靠性可以分为两类数据源,一类如Kafka和Flume支持消息确认的数据源,因此当接收器接受到消息后可以向数据源进行数据的确认,这样可以保证没有数据的丢失。两类数据源 -
可靠的接收器 - 可靠的接收器能够在接收并且存储数据到Spark后,向数据源发送确认消息。要求的前提是这类数据源支持此确认机制;
不可靠的接收器 -  不可靠的接收器不会向数据源进行消息确认,一个可能是数据源本身不支持确认机制,例如Socket数据要换;一个是接收器不想这样做这么复杂,例如对数据的丢失可以容忍;




<think>嗯,用户给了三个Maven依赖的代码块,分别是Flink的核心依赖、Kafka连接器和HBase客户端。他们希望我详细解释这些配置,并提供具体的版本号。首先,我需要确认用户的使用场景。他们可能是在搭建一个基于Flink的流处理应用,需要从Kafka读取数据,并将处理结果写入HBase。这种情况常见于实时数据处理系统,比如实时监控、日志分析或者实时推荐系统。 接下来,用户提到配置需要写得更详细,给出具体的版本号。原来的配置中用了${flink.version}和${hbase.version}这样的占位符,用户可能是在他们的pom.xml中定义了属性,但希望知道推荐的版本组合,或者可能遇到了版本兼容性问题,需要确保各个依赖之间的兼容性。 首先看Flink的依赖。Flink的核心依赖是flink-streaming-java,这里作用域是provided,意味着在打包时不会包含进去,因为通常集群环境中已经提供了。Kafka连接器是flink-connector-kafka,同样需要和Flink版本一致。HBase客户端的版本需要根据使用的HBase版本来定,比如2.4.x对应HBase 2.2.x,可能用户需要知道如何排除冲突的依赖,比如log4j,避免版本冲突。 现在需要确定常见的版本组合。比如Flink 1.17.x是最近的稳定版本,对应的Kafka连接器版本应该一致。HBase方面,HBase 2.2.x或2.4.x可能比较常用,对应的hbase-client版本需要对应。同时,需要注意HBase依赖可能引入的冲突,比如日志库,用户已经排除了log4j,可能需要进一步建议其他可能的排除项,比如slf4j或者netty等。 另外,用户可能需要了解各个依赖的作用。比如flink-streaming-java是流处理的核心API,flink-connector-kafka用于连接Kafka数据源,而hbase-client则是与HBase交互的客户端库。需要解释这些依赖在项目中的角色,以及为什么需要它们。 可能用户的问题背后是版本兼容性问题,比如Flink与Kafka连接器的兼容性,或者HBase客户端与Hadoop版本的兼容性。这时候需要建议他们查阅官方文档,确认兼容的版本组合。例如,Flink 1.17.1对应的Kafka连接器版本是flink-connector-kafka-1.17.1,而HBase客户端2.2.7可能适用于HBase 2.2.x集群。 另外,用户可能遗漏了其他必要的依赖,比如HBase需要Zookeeper、Hadoop等依赖,或者Flink可能需要其他模块如flink-clients或flink-json。不过用户提供的配置中只有这三个,可能需要提醒他们根据实际需求添加其他依赖。 总结来说,用户需要详细的版本配置建议,以及可能的兼容性注意事项。应该分点解释每个依赖的作用,推荐版本,并说明版本选择的依据。同时,提醒排除冲突依赖和可能的额外排除项,确保构建过程顺利。</think>以下是针对您提供的依赖配置的详细扩展说明,包含推荐版本及配置建议: --- ### 一、Flink核心依赖配置(流处理基础) ```xml <properties> <!-- 推荐使用LTS版本,确保稳定性 --> <flink.version>1.17.1</flink.version> </properties> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>${flink.version}</version> <scope>provided</scope> <!-- 生产环境需保证集群与本地版本一致 --> </dependency> ``` **作用**:提供Flink流处理核心API(DataStream API) **版本选择依据**: - `1.17.x` 是长期支持版本(LTS),适合生产环境 - 若需最新特性可使用 `1.18.x`,但需注意API兼容性 --- ### 二、Kafka连接器(实时数据接入) ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka</artifactId> <version>${flink.version}</version> <!-- 必须与Flink核心版本严格一致 --> </dependency> ``` **关键注意事项**: 1. 需额外指定Kafka客户端版本(建议与集群版本匹配): ```xml <properties> <kafka.version>3.5.1</kafka.version> </properties> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>${kafka.version}</version> </dependency> ``` 2. 推荐使用 `flink-sql-connector-kafka` 若需Table API/SQL方式接入 --- ### 三、HBase客户端(数据存储) ```xml <properties> <!-- 根据HBase集群版本选择 --> <hbase.version>2.4.18</hbase.version> </properties> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>${hbase.version}</version> <exclusions> <!-- 排除常见冲突依赖 --> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> ``` **版本对照建议**: - HBase 2.2.x 集群 → `2.2.7` - HBase 2.4.x 集群 → `2.4.18` - 若使用CDH/HDP发行版,需使用对应厂商版本号 **补充依赖建议**: ```xml <!-- 建议显式声明Hadoop依赖 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.6</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### 四、完整配置示例(pom.xml片段) ```xml <properties> <flink.version>1.17.1</flink.version> <hbase.version>2.4.18</hbase.version> <kafka.version>3.5.1</kafka.version> <hadoop.version>3.3.6</hadoop.version> </properties> <!-- Flink Core --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <!-- Kafka Connector --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>${kafka.version}</version> </dependency> <!-- HBase Integration --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>${hbase.version}</version> <exclusions> <exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion> <exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> <exclusions> <exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion> </exclusions> </dependency> ``` --- ### 五、验证建议 1. **版本冲突检测**:使用 `mvn dependency:tree` 检查依赖树 2. **运行时环境**:确保生产集群的Flink/HBase/Kafka版本与本地一致 3. **日志配置**:建议统一使用Logback+SLF4J,排除所有Log4j依赖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值