jstorm 核心

jstorm 核心,第1张

生成Topology

IRichSpout

IRichSpout 为最简单的Spout接口

其中注意:

=>spout对象必须是继承Serializable, 因此要求spout内所有数据结构必须是可序列化的

=>spout可以有构造函数,但构造函数只执行一次,是在提交任务时,创建spout对象,因此在task分配到具体worker之前的初始化工作可以在此处完成,一旦完成,初始化的内容将携带到每一个=>task内(因为提交任务时将spout序列化到文件中去,在worker起来时再将spout从文件中反序列化出来)。

=>open是当task起来后执行的初始化动作

=>close是当task被shutdown后执行的动作

=>activate 是当task被激活时,触发的动作

=>deactivate 是task被deactive时,触发的动作

=>nextTuple 是spout实现核心, nextuple完成自己的逻辑,即每一次取消息后,用collector 将消息emit出去。

=>ack, 当spout收到一条ack消息时,触发的动作,详情可以参考 ack机制

=>fail, 当spout收到一条fail消息时,触发的动作,详情可以参考 ack机制

=>declareOutputFields, 定义spout发送数据,每个字段的含义

=>getComponentConfiguration 获取本spout的component 配置

Bolt

其中注意:

=>bolt对象必须是继承Serializable, 因此要求spout内所有数据结构必须是可序列化的

=>bolt可以有构造函数,但构造函数只执行一次,是在提交任务时,创建bolt对象,因此在task分配到具体worker之前的初始化工作可以在此处完成,一旦完成,初始化的内容将携带到每一个task内(因为提交任务时将bolt序列化到文件中去,在worker起来时再将bolt从文件中反序列化出来)。

=>prepare是当task起来后执行的初始化动作

=>cleanup是当task被shutdown后执行的动作

=>execute是bolt实现核心, 完成自己的逻辑,即接受每一次取消息后,处理完,有可能用collector 将产生的新消息emit出去。 ** 在executor中,当程序处理一条消息时,需要执行collector.ack, 详情可以参考 ack机制 ** 在executor中,当程序无法处理一条消息时或出错时,需要执行collector.fail ,详情可以参考 ack机制

=>declareOutputFields, 定义bolt发送数据,每个字段的含义

=>getComponentConfiguration 获取本bolt的component 配置

打包

提交jar

xxxx.jar 为打包后的jar

com.alibaba.xxxx.xx 为入口类,即提交任务的类

parameter即为提交参数

Storm中有个特殊的task名叫acker,他们负责跟踪spout发出的每一个Tuple的Tuple树(因为一个tuple通过spout发出了,经过每一个bolt处理后,会生成一个新的tuple发送出去)。当acker(框架自启动的task)发现一个Tuple树已经处理完成了,它会发送一个消息给产生这个Tuple的那个task。Acker的跟踪算法是Storm的主要突破之一,对任意大的一个Tuple树,它只需要恒定的20字节就可以进行跟踪。

Acker跟踪算法的原理:acker对于每个spout-tuple保存一个ack-val的校验值,它的初始值是0,然后每发射一个Tuple或Ack一个Tuple时,这个Tuple的id就要跟这个校验值异或一下,并且把得到的值更新为ack-val的新值。那么假设每个发射出去的Tuple都被ack了,那么最后ack-val的值就一定是0。Acker就根据ack-val是否为0来判断是否完全处理,如果为0则认为已完全处理。

要实现ack机制:

阿里自己的Jstorm会提供

public interface IFailValueSpout { void fail(Object msgId, List<object>values)}

这样更合理一些, 可以直接取得系统cache的msg values

ack机制即,spout发送的每一条消息,在规定的时间内,spout收到Acker的ack响应,即认为该tuple 被后续bolt成功处理

在规定的时间内(默认是30秒),没有收到Acker的ack响应tuple,就触发fail动作,即认为该tuple处理失败,timeout时间可以通过Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS来设定。

