大数据中流storm流读取
Storm流处理数据使用eclipse实现流处理数据
需要处理的数据源
处理后数据源会这样一直读取
1实现这样的效果我们的步骤是
打开eclipse 创建一个maven项目
创建maven项目的步骤前面的步骤已经说过了现在就不在上图了
创建好maven项目后还是打开pom。xml文件点最后一页
我们加入storm1.1.0的依赖包之后eclipse会自己下载的
有同学会问了这个文件内容哪里去找了
https://mvnrepository.com/
打开这个maven网站
搜索storm
选择第一个
点进去后选择1.1.0的版本号当然也可以选择其他版本
复制这里的maven 到pom.xml中即可
现在到了写代码的时刻了
storm的流读取一般会写三个class
LogBolt
LogSpout
Main
这三个类
logSpout 是用来读取数据
LogBolt 是用来读取数据,处理数据
Main 设置集群环节最后的运行
首先是 LogSpout`
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichSpout;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
/**
* @author LYQ
*
*/
public class LogSpout implements IRichSpout {
SpoutOutputCollector collector;
BufferedReader bufferedReader;
String string;
/**
* 重点是open方法和NextTuple;
* */
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
// TODO Auto-generated method stub
/*提升数据范围*/ this.collector=collector;
try {
//使用IO缓冲流缓冲流加载数据
//缓冲流可以使用readlie()
File file = new File("E:\\安抚是\\Text\\src\\main\\java\\stu.txt");
FileReader fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void nextTuple() {
// TODO Auto-generated method stub
// bufferedReader.readLine();
try {
if(( string= bufferedReader.readLine())!=null) {
//数据不为空就可以一直读取数据
// String [] strings= string.split("\t");
//获取到一行数据后使用collector发送
collector.emit(new Values(string,1));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer decclarer) {
// TODO Auto-generated method stub
decclarer.declare(new Fields("subian","num"));
}
@Override
public void ack(Object arg0) {
// TODO Auto-generated method stub
}
@Override
public void activate() {
// TODO Auto-generated method stub
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public void deactivate() {
// TODO Auto-generated method stub
}
@Override
public void fail(Object arg0) {
// TODO Auto-generated method stub
}
@Override
public Map<String, Object> getComponentConfiguration() {
// TODO Auto-generated method stub
return null;
}
}
//这里首先实现IRichSpout 这个接口并实现它的一系列方法
其中需要写的分别是open 和nextTuple以及declareOutputFields方法
open用于读取数据流
。。。。
然后是
LogBolt
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Tuple;
/**
* @author LYQ
*
*/
public class LogBolt implements IRichBolt {
OutputCollector collector;
/***
* 先在prepare中初始化collector;
* */
@Override
public void prepare(Map stormConf, TopologyContext contexr, OutputCollector collector) {
// TODO Auto-generated method stub
this.collector=collector;
}
/**
* execute方法中就是接到Spout数据后,进行具体的数据处理
* */
@Override
public void execute(Tuple input ) {
// TODO Auto-generated method stub
//getString中传入的参数为INT;
String string=input.getString(0);
/*数据拆分*/String[] strings=string.split("\t");
String province=strings[1];
try {
// System.out.println("线程"+Thread.getAllStackTraces());
System.err.println("省份"+ ":"+province);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// String string= input.getString(0);
// String[] strings= string.split("/t");
// String wb= strings[5];
// System.out.println("Web:"+wb);
}
@Override
public void cleanup() {
// TODO Auto-generated method stub
}
@Override
public void declareOutputFields(OutputFieldsDeclarer arg0) {
// TODO Auto-generated method stub
}
@Override
public Map<String, Object> getComponentConfiguration() {
// TODO Auto-generated method stub
return null;
}
}
然后是
Main
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.shade.org.jboss.netty.channel.local.LocalChannel;
import org.apache.storm.topology.TopologyBuilder;
public class Main {
public static void main(String[] args) {
//1.初始化配置信息,
Config config=new Config();
config.setNumWorkers(3);//三个工作的work
//设置好谁是Spout,
//首先初始化一个TopologyBuilder,然后设置Sout和Bolt
TopologyBuilder budiler=new TopologyBuilder();
//绑定Spout
//第一个参数是id,LSpout命名
//第二个new 写自己写的Spout.class
budiler.setSpout("suibian-spout", new LogSpout(),3);
// budiler.setSpout("suibian-spout1", new LogSpout());
//
//绑定Bolt
//为了让Bolt接收指定的spout传过来的数据
budiler.setBolt("sublie-bolt", new LogBolt()).shuffleGrouping("suibian-spout");
//提交 模式有本地 集群
LocalCluster localChannel=new LocalCluster();
//三个参数
localChannel.submitTopology("subian-topylogy", config, budiler.createTopology());
}
}
完成
悦分享,越成长
~~删除线格式~~