spark采坑集锦之用kafka作为DStream数据源,并行度问题

在SparkStreaming中作为数据源的Kafka怎样接收多主题发送的数据呢?

使用StreamingContext.union方法将多个streaming流合并处理

def main(args: Array[String]): Unit = {
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    val conf = new SparkConf().setMaster("local[4]").setAppName("KafkaWordCount")
    val sc = new SparkContext(conf)
    val ssc = new StreamingContext(sc,Seconds(10))
    val topics = Map("tony" -> 1)
    val topics1 = Map("hunrry" -> 1)

    val num = 2

    val kafkastream = (1 to num).map(i => {
        if (i==1){
          System.out.println("i==1")
          KafkaUtils.createStream(ssc,"192.168.252.153:2181","mygroup",topics)
        }else{
          System.out.println("i==2")
          KafkaUtils.createStream(ssc,"192.168.252.153:2181","mygroup",topics1)
        }
    })

    //同时获取多个主题发送的数据
    val unonKafka  = ssc.union(kafkastream)

   // val lineStream = unonKafka.map(e => new String(e.toString))

    unonKafka.print()

    ssc.start()
    ssc.awaitTermination()


  }

经过个人实验发现个问题
如果指定的setMaster(“local[?]”)过低,可能会导致程序获取一两次后就不动了,不在获取了,只有local[]中的核数足够才能确保运行正常,能够获取多个主题发送过来的数据。

当使用Kafka作为Spark数据源时,可以使用Spark Streaming来接收数据并进行处理。下面是实现这一过程的一些步骤: 1. 导入KafkaSpark Streaming的相关包。 2. 创建一个Spark Streaming上下文。 3. 创建一个Kafka DStream,使用KafkaUtils.createDirectStream()或者KafkaUtils.createStream()方法。 4. 对DStream进行转换,例如:对Kafka消息进行解码、提取消息的内容等操作。 5. 对转换后的DStream应用各种Spark操作,例如:过滤、计算等。 6. 最后,使用DStream.foreachRDD()方法将结果输出到外部系统。 下面是一个使用Kafka作为Spark数据源的示例代码,以便更好地理解: ```python from pyspark.streaming.kafka import KafkaUtils from kafka.serializer import StringDecoder from pyspark.streaming import StreamingContext from pyspark import SparkContext, SparkConf conf = SparkConf().setAppName("KafkaSparkStreaming").setMaster("local[*]") sc = SparkContext(conf=conf) ssc = StreamingContext(sc, 10) kafkaParams = {"metadata.broker.list": "localhost:9092"} topics = ["test_topic"] directKafkaStream = KafkaUtils.createDirectStream( ssc, topics, kafkaParams, valueDecoder=StringDecoder() ) words = directKafkaStream.map(lambda msg: msg[1]).flatMap(lambda line: line.split(" ")) wordCounts = words.map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b) wordCounts.pprint() ssc.start() ssc.awaitTermination() ``` 这个例子首先创建了一个Spark Streaming上下文,并使用KafkaUtils.createDirectStream()方法创建了一个DStream对象。接下来,从Kafka消息中提取了单词,并使用WordCount算法计算单词出现的次数。最后,使用pprint()方法将结果打印出来。启动ssc后,Spark Streaming将持续接收Kafka消息,并在每个时间窗口内计算并显示单词出现的频率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值