storm集成用例

This commit is contained in:
罗祥
2019-04-20 12:36:57 +08:00
parent 8afb2ba809
commit df58b3ca0b
26 changed files with 212 additions and 151 deletions

View File

@ -1,14 +1,16 @@
# Storm 集成 Redis 详解
<nav>
<a href="#一简介">一、简介</a><br/>
<a href="#二集成案例">二、集成案例</a><br/>
<a href="#三storm-redis-实现原理">三、storm-redis 实现原理</a><br/>
<a href="#四自定义RedisBolt实现词频统计">四、自定义RedisBolt实现词频统计</a><br/>
</nav>
## 一、简介
storm-redis提供了Storm与Redis的集成支持你只需要引入对应的依赖即可使用。Storm-redis使用Jedis为Redis客户端提供了基本的Bolt实现 `RedisLookupBolt` and `RedisStoreBolt`
+ RedisLookupBolt从Redis中查询数据
+ RedisStoreBolt存储数据到Redis
+ RedisFilterBolt : 查询符合条件的数据;
`RedisLookupBolt``RedisStoreBolt`都继承自`AbstractRedisBolt`抽象类,我们也可以继承自该抽象类,然后按照我们自己的的业务逻辑进行功能的拓展。
storm-redis提供了Storm与Redis的集成支持你只需要引入对应的依赖即可使用。
```xml
<dependency>
@ -19,10 +21,26 @@ storm-redis提供了Storm与Redis的集成支持你只需要引入对应的
</dependency>
```
Storm-redis使用Jedis为Redis客户端并提供了如下三个基本的Bolt实现
+ RedisLookupBolt从Redis中查询数据
+ RedisStoreBolt存储数据到Redis
+ RedisFilterBolt : 查询符合条件的数据;
`RedisLookupBolt``RedisStoreBolt``RedisFilterBolt `均继承自`AbstractRedisBolt`抽象类。我们可以通过继承该抽象类进行功能的拓展实现自定义RedisBolt。
## 二、集成案例
### 2.1 项目结构
这里首先给出一个集成案例进行词频统计并将最后的结果存储到Redis。项目结构如下
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-wordcounttoredis.png"/> </div>
> 用例源码下载地址:[storm-redis-integration](https://github.com/heibaiying/BigData-Notes/tree/master/code/Storm/storm-redis-integration)
### 2.2 项目依赖
项目主要依赖如下:
@ -176,7 +194,7 @@ public class CountBolt extends BaseRichBolt {
### 2.6 WordCountStoreMapper
实现RedisStoreMapper定义定义tuple与Redis中数据的映射关系Redis存储的是Key/Value键值对并且支持多种数据结构你需要指定tuple中的个字段为key个字段为value并且存储什么数据结构。
实现RedisStoreMapper接口并定义tuple与Redis中数据的映射关系Redis存储的是Key/Value键值对并且支持多种数据结构你需要指定tuple中的个字段为key个字段为value并且存储什么数据结构
```java
/**
@ -265,7 +283,7 @@ public class WordCountToRedisApp {
启动后查看Redis中的数据
![store-redis-manager](D:\BigData-Notes\pictures\store-redis-manager.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/store-redis-manager.png"/> </div>
@ -273,11 +291,11 @@ public class WordCountToRedisApp {
### 3.1 AbstractRedisBolt
`RedisLookupBolt``RedisStoreBolt`继承自`AbstractRedisBolt`抽象类和我们自定义实现Bolt一样`AbstractRedisBolt`间接继承自`BaseRichBolt`
`RedisLookupBolt``RedisStoreBolt``RedisFilterBolt `继承自`AbstractRedisBolt`抽象类和我们自定义实现Bolt一样`AbstractRedisBolt`间接继承自`BaseRichBolt`
![storm-abstractRedisBolt](D:\BigData-Notes\pictures\storm-abstractRedisBolt.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-abstractRedisBolt.png"/> </div>
`AbstractRedisBolt`中比较重要的是prepare方法在该方法中通过外部传入的jedis连接池配置( jedisPoolConfig/jedisClusterConfig) 创建用于管理Jedis实例的容器`JedisCommandsInstanceContainer`
@ -422,13 +440,13 @@ public class RedisStoreBolt extends AbstractRedisBolt {
JedisCommands接口中定义了所有的 Redis 客户端命令它有以下三个实现类分别是Jedis、JedisCluster、ShardedJedis。Strom中主要使用前两种实现类具体调用哪一个实现类来执行命令由传入的是jedisPoolConfig还是jedisClusterConfig来决定。
![storm-jedicCommands](D:\BigData-Notes\pictures\storm-jedicCommands.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-jedicCommands.png"/> </div>
### 3.4 RedisMapper 和 TupleMapper
RedisMapper 和 TupleMapper 定义了 tuple 和 Redis 中的数据如何进行映射转换。
![storm-Redis-Mapper](D:\BigData-Notes\pictures\storm-Redis-Mapper.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/storm-Redis-Mapper.png"/> </div>
#### 1. TupleMapper
@ -517,7 +535,9 @@ public void declareOutputFields(OutputFieldsDeclarer declarer) {
## 四、自定义RedisBolt实现词频统计
自定义RedisBolt利用Redis中哈希结构的hincrby key field命令进行词频统计。在Redis中`hincrby`的执行效果如下如果在执行时字段不存在则在执行操作之前将值设置为0。通过这个命令可以非常轻松的实现词频统计功能。
### 4.1 实现原理
自定义RedisBolt主要利用Redis中哈希结构的hincrby key field命令进行词频统计。在Redis中`hincrby`的执行效果如下如果在执行时字段不存在则在执行操作之前将值设置为0。通过这个命令可以非常轻松的实现词频统计功能。
```shell
redis> HSET myhash field 5
@ -531,7 +551,11 @@ redis> HINCRBY myhash field -10
redis>
```
### 4.1 自定义RedisBolt的代码实现
### 4.2 项目结构
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/CustomRedisCountApp.png"/> </div>
### 4.3 自定义RedisBolt的代码实现
```java
/**
@ -581,7 +605,7 @@ public class RedisCountStoreBolt extends AbstractRedisBolt {
}
```
### 4.2 CustomRedisCountApp
### 4.4 CustomRedisCountApp
```java
/**
@ -622,4 +646,10 @@ public class CustomRedisCountApp {
}
}
}
```
```
## 参考资料
1. [Storm Redis Integration](http://storm.apache.org/releases/2.0.0-SNAPSHOT/storm-redis.html)