本文共 4458 字,大约阅读时间需要 14 分钟。
{ "test": { "desc": "测试", "strategy": "streaming.core.strategy.SparkStreamingStrategy", "algorithm": [], "ref": [], "compositor": [ { "name": "streaming.core.compositor.kafka.MockKafkaStreamingCompositor", "params": [ { "metadata.broker.list":"xxx", "auto.offset.reset":"largest", "topics":"xxx" } ] }, { "name": "streaming.core.compositor.spark.JSONTableCompositor", "params": [{"tableName":"test"} ] }, { "name": "streaming.core.compositor.spark.SQLCompositor", "params": [{"sql":"select a from test"} ] }, { "name": "streaming.core.compositor.RDDPrintOutputCompositor", "params": [ { } ] } ], "configParams": { } }}
{ "job1": { "desc": "测试", "strategy": "streaming.core.strategy.SparkStreamingStrategy", "algorithm": [], "ref": [], "compositor": [ { "name": "streaming.core.compositor.kafka.MockKafkaStreamingCompositor", "params": [ { "metadata.broker.list":"xxx", "auto.offset.reset":"largest", "topics":"xxx" } ] } , ], "configParams": { } }, "job2":{ ........ } }
class SQLCompositor[T] extends Compositor[T] { private var _configParams: util.List[util.Map[Any, Any]] = _ val logger = Logger.getLogger(classOf[SQLCompositor[T]].getName)//策略引擎ServiceFrameStrategy 会调用该方法将配置传入进来 override def initialize(typeFilters: util.List[String], configParams: util.List[util.Map[Any, Any]]): Unit = { this._configParams = configParams }// 获取配置的sql语句 def sql = { _configParams(0).get("sql").toString } def outputTable = { _configParams(0).get("outputTable").toString }//执行的主方法,大体是从上一个模块获取SQLContext(已经注册了对应的table),//然后根据该模块的配置,设置查询语句,最后得到一个新的dataFrame.// middleResult里的T其实是DStream,我们会传递到下一个模块,Output模块//params参数则是方便各个模块共享信息,这里我们将对应处理好的函数传递给下一个模块 override def result(alg: util.List[Processor[T]], ref: util.List[Strategy[T]], middleResult: util.List[T], params: util.Map[Any, Any]): util.List[T] = { var dataFrame: DataFrame = null val func = params.get("table").asInstanceOf[(RDD[String]) => SQLContext] params.put("sql",(rdd:RDD[String])=>{ val sqlContext = func(rdd) dataFrame = sqlContext.sql(sql) dataFrame }) middleResult }}
abstract class MapCompositor[T,U] extends Compositor[T]{ private var _configParams: util.List[util.Map[Any, Any]] = _ val logger = Logger.getLogger(classOf[SQLCompositor[T]].getName) override def initialize(typeFilters: util.List[String], configParams: util.List[util.Map[Any, Any]]): Unit = { this._configParams = configParams } override def result(alg: util.List[Processor[T]], ref: util.List[Strategy[T]], middleResult: util.List[T], params: util.Map[Any, Any]): util.List[T] = { val dstream = middleResult(0).asInstanceOf[DStream[String]] val newDstream = dstream.map(f=>parseLog(f)) List(newDstream.asInstanceOf[T]) } def parseLog(line:String): U}class YourCompositor[T,U] extends MapCompositor[T,U]{ override def parseLog(line:String):U={ ....your logical }}
转载地址:http://orypl.baihongyu.com/