详细安装教程可参看厦大林子雨老师著作:http://dblab.xmu.edu.cn/blog/767/
三大计算系统
- hadoop :离线的复杂计算。
- spark:离线的快速计算。
- storm:流式实时计算。
离线复杂计算:批量获取数据、批量传输数据、周期性批量计算数据、数据展示
代表技术:Sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算数据、Hive批量计算数据、zookeeper任务调度。
流式计算:数据实时产生、数据实时传输、数据实时计算、实时展示
代表技术:Flume实时获取数据、Kafka/metaq实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存、持久化存储(mysql)。
离线快速计算:基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合,如pageRank、K-Means等算法(淘宝使用spark)
代表技术:RDD,GraphX 、 SparkSQL、 SparkStreaming 、 MLlib,Spark更适合于迭代运算比较多的ML和DM运算。
1.storm组件:
Nimbus:负责资源分配和任务调度。
Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。通过配置文件当前supervisor上启动多少个worker。
Worker:运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。
Task:worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。
2.storm编程模型
Topology:Storm中运行的一个实时应用程序的名称。(拓扑)
(喷口)Spout:在一个topology中获取源数据流的组件。通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。
(螺栓)Bolt:接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。
Tuple:一次消息传递的基本单元,理解为一组消息就是一个Tuple。
Stream:表示数据的流向。
StreamGrouping:数据分组策略
7种:shuffleGrouping(Random函数),Non Grouping(Random函数),FieldGrouping(Hash取模)、Local or ShuffleGrouping 本地或随机,优先本地。
3.架构
Nimbus:任务分配
Supervisor:接受任务,并启动worker。worker的数量根据端口号来的。
Worker:执行任务的具体组件(其实就是一个JVM),可以执行两种类型的任务,Spout任务或者bolt任务。
Task:Task=线程=executor。 一个Task属于一个Spout或者Bolt并发任务。属于某个组件并发度中一个,本质是一个线程
Zookeeper:保存任务分配的信息、心跳信息、元数据信息。
4.Worker与topology(拓扑)
一个worker只属于一个topology,每个worker中运行的task只能属于这个topology。
反之,一个topology包含多个worker,其实就是这个topology运行在多个worker上。
一个topology要求的worker数量如果不被满足,集群在任务分配时,根据现有的worker先运行topology。
如果当前集群中worker数量为0,那么最新提交的topology将只会被标识active,不会运行,只有当集群有了空闲资源之后,才会被运行。
5.如何指定驱动类中每个组件的并发度数量?如何设置worker数
1.根据上游的数据量来设置spout的并发度
2.根据业务复杂度和execute方法执行时间来设置bolt并发度
3.根据集群可用资源配置,一般情况下70%的资源使用率
4.worker数量理论上根据程序并发度总的task数量均分,实际中反复调整
6.ack-fail机制
1.需要ack-fail时,为每个tuple生成一个messageid,这个messageid用来标识tuple,当该tuple完全被处理,storm框架会调用
spout的ack方法,否则调用fail,消息是否重发,自己处理
2.在spout有并发度的情况下,storm会根据tuple最开始的所属的spout taskid,通知相应的spouttask
3.在流式计算中topology的bolt组件是可以配置多个的,每个环节中,都需要bolt组件显式告诉storm框架,自己对当前tuple处理完成
安装:
wget http://mirrors.tuna.tsinghua.edu.cn/apache/storm/apache-storm-0.9.7/apache-storm-0.9.7.tar.gz
tar -zxvf apache-storm-0.9.7.tar.gz
安装在 /usr/local
conf下storm.yaml 修改配置文件
storm.zookeeper.servers:
- “Master1”
- “Slave1”
- “Slave2”
nimbus.host: “Master”
storm.local.dir: “/usr/local/storm/data” 配置storm存储少量文件的路径
启动:
1.主控节点下:(nohup ./storm nimbus &)?
bin目录下 ./storm nimbus(启动服务),./storm ui(启动管理界面)
2.子节点下:
bin目录下 ./storm supervisor
后台方式运行 ./storm nimbus &
3.如果启动后,supervisor自己退出,应该与Storm.local.dir设定的目录有关。
如果目录不存在的话,启动后会自动退出。我记得当时代码为
Exit 13 bin/storm supervisor
如果关闭再重新启动storm时,有时也会出现这样的情况。
Exit 20 bin/storm supervisor
问题:
1.集群如何启动,任务如何执行
java -server nimubs, supervisor
client—>createTopology(序列化)—>提交jar到nimbuinbox—>nimbus分配任务(task总数/work数)–写到zk
启动worker<—识别自己的任务<–supervisor—>watch—–zk
启动spout/bolt—-taskinfo<—-worker—>zk
1.2.集群架构中各个模块如何启动
nimbus:用户启动
supervisor:用户启动
worker:supervisor启动
task:worker启动
2.集群如何通信
集群架构中各个模块如何通信?外部
拓扑程序中各task如何通信?内部
错误:
org.apache.thrift7.transport.TTransportException: java.net.ConnectException: Connection refused(拒绝连接)
我是因为storm.yaml配置信息加了 # 等于注释掉了。。。注意配置文件