kafka是一个分布式消息队列。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。
kafka对外使用topic的概念,生产者往topic里写消息,消费者从读消息。为了做到水平扩展,一个topic实际是由多个partition组成的,遇到瓶颈时,可以通过增加partition的数量来进行横向扩容。单个parition内是保证消息有序。
每新写一条消息,kafka就是在对应的文件append写,所以性能非常高。
kafka的总体数据流是这样的:
1.启动Kafka
启动Zookeeper服务:
cd /usr/local/kafka
./bin/zookeeper-server-start.sh config/zookeeper.properties
启动Kafka服务::
cd /usr/local/kafka
bin/kafka-server-start.sh config/server.properties
2.制作数据源:
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic wordsendertest
输入数据:
java python
C++ java
python scala
scala
中端不能关闭
3.spark 中安装kafka jar文件
Kafka和Flume等高级输入源,需要依赖独立的库(jar文件)。
启动pyspark:
cd /usr/local/spark
./bin/pyspark
下载jar包:http://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-8_2.11/2.1.0
把这个文件复制到Spark目录的jars目录下。请新打开一个终端,输入下面命令:
cd /usr/local/spark/jars
mkdir kafka
cd ~
cd 下载
cp ./spark-streaming-kafka-0-8_2.11-2.1.0.jar /usr/local/spark/jars/kafk
这样,就把spark-streaming-kafka-0-8_2.11-2.1.0.jar文件拷贝到了“/usr/local/spark/jars/kafka”目录下。
同时,修改spark目录下conf/spark-env.sh文件,修改该文件下面的SPARK_DIST_CLASSPATH变量
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath):$(/usr/local/hbase/bin/hbase classpath):/usr/local/spark/examples/jars/*:/usr/local/spark/jars/kafka/*:/usr/local/kafka/libs/*`
4.用 spark使用kafka 数据源
cd /usr/local/spark/mycode
mkdir kafka && cd kafka
vim KafkaWordCount.py
使用vim编辑器新建了KafkaWordCount.py,让它去进行词频统计。请在KafkaWordCount.py中输入以下代码:
from __future__ import print_function
import sys
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: kafka_wordcount.py <zk> <topic>", file=sys.stderr)
exit(-1)
sc = SparkContext(appName="PythonStreamingKafkaWordCount")
ssc = StreamingContext(sc, 1)
zkQuorum, topic = sys.argv[1:]
kvs = KafkaUtils.createStream(ssc, zkQuorum, "spark-streaming-consumer", {topic: 1})
lines = kvs.map(lambda x: x[1])
counts = lines.flatMap(lambda line: line.split(" ")) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a+b)
counts.pprint()
ssc.start()
ssc.awaitTermination()
然后执行:
python3 ./KafkaWordCount.py localhost:2181 wordsendertest
继续使用上面第三个终端的topic。继续在第三个终端上输入信息,就能看到当前python执行终端下显示刚才新输入的结果。
-------------------------------------------
Time: 2019-08-20 10:57:46
-------------------------------------------
('java', 2)
-------------------------------------------
Time: 2019-08-20 10:57:47
-------------------------------------------