文章目录
测试kafka正常工作
[hadoop@hadoop000 kafka]$ bin/kafka-topics.sh \
> --create \
> --zookeeper 192.168.137.190:2181,192.168.137.190:2182,192.168.137.190:2183/kafka \
> --replication-factor 1 --partitions 1 --topic ruozeg5sparkkafka
[hadoop@hadoop000 kafka]$ bin/kafka-console-producer.sh \
> --broker-list 192.168.137.190:9092,192.168.137.190:9093,192.168.137.190:9094 \> --topic ruozeg5sparkkafka
[hadoop@hadoop000 kafka]$ bin/kafka-console-consumer.sh \
> --zookeeper 192.168.137.190:2181,192.168.137.190:2182,192.168.137.190:2183/kafka \
> --topic ruozeg5sparkkafka --from-beginning
streaming整合kafka idea
有两种方式写的方式,一种是receiver的,一种是没有receiver的
receiver要0.8之前才行
添加dependency
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
receiver的代码
package com.ruozedata.bigdata.streaming04
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
object ReceiverKafkaApp {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[2]").setAppName("ReceiverKafkaApp")
val ssc = new StreamingContext(conf,Seconds(10))
val topic ="ruozeg5sparkkafka"
//注意kafka分区和partition分区无关
val numPartitions=1
val zkQuorum="192.168.137.190:2181,192.168.137.190:2182,192.168.137.190:2183/kafka"
var groupId="test_g5"
//元祖转map
val topics =topic.split(",").map((_,numPartitions)).toMap
//返回个receiver,带有kafka keyvalue的DStream
val messages = KafkaUtils.createStream(ssc,zkQuorum,groupId,topics)
//第一列是null
messages.map(_._2)
.flatMap(_.split(",")).map((_,1)).reduceByKey(_+_).print()
ssc.start()
ssc.awaitTermination()
}
}
receive方式注意的点
1.在Receiver的方式中,Spark中的partition和kafka中的partition并不是相关的,所以如果我们加大每个topic的partition数量,仅仅是增加线程来处理由单一Receiver消费的主题。但是这并没有增加Spark在处理数据上的并行度。
2.对于不同的Group和topic我们可以使用多个Receiver创建不同的Dstream来并行接收数据,之后可以利用union来统一成一个Dstream。
3.如果我们启用了Write Ahead Logs复制到文件系统如HDFS,那么storage level需要设置成 StorageLevel.MEMORY_AND_DISK_SER,也就是KafkaUtils.createStream(…, StorageLevel.MEMORY_AND_DISK_SER),因为hdfs自动会有3个副本,不需要这里再设置副本。
打包上传,胖包瘦包
胖包:打包的时候就把依赖打进去
瘦包:不把依赖打进去
正常打包不带依赖,脚本比较麻烦
[hadoop@hadoop000 data]$ cat kafka_receiver.sh
$SPARK_HOME/bin/spark-submit \
--master local[2] \