Skip to content

Commit

Permalink
storm集成用例
Browse files Browse the repository at this point in the history
  • Loading branch information
heibaiying committed Apr 20, 2019
1 parent 8afb2ba commit df58b3c
Show file tree
Hide file tree
Showing 26 changed files with 211 additions and 150 deletions.
21 changes: 12 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,10 @@ TODO
2. [Storm核心概念详解](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm核心概念详解.md)
3. [Storm单机版本环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Storm%E5%8D%95%E6%9C%BA%E7%89%88%E6%9C%AC%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md)
4. [Storm编程模型详解](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm编程模型详解.md)
5. Storm整合Redis
6. Storm整合HDFS/HBase
7. Storm整合Kafka
8. Storm Topology的两种打包方式
5. [Storm项目三种打包方式对比分析](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm三种打包方式对比分析.md)
6. [Storm集成Redis详解](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm集成Redis详解.md)
7. [Storm集成HDFS/HBase](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm集成HBase和HDFS.md)
8. [Storm集成Kafka](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm集成Kakfa.md)

## 六、Flume

Expand Down Expand Up @@ -115,15 +115,18 @@ TODO
10. [Spring/Spring Boot 整合 Mybatis + Phoenix](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Spring%2BMybtais%2BPhoenix%E6%95%B4%E5%90%88.md)
## 十、Kafka

1. Kafka 简介及消息处理过程分析
1. [Kafka 核心概念介绍](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Kafka核心概念介绍.md)
2. 基于Zookeeper搭建Kafka高可用集群
3. Kafka 副本机制以及选举原理剖析
3. Kafka生产者详解
4. Kafka消费者详解
5. Kafka 副本机制以及选举原理剖析
6. Kafka的数据可靠性

## 十一、Zookeeper

1. Zookeeper 简介及原理介绍
2. Zookeeper 集群搭建Zookeeper
3. 分布式锁实现方案Zookeeper
1. Zookeeper 简介及核心概念
2. Zookeeper集群搭建Zookeeper
3. Zookeeper分布式锁实现方案
4. 集群升级、迁移深入分析 Zookeeper
5. Zab协议及选举机制

Expand Down
Empty file.
65 changes: 65 additions & 0 deletions notes/Kafka核心概念介绍.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Kafka核心概念介绍

<nav>
<a href="#一Kafka简介">一、Kafka简介</a><br/>
<a href="#二Kafka核心概念">二、Kafka核心概念</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-Messages-And-Batches">2.1 Messages And Batches</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-Topics-And-Partitions">2.2 Topics And Partitions</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-Producers-And-Consumers">2.3 Producers And Consumers</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-Brokers-And-Clusters">2.4 Brokers And Clusters </a><br/>
</nav>


## 一、Kafka简介

ApacheKafka是一个分布式的流处理平台。它具有以下特点:

+ 支持消息的发布和订阅,类似于RabbtMQ、ActiveMQ等消息队列;
+ 支持消息的持久化存储,并通过多副本分布式的存储方案来保证消息的容错性;
+ 支持数据在线实时处理;
+ 高吞吐率,单broker可以轻松处理数千个分区以及每秒百万级的消息量;
+ 能保证消息的可靠性投递。

## 二、Kafka核心概念

### 2.1 Messages And Batches

Kafka的基本数据单元被称为message(消息),为减少网络开销,提高效率,多个消息会被放入同一批次(Batch)中后再写入。

### 2.2 Topics And Partitions

kafka 的消息通过Topics(主题)进行分类,可以把Topics理解为关系型数据库中的表。一个主题可以被分为若干个Partitions(分区),一个分区就是一个提交日志(commit log)。

消息以追加的方式写入分区,然后以先入先出的顺序读取。kafka通过分区来实现数据的冗余和伸缩性,分区可以分布在不同的服务器上,这意味着一个Topic可以横跨多个服务器,以提供比单个服务器更强大的性能。

由于一个Topic包含多个分区,因此无法在整个Topic范围内保证消息的顺序性,但可以保证消息在单个分区内的顺序性。

<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/kafka-topic.png"/> </div>

### 2.3 Producers And Consumers

#### 1. 生产者

生产者负责创建消息。一般情况下,生产者在把消息均衡地分布到在主题的所有分区上,而并不关心消息会被写到哪个分区。如果我们想要把消息写到指定的分区,通过分区器对消息键进行散列来实现。

