接上篇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
所有已实现的接口:
主要方法:
(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
本篇到这,下一篇会进行Flink的安装与配置
附Hdfs端口解释:
8020端口:
在cd /opt/sxt/hadoop-2.6.5/etc/hadoop/coresite.xml下的配置:
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
8020是namenode节点active状态下的端口号;
9000端口:是fileSystem默认的端口号:
在cd /opt/sxt/hadoop-2.6.5/etc/hadoop/coresite.xml下的配置:
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000</value>
</property>
50070是namenode主节点的端口号
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
50090端口号:namenode的secondarynamenode的端口号:
#<property>
# <name>dfs.namenode.secondary.http-address</name>
# <value>node02:50090</value>
#</property>
9083端口号:hive数据仓库元数据metastore的端口号
当在配置hive客户端的时候,需要在hive-site.xml文件下加上hive的端口号和服务端的信息(当然在配置服务端的时候,因为表示建在HDFS上Linux系统的mys下ql中的,需要配置mysql的信息)
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.57.5:9083</value>
</property>
2181:zookeeper的端口号:
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
6379:Redis的端口号
60010:HBASE的端口号
8485:journalnode默认的端口号
9092:kafka的端口号
41414:flume监控的端口
2181:zk端口