l或者收到Acker发送的fail响应tuple,也认为失败,触发fail动作

注意,我开始以为如果继承BaseBasicBolt那么程序抛出异常,也会让spout进行重发,但是我错了,程序直接异常停止了

这里我以分布式程序入门案例worldcount为例子吧。

有人问到Storm 是怎么处理重复的tuple?

因为Storm 要保证tuple 的可靠处理,当tuple 处理失败或者超时的时候,spout 会fail并重新发送该tuple,那么就会有tuple 重复计算的问题。这个问题是很难解决的,storm也没有提供机制帮助你解决。不过也有一些可行的策略:

(1)不处理,这也算是种策略。因为实时计算通常并不要求很高的精确度,后

续的批处理计算会更正实时计算的误差。

(2)使用第三方集中存储来过滤,比如利用 MySQL 、MemCached 或者 Redis 根据逻辑主键来去重。

(3)使用bloom filter 做过滤,简单高效。

在学习storm的过程中,有不少人对storm的Spout组件中的ack及fail相关的问题存在困惑,这里做一个简要的概述。

Storm保证每一个数据都得到有效处理,这是如何保证的呢?正是ack及fail机制确保数据都得到处理的保证,但是storm只是提供给我们一个接口,而具体的方法得由我们自己来实现。例如在spout下一个拓扑节点的bolt上,我们定义某种情况下为数据处理失败,则调用fail,则我们可以在fail方法中进行数据重发,这样就保证了数据都得到了处理。其实,通过读storm的源码,里面有讲到,有些类(BaseBasicBolt?)是会自动调用ack和fail的,不需要我们程序员去ack和fail,但是其他Bolt就没有这种功能了。

1.脚本语言基础 主流的有php java .net 非主流的有python ruby 还有最近出现的node.js golang 任一即可

2.数据库基础 后端就是跟数据库打交道的 一般学习关系型数据库即可

3.服务器基础 后端代码是运行在服务器上的 不像前端运行在客户浏览器 所以你需要掌握少许的服务器基础 至少要会用

4.以上三点满足即可开始后端开发 但是要提高还需要学会 缓存 队列应用 跨平台请求 分布式 等等 可以说 后端入门容易 但很宽也很广 只能一点点学习

Java :只要了bai解一些基础即可,做大数据不需要很深的Java 技术,学java SE 就相当于有学习大数据。

Linux:因为大数据相关软件都是在Linux上运行的,所以Linux要学习的扎实一些,学好Linux对你快速掌握大数据相关技术会有很大的帮助,能让你更好的理解hadoop、hive、hbase、spark等大数据软件的运行环境和网络环境配置,能少踩很多坑,学会shell就能看懂脚本这样能更容易理解和配置大数据集群。

Hadoop:这是现在流行的大数据处理平台几乎已经成为大数据的代名词,所以这个是必学的。

Zookeeper:这是个万金油,安装Hadoop的HA的时候就会用到它,以后的Hbase也会用到它。

Mysql:我们学习完大数据的处理了,接下来学习学习小数据的处理工具mysql数据库,因为一会装hive的时候要用到,mysql需要掌握到什么层度那?你能在Linux上把它安装好,运行起来,会配置简单的权限,修改root的密码,创建数据库。

Sqoop:这个是用于把Mysql里的数据导入到Hadoop里的。

Hive:这个东西对于会SQL语法的来说就是神器,它能让你处理大数据变的很简单

Oozie:既然学会Hive了,我相信你一定需要这个东西,它可以帮你管理你的Hive或者MapReduce、Spark脚本,还能检查你的程序是否执行正确。

Hbase:这是Hadoop生态体系中的NOSQL数据库,他的数据是按照key和value的形式存储的并且key是唯一的,所以它能用来做数据的排重,它与MYSQL相比能存储的数据量大很多。

Kafka:这是个比较好用的队列工具。

Spark:它是用来弥补基于MapReduce处理数据速度上的缺点。

请点击输入图片描述


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7670540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存