#### 2. 消费者

消费者是消费者群组的一部分,消费者负责消费消息。消费者可以订阅一个或者多个主题,并按照消息生成的顺序来读取它们。消费者通过检查消息的偏移量(offset)来区分读取过的消息。

偏移量是一个不断递增的数值,在创建消息时,Kafka会把它添加到其中,在给定的分区里,每个消息的偏移量都是唯一的。消费者把每个分区最后读取的偏移量保存在Zookeeper或Kafka上,如果消费者关闭或者重启,它还可以重新获取该偏移量,以保证读取状态不会丢失。

<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/kafka-producer-consumer.png"/> </div>

一个分区只能被同一个消费者群组里面的一个消费者读取,但可以被不同消费者群组中所组成的多个消费者共同读取。多个消费者群组中消费者共同读取同一个主题时,彼此之间互不影响。

<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/kafka消费者.png"/> </div>

### 2.4 Brokers And Clusters

一个独立的kafka服务器被称为broker。broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker为消费者提供服务,对读取分区的请求做出响应,返回已经提交到磁盘的消息。

broker是集群(Cluster)的组成部分。每一个集群都有一个broker同时充当了集群控制器(controller)的角色(自动从集群的活跃成员中选举出来),控制器负责管理工作,包括将分区分配给broker和监控broker。

在集群中,一个分区(Partition)从属一个broker,该broker被称为分区的首领(leader)。一个分区可以分配给多个broker,这个时候会发生分区复制。这种复制机制为分区提供了消息冗余,如果有一个broker失效,其他broker可以接管领导权。

<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/kafka-cluster.png"/> </div>
Empty file added notes/Kafka消费者详解.md
Empty file.
Empty file added notes/Kafka生产者详解.md
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
# Storm多种打包方式对比分析
# Storm三种打包方式对比分析

<nav>
<a href="#一简介">一、简介</a><br/>
<a href="#二mvn-package">二、mvn package</a><br/>
<a href="#三maven-assembly-plugin插件">三、maven-assembly-plugin插件</a><br/>
<a href="#四maven-shade-plugin插件">四、maven-shade-plugin插件</a><br/>
<a href="#五结论">五、结论</a><br/>
<a href="#六打包注意事项">六、打包注意事项</a><br/>
</nav>


## 一、简介

在将Storm Topology提交到服务器集群进行运行时,需要先将项目进行打包本文主要对比分析各种打包方式,并将打包过程中需要注意的事项进行说明。主要打包方式有以下三种:
在将Storm Topology提交到服务器集群进行运行时,需要先将项目进行打包本文主要对比分析各种打包方式,并将打包过程中需要注意的事项进行说明。主要打包方式有以下三种:

+ 第一种:不加任何插件,直接使用mvn package打包;
+ 第二种:使用maven-assembly-plugin插件进行打包;
Expand Down Expand Up @@ -30,7 +40,7 @@
+ 如果第三方JAR包在远程中央仓库,可以使用`--artifacts` 指定,此时如果想要排除某些依赖,可以使用 `^` 符号;
+ 如果第三方JAR包在其他仓库,还需要使用 `--artifactRepositories`指明仓库地址,库名和地址使用 `^` 符号分隔。

以下是包含上面三种情况的一个例子
以下是包含上面三种情况的一个样例命令

