来自单个JavaStreamingContext的多个JavaPairDStream(JavaReceiverInputDStream)

时间:2016-09-07 23:08:46

标签: apache-spark spark-streaming

我有一个队列,我正在使用Spark Streaming读取数据。我需要将这些数据(在一些计算之后)写入2个不同的表中(两个表的计算都不同)。我观察到我的代码只执行第一个JavaPairDStream而不执行另一个。我在两个PairStream上都有输出动作。

我还注意到,如果队列中的数据很小 - 只说一条消息,那么它会被插入到两个表中,但当队列中的数据很大时则不是这种情况

我的代码如下 -

public static void main(String ar[]) {
   JavaReceiverInputDStream<String> receiverStream = RabbitMQUtils.createJavaStream(streamCtx, String.class, rabbitMqConParams, messageHandler);

//this is first pair stream
JavaPairDStream<String, Integer> map1 = receiverStream.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() {...}
JavaPairDStream<String, Integer> red1  = map1.reduceByKey(new Function2<Integer, Integer, Integer>() {...}
red1.foreachRDD(new VoidFunction<JavaPairRDD<String, Integer>>() {
 //i write to hbase from here to "x" table
}

//this is second pair stream
JavaPairDStream<String, Integer> map2 = receiverStream.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() {...}
JavaPairDStream<String, Integer> red2  = map2.reduceByKey(new Function2<Integer, Integer, Integer>() {...}
red2.foreachRDD(new VoidFunction<JavaPairRDD<String, Integer>>() {
 //i write to hbase from here to "y" table
}
}

这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

上述代码没有问题。对于我的一个用例,我也在做同样的事情。

HBase 中编写数据的代码可能需要时间。

您可以尝试在 SparkConf 中设置以下属性来控制流输入速率。它可以帮助您调试问题。

// In case if reading from Kafka
conf.set("spark.streaming.kafka.maxRatePerPartition", 100);

// In case of other streams
conf.set("spark.streaming.receiver.maxRate", 100);

上述属性控制每个接收器将接收数据的接收器的最大输入速率(每秒记录数)。实际上,每个流每秒最多会消耗 100 条记录。有关流配置的详细信息,请参阅http://spark.apache.org/docs/latest/configuration.html#spark-streaming