kafka1.0–>spark streaming2.0
查看spark版本与内置的scala版本
spark-shell
在Maven Repository下载
spark-streaming-kafka-0-10_2.11-2.0.0.jar文件,其中,2.11表示scala的版本,2.0.0表示Spark版本号,0-10表示kafka版本
注意!!!
Spark2.3版本中spark-streaming-kafka-0-10不支持python, 所以如果用在pyspark中就会报错。故而我这里使用Spark 2.0.0
一、下载依赖包
spark-stream-kafka-0.10_2.11-2.0.0.jar
- 将依赖包拷贝到/user/spark/jars下。
- 修改spark目录下的conf/spark-env.sh文件,(路径自己看着办)
- spark-env.sh文件如下,没有配置的点我,往下拉找到spark配置
下载编译包
这个主要是在spark程序运行的时候调用的,我觉得和版本没多大关系,反正我能运行
直接下载然后上传到虚拟机的 /user/spark/jars上
注意!!!
用户组都为hadoop hadoop,不然你会崩溃的。
二、开启集群,不能一键启动的点我呀,往下拉就找到啦
-
一shell启动zookeeper
sh zoopkeeper_start.sh
-
一shell启动kafka
sh kafka_start.sh
-
开启HDFS,配置好环境变量
start-all.sh
三、创建kafka主题,配好环境变量比较方便
-
创建一个名为kafka-spark-treaming的主题
kafka-topics.sh --create --zookeeper Master:2181,Slave1:2181,Slave2:2181 --replication-factor 3 --partitions 3 --topic kafka-spark-streaming
-
查看是否创建成功
kafka-topics.sh --describe --zookeeper Master:2181,Slave1:2181,Slave2:2181 --topic kafka-spark-streaming
四、使用python编写spark streamnig代码
理解,spark streaming从kafka接收数据有两种方法:
(1)、使用receivers和高层次的API
(2)、使用Direct API和低层次的kafkaAPI
我这里使用的是(1)。
-
编写代码如下,vi kafka_spark_streaming.py
##-- coding: UTF-8 -- from pyspark import SparkContext from pyspark.streaming import StreamingContext from pyspark.streaming.kafka import KafkaUtils #设置使用两个线程,设置程序的名字为KafkaWordCount sc=SparkContext("local[2]","KafkaWordCount") #处理时间间隔为2s ssc=StreamingContext(sc,2) #设置zookeeper zookeeper="192.168.23.200:2181,192.168.23.201:2181,192.168.23.202:2181" #设置要监听的主题 topic={"kafka-spark-streaming":0,"kafka-spark-streaming":1,"kafka-spark-streaming":2} #在/user/kafka/config/consumer.properties 查看groupid="test-consumer-group" groupids="test-consumer-group" ''' 构造函数为KafkaUtils.createDstream(ssc, [zk], [consumer group id], [per-topic,partitions] ) 使用了receivers来接收数据,利用的是Kafka高层次的消费者api, 对于所有的receivers接收到的数据将会保存在spark executors中, 然后通过Spark Streaming启动job来处理这些数据,默认会丢失,可启用WAL日志,该日志存储在HDFS上 ''' lines=KafkaUtils.createStream(ssc,zookeeper,groupids,topic) lines_map=lines.map(lambda x:x[1]) #对两秒内接收到的数据按空格分割 words=lines_map.flatMap(lambda line:line.split(" ")) #映射为(word,1)元组 pairs=words.map(lambda word:(word,1)) #每一行相同的key相加 wordcounts=pairs.reduceByKey(lambda x,y:x+y) #输出文件到hdfs,前缀+自动加日期 wordcounts.saveAsTextFiles("/user/kafka_spark_logs") wordcounts.pprint() #启动spark streaming ssc.start() #等待计算终止 ssc.awaitTermination()
-
启动kafka生产者,输入数据
kafka-console-producer.sh --broker-list 192.168.23.200:9092 --topic kafka-spark-streaming
-
启动脚本,打印成功
spark-submit --jars /user/spark/jars/spark-streaming-kafka-0-8-assembly_2.11-2.0.1.jar kafka_spark_streaming.py 2> error.txt
hdfs上:hadoop fs -cat /user/kafka_spark_logs-*/*
BUG
1、遇到Pycharm代码无法复制,无法选中删除,无法编辑。
选择菜单栏,Tools -->去掉打勾勾的Vim Emulator
参考
https://spark.apache.org/docs/2.0.1/streaming-kafka-0-8-integration.html
https://spark.apache.org/docs/2.0.1/submitting-applications.html
https://www.jianshu.com/p/04f8e78ea656
https://colobu.com/2015/01/05/kafka-spark-streaming-integration-summary/