```shell
./bin/storm jar example/storm-starter/storm-starter-topologies-*.jar org.apache.storm.starter.RollingTopWords blobstore-remote2 remote --jars "./external/storm-redis/storm-redis-1.1.0.jar,./external/storm-kafka/storm-kafka-1.1.0.jar" --artifacts "redis.clients:jedis:2.9.0,org.apache.kafka:kafka_2.10:0.8.2.2^org.slf4j:slf4j-log4j12" --artifactRepositories "jboss-repository^http://repository.jboss.com/maven2,HDPRepo^http://repo.hortonworks.com/content/groups/public/"
Expand All @@ -42,7 +52,7 @@

### 3.1 官方文档说明

maven-assembly-plugin是官方文档中介绍的打包方法,以下表述来源于官方文档[Running Topologies on a Production Cluster](http://storm.apache.org/releases/2.0.0-SNAPSHOT/Running-topologies-on-a-production-cluster.html)
maven-assembly-plugin是官方文档中介绍的打包方法,来源于官方文档[Running Topologies on a Production Cluster](http://storm.apache.org/releases/2.0.0-SNAPSHOT/Running-topologies-on-a-production-cluster.html)

> If you're using Maven, the [Maven Assembly Plugin](http://maven.apache.org/plugins/maven-assembly-plugin/) can do the packaging for you. Just add this to your pom.xml:
>
Expand Down Expand Up @@ -73,9 +83,9 @@ maven-assembly-plugin的使用非常简单,只需要在POM.xml中引入即可
### 3.2 排除Storm jars
这里说明一下,`jar-with-dependencies`是Maven官方内置的一种打包格式,Maven官方文档[Pre-defined Descriptor Files](http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html)中有所说明:
`jar-with-dependencies`是Maven官方内置的一种打包格式,Maven官方文档[Pre-defined Descriptor Files](http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html)中有所说明:
![jar-with-dependencies](D:\BigData-Notes\pictures\jar-with-dependencies.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/jar-with-dependencies.png"/> </div>
如果你想排除某个依赖,这里以排除`storm-core`为例,你可以在`jar-with-dependencies`的XML上进行修改。
Expand Down Expand Up @@ -167,7 +177,7 @@ assembly.xml文件内容如下:

>在配置文件中不仅可以排除依赖,还可以排除指定的文件,更多的配置规则可以参考官方文档:[Descriptor Format](http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#)
#### 2. 打包命令
#### 2. 打包命令

采用maven-assembly-plugin进行打包时命令如下:

Expand All @@ -177,7 +187,7 @@ assembly.xml文件内容如下:

打包后会同时生成两个JAR包,其中后缀为`jar-with-dependencies`是含有第三方依赖的JAR包,后缀是由`assembly.xml``<id>`标签指定的,可以自定义修改。提交该JAR到集群环境即可直接使用。

![storm-jar](D:\BigData-Notes\pictures\storm-jar.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-jar.png"/> </div>



Expand Down Expand Up @@ -205,11 +215,11 @@ assembly.xml文件内容如下:
RuntimeException异常。
采用maven-shade-plugin有很多好处,比如你的工程依赖很多的JAR包,而被依赖的JAR又会依赖其他的JAR包,这样,当工程中依赖到不同的版本的 JAR时,并且JAR中具有相同名称的资源文件时,shade插件会尝试将所有资源文件打包在一起时,而不是和assembly一样执行覆盖操作。
采用maven-shade-plugin打包有很多好处,比如你的工程依赖很多的JAR包,而被依赖的JAR又会依赖其他的JAR包,这样,当工程中依赖到不同的版本的 JAR时,并且JAR中具有相同名称的资源文件时,shade插件会尝试将所有资源文件打包在一起时,而不是和assembly一样执行覆盖操作。
### 4.2 配置
配置示例如下:
采用`maven-shade-plugin`进行打包时候,配置示例如下:
```xml
<plugin>
Expand Down Expand Up @@ -260,9 +270,9 @@ RuntimeException异常。
</plugin>
```
配置说明
以上配置示例来源于Storm在Github上的examples,这里做一下说明

有些jar包生成时,会使用jarsigner生成文件签名(完成性校验),分为两个文件存放在META-INF目录下
在上面的配置中,排除了部分文件,这是因为有些JAR包生成时,会使用jarsigner生成文件签名(完成性校验),分为两个文件存放在META-INF目录下

+ a signature file, with a .SF extension;
+ a signature block file, with a .DSA, .RSA, or .EC extension;
Expand All @@ -279,7 +289,7 @@ RuntimeException异常。

打包后会生成两个JAR包,提交到服务器集群时使用非original开头的JAR.

![storm-jar2](D:\BigData-Notes\pictures\storm-jar2.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-jar2.png"/> </div>

## 五、结论

Expand All @@ -291,7 +301,7 @@ RuntimeException异常。

无论采用任何打包方式,都必须排除集群环境中已经提供的storm jars。这里比较典型的是storm-core,其在安装目录的lib目录下已经存在。

![storm-lib](D:\BigData-Notes\pictures\storm-lib.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-lib.png"/> </div>



Expand All @@ -306,4 +316,5 @@ Caused by: java.lang.RuntimeException: java.io.IOException: Found multiple defau
... 39 more
```
![storm-jar-complie-error](D:\BigData-Notes\pictures\storm-jar-complie-error.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-jar-complie-error.png"/> </div>
Loading

0 comments on commit df58b3c

Please sign in to comment.