在做这个实验之前,查看了官方文档的demo以及【Gpwner的博客】,在他的博客里找到了很多灵感,感谢前人的无私奉献。
利用storm从hdfs读取数据,这个做法很少,就连官网给出的demo也少的可怜,众人拾柴火焰高,今天小厨也来添一把柴火,po出自己写的一个小demo,要读的数据正是上一篇博文《storm整合hdfs—将数据写到hdfs》产生的手机型号+日期后缀的数据,此次的业务逻辑就是利用storm去读/phoneStorm下的文件,抽取出手机型号名称,再使用countBolt去统计每个型号出现的次数。文章末尾会列出一些出现的问题。环境已经Maven添加的依赖都不变,如上篇博文所述。
会使用到的hdfs参数:
topologyName | 指定本次topo的名称 |
hdfsUri | 指定HDFS的 URI以及端口号 |
fileFormat | 指定文件格式:“text” or “seq” |
sourceDir | 指定需要读取文件的HDFS目录 |
archiveDir | 当文件完全处理完之后会存入此目录 |
badDir | 当文件解析错误是 存入此目录 |
整个代码1:编写程序入口以及Spout 逻辑
package com.readhdfs;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.generated.Nimbus;
import org.apache.storm.generated.StormTopology;
import org.apache.storm.hdfs.spout.HdfsSpout;
import org.apache.storm.hdfs.spout.TextFileReader;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.tuple.Fields;
import java.util.HashMap;
import java.util.Map;
/**
* 读取hdfs文件,hdfs的spout端和main方法均在此类
*/
public class HdfsSubmitter {
public static void main(String[] args) throws Exception{
/**
* 定义hdfs spout组件的相关配置
*/
//接收从cli输入的四个值