Centos 下Storm集群的搭建及Java客户端环境

本文详细介绍了如何在CentOS环境下搭建Storm集群,并通过Java客户端实现单词计数应用,包括配置、启动流程、日志监控及拓扑结构实现。

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

   Centos 下Storm集群的搭建

    zookeeper集群搭建在hadoop0,hadoop1,hadoop2机子上。hadoop0 为nimbus主节点,hadoop1,hadoop2为supervisor从节点。
1.官网下载storm包 apache-storm-0.9.3.tar.gz   在/usr/softinstall/  目录下。
2.解压并且重命名为storm   
tar -zxvf   apache-storm-0.9.3.tar.gz
mv   apache-storm-0.9.3      storm
3.在/etc/profile 中设置环境变量。
4. 修改配置文件usr/softinstall/storm/conf/storm.yarml,修改为如下:
storm.zookeeper.servers:
     - "hadoop0"
     - "hadoop1"
     - "hadoop2"
 nimbus.host: "hadoop0"
 storm.local.dir: "/usr/softinstall/storm/workdir"
 supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

########### These MUST be filled in for a storm configuration
 storm.zookeeper.servers:
     - "hadoop0"
     - "hadoop1"
     - "hadoop2"
 nimbus.host: "hadoop0"
 storm.local.dir: "/usr/softinstall/storm/workdir"
 supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
# ##### These may optionally be filled in:
#    
## List of custom serializations
# topology.kryo.register:
#     - org.mycompany.MyType
#     - org.mycompany.MyType2: org.mycompany.MyType2Serializer
#
## List of custom kryo decorators
# topology.kryo.decorators:
#     - org.mycompany.MyDecorator
#
## Locations of the drpc servers
# drpc.servers:
#     - "server1"
#     - "server2"

## Metrics Consumers
# topology.metrics.consumer.register:
#   - class: "backtype.storm.metric.LoggingMetricsConsumer"
#     parallelism.hint: 1
#   - class: "org.mycompany.MyMetricsConsumer"
#     parallelism.hint: 1
#     argument:
#       - endpoint: "metrics-collector.mycompany.org"

5.拷贝到各个节点。
scp -r strom   hadoop1:/usr/softinstall/
scp -r strom   hadoop2:/usr/softinstall/
6.启动zookeeper集群。在hadoop0,hadoop1,hadoop2节点zookeeper下执行命令
bin/zkServer.sh  start
7. 主控节点上启动nimbus:
storm nimbus >/dev/null 2>&1 &
在Storm各个工作节点上运行:
  
storm supervisor >/dev/null 2>&1 &

在Storm主控节点上启动ui:

$ storm ui >/dev/null 2>&1 &
启动后可以通过http://{nimbus host}:8080观察集群的worker资源使用情况、Topologies的运行状态等信息
  
8.观察日志消息  ,启动log后台程序, 并放到后台执行
nohup bin/storm logviewer >/dev/null 2>&1 &
启动后可以通过http://{host}:8000观察日志信息。(nimbus节点可以不用启动logviewer进程,因为logviewer进程主要是为了方便查看任务的执行日志,这些执行日志都在supervisor节点上。)




                                                      storm的 Ja va客户端环境搭建
    统计单词个数
1.建立maven项目,加入storm的jar包
<dependency>
 <groupId>org.apache.storm</groupId>
 <artifactId>storm-core</artifactId>
 <version>0.9.3</version>
</dependency>
2.建立 SimpleDataSourceSpout 读取数据发送
package com.east.storm.example;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.commons.io.FileUtils;

import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;

public class SimpleDataSourceSpout extends BaseRichSpout {
    private SpoutOutputCollector collector;
    private static String[] info = new String[]{
                "hello    world    are    you    ok",
                "let    go    to    you    home",
                "we    are frend    yes    or    no",
                "big    china",
                "I    LOVE    YOU",
                "DO    YOU    LOVE    ME",
                "I    LOVE    china",
                "YOU LOVE    china",
                "WE    LOVE    china",
               };

    Random random=new Random();
    @Override
    public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
        this.collector = collector;
    }

    @Override
    public void nextTuple() {

         try {
                String msg = info[random.nextInt(9)];
                // 调用发射方法
                collector.emit(new Values(msg));
                // 模拟等待2000ms
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("line"));
    }
}

3.建立SimpleSplitBolt 处理spout发送过来的行读取每一个单词在发送下一个bolt。
package com.east.storm.example;

import java.util.Map;

import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;

public class SimpleSplitBolt extends BaseRichBolt {

    private OutputCollector collector;

    @Override
    public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
        this.collector = collector;
    }

    @Override
    public void execute(Tuple input) {
        String value = input.getStringByField("line");
        String[] splits = value.split("\t");
        for (String word : splits) {
            this.collector.emit(new Values(word));
        }
    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("word"));
    }
}

4.建立SimpleSumBolt 类,统计单词个数。
package com.east.storm.example;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;

public class SimpleSumBolt extends BaseRichBolt {

    private OutputCollector collector;

    @Override
    public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
        this.collector = collector;
    }

    HashMap<String, Integer> hashMap = new HashMap<String, Integer>();

    @Override
    public void execute(Tuple input) {
        String word = input.getStringByField("word");
        Integer value = hashMap.get(word);
        if (value == null) {
            value = 0;
        }
        value++;
        hashMap.put(word, value);
        System.out.println("========================================");
        for (Entry<String, Integer> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey() + "===" + entry.getValue());
        }
    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        // TODO Auto-generated method stub

    }

}

5.建立Topology,连接spout和bolt,入口函数。
package com.east.storm.example;

import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.TopologyBuilder;

public class SimpleWordCountTopology {
    public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException  {

        TopologyBuilder topologyBuilder = new TopologyBuilder();
        SimpleDataSourceSpout dataSourceSpout = new SimpleDataSourceSpout();
        SimpleSplitBolt splitBolt = new SimpleSplitBolt();
        SimpleSumBolt sumBolt = new SimpleSumBolt();

        topologyBuilder.setSpout("a1", dataSourceSpout);
        topologyBuilder.setBolt("b1", splitBolt).shuffleGrouping("a1");
        topologyBuilder.setBolt("b2", sumBolt).shuffleGrouping("b1");
        // StormTopology topologybean = topologyBuilder.createTopology();
        Config config = new Config();
        config.setDebug(true);
        if (args != null && args.length > 0) {
            config.setNumWorkers(1);
            StormSubmitter.submitTopology(args[0], config, topologyBuilder.createTopology());
        } else {
            // 这里是本地模式下运行的启动代码。
            config.setMaxTaskParallelism(1);
            LocalCluster cluster = new LocalCluster();
            cluster.submitTopology("topology_name", config, topologyBuilder.createTopology());
        }
    }
}

                                   storm部署
1.把写好的Java文件打成jar文件上传 Nimbus机器上。
2.执行命令启动
 storm jar jar文件设置目录 Java文件main类全名 参数1 参数2 参数3
 storm jar allmycode.jar org.me.MyTopology arg1 arg2 arg3
 在jar文件的当前目录下启动命令。

3.参考连接:
内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值