优化阅读格式

This commit is contained in:
heibaiying
2019-07-31 17:18:07 +08:00
parent ceb868fe13
commit ca7c99802b
91 changed files with 4059 additions and 4058 deletions

View File

@ -20,15 +20,15 @@
## 一、简介
Apache Flume是一个分布式高可用的数据收集系统可以从不同的数据源收集数据经过聚合后发送到分布式计算框架或者存储系统中。Spark Straming提供了以下两种方式用于Flume的整合。
Apache Flume 是一个分布式高可用的数据收集系统可以从不同的数据源收集数据经过聚合后发送到分布式计算框架或者存储系统中。Spark Straming 提供了以下两种方式用于 Flume 的整合。
## 二、推送式方法
在推送式方法(Flume-style Push-based Approach)中Spark Streaming程序需要对某台服务器的某个端口进行监听Flume通过`avro Sink`将数据源源不断推送到该端口。这里以监听日志文件为例,具体整合方式如下:
在推送式方法 (Flume-style Push-based Approach) Spark Streaming 程序需要对某台服务器的某个端口进行监听Flume 通过 `avro Sink` 将数据源源不断推送到该端口。这里以监听日志文件为例,具体整合方式如下:
### 2.1 配置日志收集Flume
新建配置`netcat-memory-avro.properties`,使用`tail`命令监听文件内容变化,然后将新的文件内容通过`avro sink`发送到hadoop001这台服务器的8888端口
新建配置 `netcat-memory-avro.properties`,使用 `tail` 命令监听文件内容变化,然后将新的文件内容通过 `avro sink` 发送到 hadoop001 这台服务器的 8888 端口:
```properties
#指定agent的sources,sinks,channels
@ -57,7 +57,7 @@ a1.channels.c1.transactionCapacity = 100
### 2.2 项目依赖
项目采用Maven工程进行构建主要依赖为`spark-streaming``spark-streaming-flume`
项目采用 Maven 工程进行构建,主要依赖为 `spark-streaming``spark-streaming-flume`
```xml
<properties>
@ -72,7 +72,7 @@ a1.channels.c1.transactionCapacity = 100
<artifactId>spark-streaming_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- Spark Streaming整合Flume依赖-->
<!-- Spark Streaming 整合 Flume 依赖-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-flume_${scala.version}</artifactId>
@ -84,7 +84,7 @@ a1.channels.c1.transactionCapacity = 100
### 2.3 Spark Streaming接收日志数据
调用 FlumeUtils工具类的`createStream`方法对hadoop0018888端口进行监听获取到流数据并进行打印
调用 FlumeUtils 工具类的 `createStream` 方法,对 hadoop0018888 端口进行监听,获取到流数据并进行打印:
```scala
import org.apache.spark.SparkConf
@ -109,9 +109,9 @@ object PushBasedWordCount {
### 2.4 项目打包
因为Spark安装目录下是不含有`spark-streaming-flume`依赖包的,所以在提交到集群运行时候必须提供该依赖包,你可以在提交命令中使用`--jar`指定上传到服务器的该依赖包,或者使用`--packages org.apache.spark:spark-streaming-flume_2.12:2.4.3`指定依赖包的完整名称,这样程序在启动时会先去中央仓库进行下载。
因为 Spark 安装目录下是不含有 `spark-streaming-flume` 依赖包的,所以在提交到集群运行时候必须提供该依赖包,你可以在提交命令中使用 `--jar` 指定上传到服务器的该依赖包,或者使用 `--packages org.apache.spark:spark-streaming-flume_2.12:2.4.3` 指定依赖包的完整名称,这样程序在启动时会先去中央仓库进行下载。
这里我采用的是第三种方式:使用`maven-shade-plugin`插件进行`ALL IN ONE`打包把所有依赖的Jar一并打入最终包中。需要注意的是`spark-streaming`包在Spark安装目录的`jars`目录中已经提供,所以不需要打入。插件配置如下:
这里我采用的是第三种方式:使用 `maven-shade-plugin` 插件进行 `ALL IN ONE` 打包,把所有依赖的 Jar 一并打入最终包中。需要注意的是 `spark-streaming` 包在 Spark 安装目录的 `jars` 目录中已经提供,所以不需要打入。插件配置如下:
```xml
@ -125,7 +125,7 @@ object PushBasedWordCount {
<target>8</target>
</configuration>
</plugin>
<!--使用shade进行打包-->
<!--使用 shade 进行打包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
@ -174,7 +174,7 @@ object PushBasedWordCount {
</execution>
</executions>
</plugin>
<!--打包.scala文件需要配置此插件-->
<!--打包.scala 文件需要配置此插件-->
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
@ -204,13 +204,13 @@ object PushBasedWordCount {
```
> 本项目完整源码见:[spark-streaming-flume](https://github.com/heibaiying/BigData-Notes/tree/master/code/spark/spark-streaming-flume)
使用`mvn clean package`命令打包后会生产以下两个Jar包提交`original`开头的Jar即可。
使用 `mvn clean package` 命令打包后会生产以下两个 Jar 包,提交 `original` 开头的 Jar 即可。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/spark-streaming-flume-jar.png"/> </div>
### 2.5 启动服务和提交作业
启动Flume服务
启动 Flume 服务:
```shell
flume-ng agent \
@ -219,7 +219,7 @@ flume-ng agent \
--name a1 -Dflume.root.logger=INFO,console
```
提交Spark Streaming作业
提交 Spark Streaming 作业:
```shell
spark-submit \
@ -230,11 +230,11 @@ spark-submit \
### 2.6 测试
这里使用`echo`命令模拟日志产生的场景,往日志文件中追加数据,然后查看程序的输出:
这里使用 `echo` 命令模拟日志产生的场景,往日志文件中追加数据,然后查看程序的输出:
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/spark-flume-input.png"/> </div>
Spark Streaming程序成功接收到数据并打印输出
Spark Streaming 程序成功接收到数据并打印输出:
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/spark-flume-console.png"/> </div>
@ -242,23 +242,23 @@ Spark Streaming程序成功接收到数据并打印输出
#### 1. 启动顺序
这里需要注意的不论你先启动Spark程序还是Flume程序由于两者的启动都需要一定的时间此时先启动的程序会短暂地抛出端口拒绝连接的异常此时不需要进行任何操作等待两个程序都启动完成即可。
这里需要注意的,不论你先启动 Spark 程序还是 Flume 程序,由于两者的启动都需要一定的时间,此时先启动的程序会短暂地抛出端口拒绝连接的异常,此时不需要进行任何操作,等待两个程序都启动完成即可。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flume-retry.png"/> </div>
#### 2. 版本一致
最好保证用于本地开发和编译的Scala版本和SparkScala版本一致至少保证大版本一致如都是`2.11`
最好保证用于本地开发和编译的 Scala 版本和 SparkScala 版本一致,至少保证大版本一致,如都是 `2.11`
<br/>
## 三、拉取式方法
拉取式方法(Pull-based Approach using a Custom Sink)是将数据推送到`SparkSink`接收器中此时数据会保持缓冲状态Spark Streaming定时从接收器中拉取数据。这种方式是基于事务的即只有在Spark Streaming接收和复制数据完成后才会删除缓存的数据。与第一种方式相比具有更强的可靠性和容错保证。整合步骤如下
拉取式方法 (Pull-based Approach using a Custom Sink) 是将数据推送到 `SparkSink` 接收器中此时数据会保持缓冲状态Spark Streaming 定时从接收器中拉取数据。这种方式是基于事务的,即只有在 Spark Streaming 接收和复制数据完成后,才会删除缓存的数据。与第一种方式相比,具有更强的可靠性和容错保证。整合步骤如下:
### 3.1 配置日志收集Flume
新建Flume配置文件`netcat-memory-sparkSink.properties`,配置和上面基本一致,只是把`a1.sinks.k1.type`的属性修改为`org.apache.spark.streaming.flume.sink.SparkSink`即采用Spark接收器。
新建 Flume 配置文件 `netcat-memory-sparkSink.properties`,配置和上面基本一致,只是把 `a1.sinks.k1.type` 的属性修改为 `org.apache.spark.streaming.flume.sink.SparkSink`,即采用 Spark 接收器。
```properties
#指定agent的sources,sinks,channels
@ -302,11 +302,11 @@ a1.channels.c1.transactionCapacity = 100
</dependency>
```
注意添加这两个依赖只是为了本地测试Spark的安装目录下已经提供了这两个依赖所以在最终打包时需要进行排除。
注意添加这两个依赖只是为了本地测试Spark 的安装目录下已经提供了这两个依赖,所以在最终打包时需要进行排除。
### 2.3 Spark Streaming接收日志数据
这里和上面推送式方法的代码基本相同,只是将调用方法改为`createPollingStream`
这里和上面推送式方法的代码基本相同,只是将调用方法改为 `createPollingStream`
```scala
import org.apache.spark.SparkConf
@ -333,7 +333,7 @@ object PullBasedWordCount {
启动和提交作业流程与上面相同,这里给出执行脚本,过程不再赘述。
启动Flume进行日志收集
启动 Flume 进行日志收集:
```shell
flume-ng agent \
@ -342,7 +342,7 @@ flume-ng agent \
--name a1 -Dflume.root.logger=INFO,console
```
提交Spark Streaming作业
提交 Spark Streaming 作业:
```shel
spark-submit \
@ -356,4 +356,4 @@ spark-submit \
## 参考资料
- [streaming-flume-integration](https://spark.apache.org/docs/latest/streaming-flume-integration.html)
- 关于大数据应用常用的打包方式可以参见:[大数据应用常用打包方式](https://github.com/heibaiying/BigData-Notes/blob/master/notes/大数据应用常用打包方式.md)
- 关于大数据应用常用的打包方式可以参见:[大数据应用常用打包方式](https://github.com/heibaiying/BigData-Notes/blob/master/notes/大数据应用常用打包方式.md)