Storm实战常见的问题
类型
|
详细
|
备注
|
该文档是群里几个朋友在storm实战中遇到的一些问题,及其对应解决办法。
|
相关描述
|
其他相关文档请参考新浪博客http://blog.sina.com.cn/huangchongyuan
有任何其他想法,[url=mailto:%E5%8F%AF%E4%BB%A5%E9%82%AE%E4%BB%B6874450476@qq.com]可以邮件874450476@qq.com[/url]
文档及相关资料下载请个人360云盘http://yunpan.cn/QGf2GDaRFpcDt及百度文库、新浪爱问搜索。
部分文档涉及到源码,有需要的博客留言,关注我的博客。
欢迎加入storm-分布式-IT技术交流群(191321336,群中有详细的资料),一起讨论技术,一起分享代码,一起分享设计。
|
文档说明
文档包涵了storm实战中经常遇到一些问题,及对应解决方案。这个文档是群里一个朋友在学习storm,并实战storm中遇到的一些问题,及和群里其
他朋友一起交流给出的对应解决方案,并由他整理好,委托我发布出来(也算是交流者之一),供大家参考,希望能对大家有所帮助。
问题锦集
1 关于Storm集群
1.1 关于storm集群的环境变量配置问题
装好JDK后,需要配置环境变量,通常情况下出于经验,我们往往会修改/etc/profile的值进行环境变量配置,但这在安装JDK以及后面安装的
storm集群、zookeeper集群以及metaq集群时会出问题,这时候我们需要在/etc/.bashrc文件中加入环境变量,不然安装的
java和ZK集群等就无法使用,尤其这个问题在我用shell写调度脚本去启动storm集群的时候就遇到过,如果没有将java的环境变量配置在
/etc/.bashrc文件中,就会报一个错,这个问题在后面我会提到。
1.2 关于zookeeper集群安装问题
得刚刚接触storm,在安装zookeeper集群的时候有这样的考虑:为什么不可以把zookeeper只安装在nimbus上,然后让其他的
supervisor来它这里读取任务?如果在每台机器上都安装zookeeper,那nimbus分配任务的时候,是每台机器上的zookeeper都
收到同一份的任务,还是只是将分配给每个supervisor节点的那部分写到同一节点上的zookeeper中?
朋友解答说:ZK也是以集群的方式工作的,ZK集群内部有他自己的一套相互通信机制,而storm正是要借助其通讯机制,例如任务下发等,往往在执行一个
任务的时候,storm会把任务及相关执行的代码经过序列化之后发送到各个ZK节点供supervisor去下载,然后才会各自执行自己部分的代码或者任
务。说的直接一点就是每个ZK节点收到的任务是一样的,而supervisor只需要下载属于自己的任务即可。
1.3 关于Storm中tuple 的可靠处理问题
于这个问题,其实网上是有资料进行了详细的解释的。这里只是大概将一下,如果还不明白,可以上网搜搜“storm可靠处理”。Storm
为了保证tuple 的可靠处理,acker 会保存该节点创建的tuple id的xor (异或)值,这个值称为ack value,那么每ack
一次,就将tuple id 和ack value做异或(xor)。当所有产生的tuple 都被ack 的时候,ack value
必定为0。这是个很简单的策略,对于每一个tuple 也只要占用约20 个字节的内存。对于100万tuple,也才20M
左右,所以一般情况下是不用考虑内存泄漏问题的。
1.4 关于storm计算结果的存放问题
方解释说: Storm
是不负责保存计算结果的,这是应用程序里需要负责的事情,如果数据不大,你可以简单地保存在内存里,也可以每次都更新数据库,也可以采用NoSQL存储。
storm 并没有像s4 那样提供一个Persist
API,根据时间或者容量来做存储输出。这部分事情完全交给用户。数据存储之后的展现,也是你需要自己处理的,storm UI
只提供对topology 的监控和统计。
1.5 关于Storm如何处理重复的tuple问题
1.6 关于task与executor的关系问题
我们安装配置storm的时候,不知大家是否主要到了一个问题,就是我们在配置的时候会加几个worker的端口(
supervisor.slots.ports:),比如众多文档中提到的6700/6701等等类似的东西。没错,这就是我们定义了该
supervisor最多的worker数,worker中执行一个bolt或者spout线程,我们就称之为task,而executor是物理上的线
程概念,我们可以将其称为执行线程;而task更多是逻辑概念上的,有时候bolt与spout的task会共用一个executor,特别是在系统负荷
比较高的时候。
1.7 关于Storm UI显示内容的问题
单地说,complete latency 表示了tuple 从emit 到被acked 经过的时间,可以认为是tuple 以及该tuple
的后续子孙(形成一棵树)整个处理时间。其次spout 的emit 和transfered 还统计了spout 和acker
之间内部的通信信息,比如对于可靠处理的spout 来说,会在emit 的时候同时发送一个_ack_init 给acker,记录tuple id
到task id 的映射,以便ack 的时候能找到正确的acker task。
1.8 关于Storm的ack和fail问题
保证每一个数据都得到有效处理,这是如何保证的呢?正是ack及fail机制确保数据都得到处理的保证,但是storm只是提供给我们一个接口,而具体的
方法得由我们自己来实现。例如在spout下一个拓扑节点的bolt上,我们定义某种情况下为数据处理失败,则调用fail,则我们可以在fail方法中
进行数据重发,这样就保证了数据都得到了处理。其实,通过读storm的源码,里面有讲到,有些类(BaseBasicBolt?)是会自动调用ack和
fail的,不需要我们程序员去ack和fail,但是其他Bolt就没有这种功能了。
1.9 关于IRichBolt与IBasicBolt接口的区别
先从类的组成上进行分析可以看到,IBasicBolt接口只有execute方法和declareOutputFields方法,而IRichBolt
接口上除了以上几个方法还有prepare方法和cleanup及map方法。而且其中execute方法是有些不一样的,其参数列表不同。
体来说Rich方法比较完善,我们可以使用prepare方法进行该Bolt类的初始化工作,例如我们链接数据库时,需要进行一次数据库连接操作,我们就
可以把该操作放入prepare中,只需要执行一次就可以了。而cleanup方法能在该类调用结束时进行收尾工作,往往在处理数据的时候用到,例如在写
hdfs(hadoop的文件系统)数据的时候,在结束时需要进行数据clear,则需要进行数据收尾。当然,根据官网及实际的测验,该方法往往是执行失
败的。
2 关于Topology发布
2.1 发布topologies 到远程集群时,出现Nimbus host is not set 异常
2.2 发布topology到远程集群时,出现AlreadyAliveException(msg: xxx is already active)异常
2.3 启动Supervisor 时,出现java.lang.UnsatisfiedLinkError
2.4 发布topologies 时,出现不能序列化log4j.Logger 的异常
2.5 bolt 在处理消息时,worker 的日志中出现Failing message
2.6 在打包toplogy工程的时候, 如果采用assembly方式, 对于相关的依赖的配置一般要这样:
用<scope>compile</scope>。然后将storm依赖设置为runtime, 貌似不行。
另外就是所有的依赖包将全部解压,
然后将所有依赖的配置和class文件生成一个文件。这个是通过<unpack>true</unpack>参数来控制的。
2.7 在提交topology的时候有时可能出现如下异常:
at backtype.storm.utils.NimbusClient.<init>(NimbusClient.java:30)
at backtype.storm.utils.NimbusClient.getConfiguredClient(NimbusClient.java:17)
at backtype.storm.StormSubmitter.submitJar(StormSubmitter.java:78)
at backtype.storm.StormSubmitter.submitJar(StormSubmitter.java:71)
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:50)
at com.taobao.kaleidoscope.storm.IcdbTopology.main(IcdbTopology.java:59)
3 关于DRPC
3.1 发布drpc 类型的topologies 到远程集群时,出现空指针异常,连接drpc服务器失败
3.2 客户端调用drpc 服务时,worker 的日志中出现Failing message,而bolt都未收到数据
4 关于jzmq安装
4.1 storm 启动时报no jzmq in java.library.path 错误
4.2 安装jzmq 时遇到No rule to make target ‘classdist_noinst.stamp’的make 错误
4.3 安装jzmq 时遇到cannot access org.zeromq.ZMQ 的make 错误
4.4 在部署storm节点的时候需要安装jzmq和zeromq, 在安装这两个依赖包之后, 需要执行sudo -u root ldconfig. 否则会出现异常:
java.lang.UnsatisfiedLinkError: /usr/local/lib/libjzmq.so.0.0.0: libzmq.so.1: cannot open shared object file: No such file or
directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1728)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at org.zeromq.ZMQ.<clinit>(ZMQ.java:34)
5 关于Storm的配置问题
6 关闭storm相关进程
6.1 关闭nimbus相关进程:
6.2 干掉supervisor上的所有storm进程:
7 关于Topology发布之后的log
8 关于maven打包问题
8.1 首先maven的pom文件中的storm依赖,要么加exclude storm的相关语句(github有说明),要么加<scope>,如下:
8.2 使用maven插件,在打jar包时,包含依赖。
8.3 依赖的jar冲突问题
9 关于nimbus的启动问题
9.1 Storm nimbus启动失败
backtype.storm.daemon.nimbus
$fn__2692$exec_fn__945__auto____2693$this__2731@62135133
java.io.FileNotFoundException: File '/opt/apps-install/storm/
storm_local/nimbus/stormdist/appFailed-6-1325065153/stormconf.ser'
does not exist
at
org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:137)
at
org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:
1135)
at backtype.storm.daemon.nimbus
$read_storm_conf.invoke(nimbus.clj:128)
at backtype.storm.daemon.nimbus
$compute_new_task__GT_node_PLUS_port.invoke(nimbus.clj:244)
at backtype.storm.daemon.nimbus
$mk_assignments.invoke(nimbus.clj:288)
at backtype.storm.daemon.nimbus
$fn__2692$exec_fn__945__auto____2693$this__2731.invoke(nimbus.clj:460)
at backtype.storm.event$event_manager
$fn__2068$fn__2069.invoke(event.clj:25)
at backtype.storm.event$event_manager
$fn__2068.invoke(event.clj:22)
at clojure.lang.AFn.run(AFn.java:24)
at java.lang.Thread.run(Thread.java:662)
2011-12-29 16:15:02 util [INFO] Halting process: ("Error when
processing an event")
报错原因:因为没有先kill topology,所以在启动nimbus时,zookeeper中依然保留了上次运行着的topology的信息。
10 Storm使用JVM参数
nimbus.childopts: "-Xmx1024m"
supervisor.childopts: "-Xmx1024m"
worker.childopts: "-Xmx768m"
如果worker在运行时,需要用指定的JVM参数,那么可以像这样配置:
worker.childopts: "-Dworker=worker -Xmx768m -Xdebug –Xnoagent
-Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,address=8111,suspend=y,server=y "
11 关于spout/bolt的生命周期
12关于storm与spring框架集成问题
进行storm与spring集成时,本来想着一次就能成功,抱着很大的希望可是运行时竟然报了个
java.io.NotSerializableException的异常。该异常要求被依赖注入的jar包实现序列化接口,但那些jar包都是别人开发
的你不能一个一个都改掉源码才能用到项目里。
13 关于java.lang.NoClassDefFoundError: clojure.core.protocols$
14 关于storm连接Mysql
15 关于metaq启动的出现服务拒绝连接的问题
16 关于topology的spout与bolt
前有问到,一个topology中可不可以有多个spout?这个问题貌似很幼稚啊,呵呵。关于这个问题,我是这样考虑的:实际应用中,如果我们每一条应
用都创建一个topology的话,未免也太夸张了。如果是同一个应用,同一个数据来源,但是你想分几种方式对这个数据做处理的话,这时候就应该是建多个
spout了,让这些spout并行去读数据,然后交给订阅这个spout的bolt去处理就行,没必要一种处理方式建一个topology。
17 关于shell脚本编码格式问题
17.1 解决方案(一):
17.2 解决方案(二)
后说明一下,这些问题只是storm应用过程中遇到的一小部分问题,其实还有很多问题是涉及到实际项目的考虑的,比如集群硬件要求,参数配置,日志处理等
等,具体问题具体分析吧,也希望哪些在实际项目中用到storm的大神们,能多多和大家分享你们的实际经验,毕竟实践出真知,任何新技术,只有经过实际应
用和实际检验,分享出来的东西才有说服力。
Storm实战常见的问题的更多相关文章
- Storm 实战:构建大数据实时计算
Storm 实战:构建大数据实时计算(阿里巴巴集团技术丛书,大数据丛书.大型互联网公司大数据实时处理干货分享!来自淘宝一线技术团队的丰富实践,快速掌握Storm技术精髓!) 阿里巴巴集团数据平台事业部 ...
- 转载文档:Storm实战常见问题及解决方案
该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实 ...
- Storm实战集锦
一.Kafka+Storm+HDFS整合实践 本文导读: 前言 Kafka安装配置 Storm安装配置 整合Kafka+Storm 整合Storm+HDFS 整合Kafka+Storm+HDFS 参考 ...
- Storm实战常见问题及解决方案
该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实 ...
- 【原】Storm实战
3.Storm实战 如何新建一个Storm 项目 本文简要概括如何新建一个Storm项目,步骤如下: 1.添加Storm 相关jar添加到类路径上. 2.如果使用多语言特性,将多语言实现的目录加到cl ...
- Storm实战:在云上搭建大规模实时数据流处理系统(Storm+Kafka)
在大数据时代,数据规模变得越来越大.由于数据的增长速度和非结构化的特性,常用的软硬件工具已无法在用户可容忍的时间内对数据进行采集.管理和处理.本文主要介绍如何在阿里云上使用Kafka和Storm搭建大 ...
- 《storm实战-构建大数据实时计算读书笔记》
自己的思考: 1.接收任务到任务的分发和协调 nimbus.supervisor.zookeeper 2.高容错性 各个组件都是无状态的,状态 ...
- storm实战:基于storm,kafka,mysql的实时统计系统
公司对客户开放多个系统,运营人员想要了解客户使用各个系统的情况,在此之前,数据平台团队已经建设好了统一的Kafka消息通道. 为了保证架构能够满足业务可能的扩张后的性能要求,选用storm来处理各个应 ...
- storm实战总结笔记
storm是一款开源的.分布式的.低延迟的.可扩展的.容错的实时计算框架,采用clojure和java的混合编程,总体两者的代码总量是55开的,但clojure语言具有很强的表现力,所以storm的核 ...
随机推荐
- bzoj2276: [Poi2011]Temperature(单调队列/堆)
这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已 单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为 ...
- JS实现的随机乱撞的彩色圆球特效代码
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何使用impdp导入oracle数据库文件
1.首先,安装好oracle数据库. 2.使用sqlplus进入sysdba权限,sqlplus "/as sysdba", 例如: 3.创建用户framework,例如: CRE ...
- Cows POJ - 2481 树状数组
Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can ...
- LoaderManager与CursorLoader用法
一.基本概念 1.LoaderManager LoaderManager用来负责管理与Activity或者Fragment联系起来的一个或多个Loaders对象. 每个Activity或者Fragme ...
- HTML学习基本代码
HTML的代码比较繁琐,在此记下一些基本的东西,以后自己回来看看 <html> <head> <title>我的人生啊</title> <styl ...
- 常见的Java问题
1.什么是java虚拟机?为什么java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被 ...
- 【c#】winform 上传图片
1.拖拽上传图片 1.1.后台代码中修改窗体属性,添加 AllowDrop = true 1.2.给窗体添加拖拽事件,在事件列表找到拖拽 双击即可: 在 DragDrop 生成的方法中添加代码如下: ...
- 洛谷2944 [USACO09MAR]地震损失2Earthquake Damage 2
https://www.luogu.org/problem/show?pid=2944 题目描述 Wisconsin has had an earthquake that has struck Far ...
- [SCOI2009]生日礼物
https://www.luogu.org/problem/show?pid=2564 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x ...