Structured Streaming

概述
StructedStreaming是基于Spark Sql的流式处理框架,支持datafram和DataSet数据类型。对于开发者,在使用strucedStreaming时,不需要去考虑使用的是流式计算还是离线计算,只需要使用相同的方式进行处理。

StructedStreaming支持了连续流模型,类似于Flink的实时流,而不是以前的micro batch,但是在使用的时候仍然有限制,大部分情况还是在应用小批量模式。

spark2.2之后,StructedStreaming已经被标注位稳定版,意味着spark的流式计算已经被StructedStreaming所占据。

Spark读取本地文件,写入到HBase中,Kafka

package com.zorel.sparktohbase;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.ForeachWriter;

import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.streaming.StreamingQuery;
import org.apache.spark.sql.streaming.StreamingQueryException;
import org.apache.spark.sql.streaming.Trigger;
import org.apache.spark.sql.types.StructType;
import org.json.JSONObject;

import static org.apache.spark.sql.types.DataTypes.StringType;

import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.spark.sql.AnalysisException;

import static org.apache.spark.sql.types.DataTypes.*;
import com.google.gson.JsonObject;
import com.zorel.interchange.crud.CrudHBase;




public class SparkRealize implements Functions{
	
	static private SparkSession ss = null;
	static{
		System.setProperty("HADOOP_USER_NAME","root");
		ss = SparkUtils.getSparkSession("Stream");
		
	}

