我有一个队列,我正在使用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
}
}
这甚至可能吗?
答案 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。