storm与kafka进行集成写入HDFS

接上篇storm与kafka进行集成,本篇将storm处理好的数据持久化到hdfs中,主要思路是将最后一个Bolt改为hdfsBolt,将kafka的输出进行分词 统计,将最后的统计结果提交到hdfsBolt中,保存到hdfs中。

(1)HDFSBolt简介

HdfsBolt类的集成层次关系:

  • java.lang.Object继承
  • org.apache.storm.topology.base.BaseComponent
  • org.apache.storm.topology.base.BaseRichBolt
  • org.apache.storm.hdfs.bolt.AbstractHdfsBolt
  • org.apache.storm.hdfs.bolt.HdfsBolt

所有已实现的接口:

  • Serializable,IBolt,IComponent,IRichBolt

主要方法:

storm与kafka进行集成写入HDFS_第1张图片

(2)HdfsBolt具体配置

//    	定义字段定界符,你可以使用换行符\n或者制表符\t;,就是如何拼接的,这里的拼接是我这里的 2019-07-18_09-38-29 : 63 : (UserController.java:29)
        // use "|" instead of "," for field delimiter
        RecordFormat format = new DelimitedRecordFormat()
                .withFieldDelimiter(" : ");
        
//        定义每次写入的tuple的数量;
        // sync the filesystem after every 1k tuples
        SyncPolicy syncPolicy = new CountSyncPolicy(1000);

//        定义写入的hdfs文件的轮转策略,你可以以时间轮转(TimedRotationPolicy)、大小轮转(FileSizeRotationPolicy)、不轮转(NoRotationPolicy);
        // rotate files 
        FileRotationPolicy rotationPolicy = new TimedRotationPolicy(1.0f, TimeUnit.MINUTES);

//        定义写入文件的路径(withPath)和文件名的前后缀(withPrefix、withExtension);
        FileNameFormat fileNameFormat = new DefaultFileNameFormat()
                .withPath("/storm/").withPrefix("app_").withExtension(".log");

//        定义hdfs的地址。
        HdfsBolt hdfsBolt = new HdfsBolt()
                .withFsUrl("hdfs://10.1.18.201:9000/")
                .withFileNameFormat(fileNameFormat)
                .withRecordFormat(format)
                .withRotationPolicy(rotationPolicy)
                .withSyncPolicy(syncPolicy);

拓扑配置:

        TopologyBuilder builder = new TopologyBuilder();

        //配置zk连接
        String zkConnString = "master:2181";

        BrokerHosts hosts = new ZkHosts(zkConnString);
        //Spout配置
        SpoutConfig spoutConfig = new SpoutConfig(hosts, "testtopics", "", "1");
        spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());
        KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);

        builder.setSpout("kafkaspout", kafkaSpout).setNumTasks(2);
        
        builder.setBolt("mybolt1",new MySplitBolt(),2).shuffleGrouping("kafkaspout");
        
        builder.setBolt("mybolt2",new MyCountBolt(),2).fieldsGrouping("mybolt1",new Fields("word"));

        builder.setBolt("hdfs-bolt", hdfsBolt, 2).fieldsGrouping("mybolt2", new Fields("minute"));

(3)pom.xml就不贴上了,在上一篇文章中是有的。

(4)启动

开启ZK(集群中都要开) kafka(集群中都要开) storm(一个nimbus 其余为supervisor) 开启hdfs

启动一个生产者:

bin/kafka-console-producer.sh --broker-list master:9092 --topic testtopics


启动Storm jar
 

storm jar software/storms-0.0.1-SNAPSHOT.jar com.storm.storm2.WCApp

最后查看hdfs中是否有结果了,OK

storm与kafka进行集成写入HDFS_第2张图片

本篇到这,下一篇会进行Flink的安装与配置

附Hdfs端口解释:

8020端口:

在cd /opt/sxt/hadoop-2.6.5/etc/hadoop/coresite.xml下的配置:


  dfs.namenode.rpc-address.mycluster.nn1
  node01:8020

8020是namenode节点active状态下的端口号;

9000端口:是fileSystem默认的端口号:

在cd /opt/sxt/hadoop-2.6.5/etc/hadoop/coresite.xml下的配置:


        fs.defaultFS
        hdfs://node01:9000

50070是namenode主节点的端口号


  dfs.namenode.http-address.mycluster.nn1
  node01:50070

50090端口号:namenode的secondarynamenode的端口号:
#
#        dfs.namenode.secondary.http-address
#        node02:50090
#

9083端口号:hive数据仓库元数据metastore的端口号

当在配置hive客户端的时候,需要在hive-site.xml文件下加上hive的端口号和服务端的信息(当然在配置服务端的时候,因为表示建在HDFS上Linux系统的mys下ql中的,需要配置mysql的信息)
  
  hive.metastore.uris  
  thrift://192.168.57.5:9083  
  

2181:zookeeper的端口号:


   ha.zookeeper.quorum
   node02:2181,node03:2181,node04:2181
 

6379:Redis的端口号

60010:HBASE的端口号

8485:journalnode默认的端口号

9092:kafka的端口号

41414:flume监控的端口

2181:zk端口

你可能感兴趣的:(大数据,大数据进阶之路)