18节、sotrm学习 (Storm集群部署及单词技术)

本文详细介绍Storm集群的部署流程,包括环境准备、配置、分发、启动等步骤,同时覆盖了常用操作命令、进程日志查看及单词计数案例解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、集群部署的基本流程
    集群部署的流程:下载安装包、解压安装包、修改配置文件、分发安装包、启动集群
    注意:
        所有的集群上都需要配置hosts
        vi  /etc/hosts
        192.168.239.128 storm01 zk01 hadoop01
        192.168.239.129 storm02 zk02 hadoop02
        192.168.239.130 storm03 zk03 hadoop03

2、集群部署的基础环境准备
    安装前的准备工作(zk集群已经部署完毕)
    1、关闭防火墙 
           chkconfig iptables off  && setenforce 0
    2、创建用户
           groupadd realtime && useradd realtime && usermod -a -G realtime realtime
    3、创建工作目录并赋权
          mkdir /export
          mkdir /export/servers
          chmod 755 -R /export
    4、切换到realtime用户下
         su realtime
3、Storm集群部署
    3.1、下载安装包
        wget    http://124.202.164.6/files/1139000006794ECA/apache.fayea.com/storm/apache-storm-0.9.5/apache-storm- 0.9.5.tar.gz

    3.2、解压安装包
        tar -zxvf apache-storm-0.9.5.tar.gz -C /export/servers/
        cd /export/servers/
        ln -s apache-storm-0.9.5 storm
    3.3、修改配置文件
        mv /export/servers/storm/conf/storm.yaml /export/servers/storm/conf/storm.yaml.bak
        vi /export/servers/storm/conf/storm.yaml
        输入以下内容:      

storm.zookeeper.servers:
     - "master"
     - "test2"
     - "test3"
     - "test4"
#指定storm集群中的nimbus节点所在的服务器
nimbus.host: "master"

#指定nimbus启动jvm最大可用内存大小
nimbus.childopts: "-Xmx1024m"
#指定supervisor启动jvm最大可用内存大小
supervisor.childopts: "Xmx1024m"
#指定supervisor节点上,每个worker启动JVM最大可用内存大小
worker.childopts: "-Xmx768m"
#指定worker启动jvm最大可用内存大小,ui服务一般与nimbus同在一个节点上
ui.childopts: "-Xmx768m"
#指定supervisor节点上,启动worker时对应的端口号,每个端口对应槽,每个槽位对应一个worker

supervisor.slots.prots:
    - 6700
    - 6701
    - 6702
    - 6703

    3.4、分发安装包
        scp -r /export/servers/apache-storm-0.9.5 storm02:/export/servers
        然后分别在各机器上创建软连接
        cd /export/servers/
        ln -s apache-storm-0.9.5 storm

  3.5、环境变量配置 

export STORM_HOME=/home/hadoop/apps/storm
export PATH=$STORM_HOME/bin:$PATH

     3.6、启动集群  
        1、在nimbus.host所属的机器上启动 nimbus服务
        cd /export/servers/storm/bin/
        nohup ./storm nimbus &
        2、在nimbus.host所属的机器上启动ui服务
        cd /export/servers/storm/bin/
        nohup ./storm ui &
        3、在其它个点击上启动supervisor服务
        cd /export/servers/storm/bin/
        nohup ./storm supervisor &  

    3.7、查看集群
        访问nimbus.host:/8080,即可看到storm的ui界面。
        
4、Storm常用操作命令
    有许多简单且有用的命令可以用来管理拓扑,它们可以提交、杀死、禁用、再平衡拓扑。
    提交任务命令格式:storm jar 【jar路径】 【拓扑包名.拓扑类名】 【拓扑名称】
    bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount
    杀死任务命令格式:storm kill 【拓扑名称】 -w 10(执行kill命令时可以通过-w [等待秒数]指定拓扑停用以后的等待时间)
    storm kill topology-name -w 10
    停用任务命令格式:storm deactivte  【拓扑名称】
    storm deactivte topology-name
    我们能够挂起或停用运行中的拓扑。当停用拓扑时,所有已分发的元组都会得到处理,但是spouts的nextTuple方法不会被调用。销毁一个拓扑,可以使用kill命令。它会以一种安全的方式销毁一个拓扑,首先停用拓扑,在等待拓扑消息的时间段内允许拓扑完成当前的数据流。
    启用任务命令格式:storm activate【拓扑名称】
            storm activate topology-name
    重新部署任务命令格式:storm rebalance  【拓扑名称】
            storm rebalance topology-name
            再平衡使你重分配集群任务。这是个很强大的命令。比如,你向一个运行中的集群增加了节点。再平衡命令将会停用拓扑,然后在相应超时时间之后重分配工人,并重启拓扑。