	public void sparktohbase() {
		// TODO Auto-generated method stub
		//File数据源,必须指定schema
		StructType scheam = new StructType().add("event_time", StringType)
				.add("flow_id", LongType)
				.add("event_unixtime", TimestampType)
				.add("in_iface", StringType)
				.add("event_type", StringType)
				.add("src_ip", StringType)
				.add("src_port", IntegerType)
				.add("dest_ip", StringType)
				.add("dest_port", StringType)
				.add("proto", StringType)
				.add("tx_id", IntegerType)
				.add("alert", new StructType()
						.add("action", StringType)
						.add("gid", IntegerType)
						.add("qr_id", StringType)
						.add("signature_id", LongType)
						.add("rev", IntegerType)
						.add("signature", StringType)
						.add("category", StringType)
						.add("severity", IntegerType)
						.add("tx_id", IntegerType)
						.add("cm_id", StringType))
				.add("http", new StructType()
						.add("hostname", StringType)
						.add("url", StringType)
						.add("http_user_agent", StringType)
						.add("http_content_type", StringType)
						.add("http_method", StringType)
						.add("protocol", StringType)
						.add("status", IntegerType)
						.add("length", IntegerType)
						.add("http_request_headers", StringType)
						.add("http_request_headers_len", IntegerType)
						.add("http_response_headers", StringType)
						.add("http_response_headers_len", IntegerType)
						)
				.add("fileinfo", new StructType().add("fstorepath", StringType))
				.add("src_country", StringType)
				.add("src_city", StringType)
				.add("src_ip_val", LongType)
				.add("dest_ip_val", LongType)
				.add("ip_type", IntegerType)
				.add("clusterid", StringType);
		//Dataset<org.apache.spark.sql.Row> jsons = ss.readStream().schema(scheam).format("json").load("C:\\java\\file");
		Dataset<org.apache.spark.sql.Row> jsons = ss.read().format("json").load("file:///usr/test");
		try {
			jsons.createOrReplaceGlobalTempView("Temp");
			Dataset<org.apache.spark.sql.Row> sql = ss.sql("select * from global_temp.Temp where event_type = 'alert' ");
			//sql.show();
		    //.foreach(new HBaseSink())
			//.foreachBatch()
		    //.format("console")
		    //.outputMode("append")
		    //.start();
			//foreachQuery.awaitTermination();
			List<String> str = sql.toJSON().collectAsList();
			List list = new ArrayList<JSONObject>();
			str.forEach(elem->list.add(new JSONObject(elem)));
			CrudHBase cj = new CrudHBase();
			cj.addBatch("eve_http",	list);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	public void fileSparSqlToConsole() {
		// TODO Auto-generated method stub
		Dataset<org.apache.spark.sql.Row> jsons = ss.read().format("json").load("C:\\java\\file");
		jsons.createOrReplaceGlobalTempView("Temp");
		Dataset<org.apache.spark.sql.Row> sql = ss.sql("select * from global_temp.Temp where event_type = 'alert' ");
		sql.show();
		List<String> str = sql.toJSON().collectAsList();
		str.forEach(elem->System.out.println(elem));
		ss.close();
	}


	@Override
	public void fileSparkSqlToHbase() {
		// TODO Auto-generated method stub
		Dataset<org.apache.spark.sql.Row> jsons = ss.read().format("json").load("file:///opt/test");
		jsons.createOrReplaceGlobalTempView("Temp");
		Dataset<org.apache.spark.sql.Row> sql = ss.sql("select * from global_temp.Temp where event_type = 'alert' ");
		List<String> str = sql.toJSON().collectAsList();
		List list = new ArrayList<JSONObject>();
		str.forEach(elem->list.add(new JSONObject(elem)));
		CrudHBase cj = new CrudHBase();
		cj.addBatch("eve_http",	list);
	}

	@Override
	public void fileSparkSqlToClickhouse() {
		// TODO Auto-generated method stub
		Dataset<org.apache.spark.sql.Row> jsons = ss.read().format("json").load("C:\\java\\file");
		jsons.createOrReplaceGlobalTempView("Temp");
		Dataset<org.apache.spark.sql.Row> sql = ss.sql("select * from global_temp.Temp where event_type = 'alert' ");
		List<String> str = sql.toJSON().collectAsList();
		List list = new ArrayList<JSONObject>();
		str.forEach(elem->list.add(new JSONObject(elem)));
		//CrudClickhouse cj = new CrudClickhouse();
		//cj.addBatch("eve_http",	list);
	}

	@Override
	public void fileSparkStreamToConsole() {
		// TODO Auto-generated method stub
		StructType scheam = new StructType().add("event_time", StringType)
				.add("flow_id", LongType)
				.add("event_unixtime", TimestampType)
				.add("in_iface", StringType)
				.add("event_type", StringType)
				.add("src_ip", StringType)
				.add("src_port", IntegerType)
				.add("dest_ip", StringType)
				.add("dest_port", StringType)
				.add("proto", StringType)
				.add("tx_id", IntegerType)
				.add("alert", new StructType()
						.add("action", StringType)
						.add("gid", IntegerType)
						.add("qr_id", StringType)
						.add("signature_id", LongType)
						.add("rev", IntegerType)
						.add("signature", StringType)
						.add("category", StringType)
						.add("severity", IntegerType)
						.add("tx_id", IntegerType)
						.add("cm_id", StringType))
				.add("http", new StructType()
						.add("hostname", StringType)
						.add("url", StringType)
						.add("http_user_agent", StringType)
						.add("http_content_type", StringType)
						.add("http_method", StringType)
						.add("protocol", StringType)
						.add("status", IntegerType)
						.add("length", IntegerType)
						.add("http_request_headers", StringType)
						.add("http_request_headers_len", IntegerType)
						.add("http_response_headers", StringType)
						.add("http_response_headers_len", IntegerType)
						)
				.add("fileinfo", new StructType().add("fstorepath", StringType))
				.add("src_country", StringType)
				.add("src_city", StringType)
				.add("src_ip_val", LongType)
				.add("dest_ip_val", LongType)
				.add("ip_type", IntegerType)
				.add("clusterid", StringType);
		Dataset<org.apache.spark.sql.Row> jsons = ss.readStream().schema(scheam).format("json").load("file:///usr/test");
		try {
			jsons.createOrReplaceGlobalTempView("Temp");
			Dataset<org.apache.spark.sql.Row> sql = ss.sql("select * from global_temp.Temp where event_type = 'alert' ");
			sql.writeStream()
		    //.foreach(new HBaseSink())
			.foreachBatch((a, b)->{
				List<String> list = a.toJSON().collectAsList(); 
				List arr = new ArrayList<JSONObject>();
				list.forEach(elem->arr.add(new JSONObject(elem)));
			})
		    .format("console")
		    .start()
		    .awaitTermination();
	}catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}
	@Override
	public void fileSparkStreamToHbase() {
		// TODO Auto-generated method stub
		StructType scheam = new StructType().add("event_time", StringType)
				.add("flow_id", LongType)
				.add("event_unixtime", TimestampType)
				.add("in_iface", StringType)
				.add("event_type", StringType)
				.add("src_ip", StringType)
				.add("src_port", IntegerType)
				.add("dest_ip", StringType)
				.add("dest_port", StringType)
				.add("proto", StringType)
				.add("tx_id", IntegerType)
				.add("alert", new StructType()
						.add("action", StringType)
						.add("gid", IntegerType)
						.add("qr_id", StringType)
						.add("signature_id", LongType)
						.add("rev", IntegerType)
						.add("signature", StringType)
						.add("category", StringType)
						.add("severity", IntegerType)
						.add("tx_id", IntegerType)
						.add("cm_id", StringType))
				.add("http", new StructType()
						.add("hostname", StringType)
						.add("url", StringType)
						.add("http_user_agent", StringType)
						.add("http_content_type", StringType)
						.add("http_method", StringType)
						.add("protocol", StringType)
						.add("status", IntegerType)
						.add("length", IntegerType)
						.add("http_request_headers", StringType)
						.add("http_request_headers_len", IntegerType)
						.add("http_response_headers", StringType)
						.add("http_response_headers_len", IntegerType)
						)
				.add("fileinfo", new StructType().add("fstorepath", StringType))
				.add("src_country", StringType)
				.add("src_city", StringType)
				.add("src_ip_val", LongType)
				.add("dest_ip_val", LongType)
				.add("ip_type", IntegerType)
				.add("clusterid", StringType);
		Dataset<org.apache.spark.sql.Row> jsons = ss.readStream().schema(scheam).format("json").load("file:///opt/test");
		try {
			jsons.createOrReplaceGlobalTempView("Temp");
			Dataset<org.apache.spark.sql.Row> sql = ss.sql("select * from global_temp.Temp where event_type = 'alert' ");
			sql.writeStream()
		    //.foreach(new HBaseSink())
			.foreachBatch((a, b)->{
				List<String> list = a.toJSON().collectAsList(); 
				List arr = new ArrayList<JSONObject>();
				list.forEach(elem->arr.add(new JSONObject(elem)));
				CrudHBase ch = new CrudHBase();
				arr.forEach(elem->System.out.println(elem));
				
				ch.addBatch("eve_http", arr);
			})
		    //.format("console")
		    .outputMode("append")
		    .start()
			.awaitTermination();
	}catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}

	@Override
	public void fileSparkStreamToClickhouse()  {
		// TODO Auto-generated method stub
		StructType scheam = new StructType().add("event_time", StringType)
				.add("flow_id", LongType)
				.add("event_unixtime", TimestampType)
				.add("in_iface", StringType)
				.add("event_type", StringType)
				.add("src_ip", StringType)
				.add("src_port", IntegerType)
				.add("dest_ip", StringType)
				.add("dest_port", StringType)
				.add("proto", StringType)
				.add("tx_id", IntegerType)
				.add("alert", new StructType()
						.add("action", StringType)
						.add("gid", IntegerType)
						.add("qr_id", StringType)
						.add("signature_id", LongType)
						.add("rev", IntegerType)
						.add("signature", StringType)
						.add("category", StringType)
						.add("severity", IntegerType)
						.add("tx_id", IntegerType)
						.add("cm_id", StringType))
				.add("http", new StructType()
						.add("hostname", StringType)
						.add("url", StringType)
						.add("http_user_agent", StringType)
						.add("http_content_type", StringType)
						.add("http_method", StringType)
						.add("protocol", StringType)
						.add("status", IntegerType)
						.add("length", IntegerType)
						.add("http_request_headers", StringType)
						.add("http_request_headers_len", IntegerType)
						.add("http_response_headers", StringType)
						.add("http_response_headers_len", IntegerType)
						)
				.add("fileinfo", new StructType().add("fstorepath", StringType))
				.add("src_country", StringType)
				.add("src_city", StringType)
				.add("src_ip_val", LongType)
				.add("dest_ip_val", LongType)
				.add("ip_type", IntegerType)
				.add("clusterid", StringType);
		Dataset<org.apache.spark.sql.Row> jsons = ss.readStream().schema(scheam).format("json").load("C:\\java\\file");
		try {
			jsons.createOrReplaceGlobalTempView("Temp");
			Dataset<org.apache.spark.sql.Row> sql = ss.sql("select * from global_temp.Temp where event_type = 'alert' ");
			sql.writeStream()
		    //.foreach(new HBaseSink())
			.foreachBatch((a, b)->{
				List<String> list = a.toJSON().collectAsList(); 
				List arr = new ArrayList<JSONObject>();
				list.forEach(elem->arr.add(new JSONObject(elem)));
			//	CrudClickhouse cli = new CrudClickhouse();
				//cli.addBatch("", arr);
			})
		    //.format("console")
		    .outputMode("append")
		    .start()
			.awaitTermination();
	}catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}
	@Override
	public void kafkaSparkStreamToClickhouse() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void kafkaSparkStreamToHbase() {
		// TODO Auto-generated method stub
		SparkSession session = SparkUtils.getSparkSession("spark");
		Dataset<org.apache.spark.sql.Row> ds = session.readStream()
		.format("kafka")
		.option("kafka.bootstrap.servers", "192.168.10.31:9092")
		.option("subscribe", "topic0")
		//.option("failOnDataLoss", false)
		.option("startingOffsets", "latest")
		.load();
		Dataset<org.apache.spark.sql.Row> res = ds.selectExpr("CAST(value AS string)");
		String str = null;
		try {
			res.writeStream()
			.queryName("query")
			.option("checkpointLocation", "file:///usr/checkpoint")
			//.option("checkpointLocation", "C://checkpoint")
			.foreachBatch((a, b)->{
				//a表示存取数据的DataSet,b表示BatchId:Long
				List<String> list = a.toJSON().collectAsList();
				list.forEach(elem->System.out.println(elem));
				List<String> mid = new ArrayList();
				list.forEach(elem->{
					String s1 = elem.replaceAll("\\\\", "");
					String s2 = s1.substring(10);
					String s3 = s2.substring(0, s2.length()-1);
					mid.add(s3);
				});
				mid.forEach(elem->System.out.println(elem));
				List<JSONObject> result = new ArrayList();
				mid.forEach(elem->{
					JSONObject json = new JSONObject(elem);
					if(json.get("event_type").equals("alert"))
					result.add(new JSONObject(elem));
				});
				//result.forEach(elem->System.out.println(elem));
				CrudHBase ch = new CrudHBase();
				ch.addBatch("eve_http", result);
			})
			.outputMode("append")
			//.format("console")
			.start()
			.awaitTermination();
		} catch (StreamingQueryException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}




	@Override
	public void kafkaSparkStreamToConsole() {
		// TODO Auto-generated method stub
		SparkSession session = SparkUtils.getSparkSession("spark");
		Dataset<org.apache.spark.sql.Row> ds = session.readStream()
		.format("kafka")
		.option("kafka.bootstrap.servers", "192.168.10.31:9092")
		.option("subscribe", "topic0")
		//.option("failOnDataLoss", false)
		.option("startingOffsets", "latest")
		.load();
		Dataset<org.apache.spark.sql.Row> res = ds.selectExpr("CAST(value AS string)");
		try {
			res.writeStream()
			.queryName("query")
			.option("checkpointLocation", "D://checkpoint")
			.outputMode("append")
			.format("console")
			.start()
			.awaitTermination();
		} catch (StreamingQueryException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据分析职业是一个多金的职业,数据分析职位是一个金饭碗的职位,前景美好,但是要全面掌握大数据分析技术,非常困难,大部分学员的痛点是不能快速找到入门要点,精准快速上手。本课程采用项目驱动的方式,以Spark3和Clickhouse技术为突破口,带领学员快速入门Spark3+Clickhouse数据分析,促使学员成为一名高效且优秀的大数据分析人才。学员通过本课程的学习,不仅可以掌握使用Python3进行Spark3数据分析,还会掌握利用Scala/java进行Spark数据分析,多语言并进,力求全面掌握;另外通过项目驱动,掌握Spark框架的精髓,教导Spark源码查看的技巧;会学到Spark性能优化的核心要点,成为企业急缺的数据分析人才;更会通过Clickhouse和Spark搭建OLAP引擎,使学员对大数据生态圈有一个更加全面的认识和能力的综合提升。真实的数据分析项目,学完即可拿来作为自己的项目经验,增加面试谈薪筹码。课程涉及内容:Ø  Spark内核原理(RDD、DataFrame、Dataset、Structed Stream、SparkML、SparkSQL)Ø  Spark离线数据分析(千万简历数据分析、雪花模型离线数仓构建)Ø  Spark特征处理及模型预测Ø  Spark实时数据分析(Structed Stream)原理及实战Ø  Spark+Hive构建离线数据仓库(数仓概念ODS/DWD/DWS/ADS)Ø  Clickhouse核心原理及实战Ø  Clickhouse engine详解Ø  Spark向Clickhouse导入简历数据,进行数据聚合分析Ø  catboost训练房价预测机器学习模型Ø  基于Clickhouse构建机器学习模型利用SQL进行房价预测Ø  Clickhouse集群监控,Nginx反向代理Grafana+Prometheus+Clickhouse+node_exporterØ  Spark性能优化Ø  Spark工程师面试宝典       课程组件:集群监控:福利:本课程凡是消费满359的学员,一律送出价值109元的实体书籍.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值