Oryx Speed 层解析

来源:互联网 发布:数据库程序设计题表 编辑:程序博客网 时间:2024/06/08 05:31
1、程序入口 com.cloudera.oryx.speed.Main

public static void main(String[] args) throws Exception {
  try (SpeedLayer<?,?,?> speedLayer = new SpeedLayer<>(ConfigUtils.getDefault())) {
    HadoopUtils.closeAtShutdown(speedLayer);
    speedLayer.start();
    speedLayer.await();
  }
}


调用Lambda层的com.cloudera.oryx.lambda.speed.SpeedLayer.start()
属性的配置文件有2个:
1)oryx-common下面的reference.conf
2)运行项目时提供的oryx.conf


BatchLayer.start()主要做的事情按顺序如下:
1、构建SparkStreamingContext, 默认批次间隔10秒    
generation-interval-sec 10

2、设置SparkStreaming Checkpoint

3、构建KafkaDStream (从kafka input-topic) 
     构建kafka Consumer  (从kafka update-topic)

4、实现SpeedModelManager或者ScalaSpeedModelManager。
由SpeedModelManager的子类来处理kafka input-topic和update-topic的数据。
SpeedModelManager有2个接口:
void consume(Iterator<KeyMessage<String,U>> updateIteratorConfiguration hadoopConf) throws IOException;
Iterable<UbuildUpdates(JavaPairRDD<K,M> newData) throws IOException;

SpeedModelManager有2个子类:
AbstractSpeedModelManager和ScalaSpeedModelManagerAdapter

Java版本继承AbstractSpeedModelManager

ScalaSpeedModelManager有1个子类:
AbstractScalaServingModelManager

scala版本继承AbstractScalaServingModelManager

以ALS模型为例
ALSSpeedModelManager继承 AbstractSpeedModelManager

ALSSpeedModelManager里面主要做2件事情:
1)  由SpeedLayerUpdate消费input-topic里的数据,调用ALSSpeedModelManager的buildUpdate()方法来产生更新后的X和Y信息,然后发送到update-topic
try (TopicProducer<String, U> producer = new TopicProducerImpl<>(updateBroker, updateTopic, true)) {
  updates.forEach(update -> producer.send("UP", update));
}

ALSSpeedModelManager的buildUpdate()主要是处理增量数据


2) 调用ALSSpeedModelManager的consume()来消费update-topic的数据
如果消息的key是UP, 则该消息是由Speed层自己在SpeedLayerUpdate里发送的(见上面第一步)
更新ALSSpeedModel。


如果消息的key是MODEL或者MODEL_REF, 则该消息是由Batch层MLUpdate.runUpdate()里发送的.是全量数据
Batch发送数据的周期比较长,key为MODEL或者MODEL_REF的次数会比较少,新数据进来以后一般都是走UP,只有第一次进来的数据走MODEL或MODEL_REF,以后间隔一段时间

..1. 它会按消息里指明的信息先加载模型PMML pmml(直接从消息本身加载或者从消息指定的model在hdfs上的路径加载)
..2. 从PMML读取features, implicit, logStrength, epsilon。 
..3. 由features, implicit, logStrength, epsilon构建ALSSpeedModel


5、更新Kafka Offsets



总结:
     
SpeedLayer --> AbstractSpeedModelManager.consume()  --> 
                   |-->  SpeedLayerUpdate   -->  SpeedModelManager.buildUpdates()

SpeedLayerUpdate.call(newData) 会把SpeedModelManager.buildUpdates()的结果updates发送到Kafka Update Topic
producer.send("UP", update)

AbstractSpeedModelManager 实现了SpeedModelManager





原创粉丝点击