5、Storm集群的进程及日志熟悉
    5.1、部署成功之后,启动storm集群。
        依次启动集群的各种角色
    5.2、查看nimbus的日志信息
        在nimbus的服务器上
    cd /export/servers/storm/logs
        tail -100f /export/servers/storm/logs/nimbus.log
    5.3、查看ui运行日志信息
        在ui的服务器上,一般和nimbus一个服务器
    cd /export/servers/storm/logs
        tail -100f /export/servers/storm/logs/ui.log
    5.4、查看supervisor运行日志信息
        在supervisor服务上
        cd /export/servers/storm/logs
        tail -100f /export/servers/storm/logs/supervisor.log
    5.5、查看supervisor上worker运行日志信息
        在supervisor服务上
        cd /export/servers/storm/logs
        tail -100f /export/servers/storm/logs/worker-6702.log

       

        (该worker正在运行wordcount程序)

6、Storm源码下载及目录熟悉
    6.1、在Storm官方网站上寻找源码地址
        http://storm.apache.org/downloads.html

    6.2、点击文字标签进入github
        点击Apache/storm文字标签,进入github
                https://github.com/apache/storm
    6.3、拷贝storm源码地址
        在网页右侧,拷贝storm源码地址
        
    6.4、使用Subversion客户端下载

       

        https://github.com/apache/storm/tags/v0.9.5
    6.5、Storm源码目录分析(重要)

       

        扩展包中的三个项目,使storm能与hbase、hdfs、kafka交互

      
7、Storm单词技术案例(重点掌握)
    7.1、功能说明
        设计一个topology,来实现对文档里面的单词出现的频率进行统计。
        整个topology分为三个部分:
        RandomSentenceSpout:数据源,在已知的英文句子中,随机发送一条句子出去。
        SplitSentenceBolt:负责将单行文本记录(句子)切分成单词
        WordCountBolt:负责对单词的频率进行累加
    7.2、项目主要流程

        

    7.3、RandomSentenceSpout的实现及生命周期  

        

    7.4、SplitSentenceBolt的实现及生命周期

      
    7.5、WordCountBolt的实现及生命周期

    7.6、Stream Grouping详解
        Storm里面有7种类型的stream grouping
        7.6.1、Shuffle Grouping: 随机分组, 随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。
        7.6.2、Fields Grouping:按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task,而不同的userid则会被分配到不同的bolts里的task。
        7.6.3、All Grouping:广播发送,对于每一个tuple,所有的bolts都会收到。
        7.6.4、Global Grouping:全局分组, 这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
        7.6.5、Non Grouping:不分组,这stream grouping个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
        7.6.6、Direct Grouping: 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。
        7.6.7、Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。

 8、Storm架构和编程模型总结

1、编程模型
    DataSource:外部数据源
    Spout:接受外部数据源的组件,将外部数据源转化成Storm内部的数据,以Tuple为基本的传输单元下发给Bolt
    Bolt:接受Spout发送的数据,或上游的bolt的发送的数据。根据业务逻辑进行处理。发送给下一个Bolt或者是存储到某种介质上。介质可以是Redis可以是mysql,或者其他。
    Tuple:Storm内部中数据传输的基本单元,里面封装了一个List对象,用来保存数据。
    StreamGrouping:数据分组策略
        7种:shuffleGrouping(Random函数),Non Grouping(Random函数),FieldGrouping(Hash取模)、Local or ShuffleGrouping 本地或随机,优先本地。
        
2、并发度
    用户指定的一个任务,可以被多个线程执行,并发度的数量等于线程的数量。一个任务的多个线程,会被运行在多个Worker(JVM)上,有一种类似于平均算法的负载均衡策略。尽可能减少网络IO,和Hadoop中的MapReduce中的本地计算的道理一样。    
    
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数量来均分,在实际的业务场景中,需要反复调整。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值