Spark学习之 Kafka+SparkStreaming做词频统计

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
-------------------------------------------

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值