准备:首先cmd 在运行中安装pyspark pip install pyspark
spark-streaming得数据的几种途径:
socker: 网络中
queue: sc散列的数据
flume: 通过 flume得数据,sinks
kafka: 通过kafka得数据有两种:一种是Receiver DStream(定义一个消费),一种是Direct DStream(直接消费)
下面我们用python做一个Direct DStream做一个 实时wordcound
下边是shishi.py文件中的代码
import sys
from pyspark import SparkConf
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
import time
def writeResultToFile(rdd):
with open("dswordcound/{0}".format(time.time()),'wb+') as f:
for i in rdd.collect():
f.write(str(i).encode())
f.write('\n'.encode())
#当当前模块以main方式导入就执行否则不执行
if __name__ == '__main__':
#判断使用时控制台是否传入3个参数,不是就结束程序
if len(sys.argv) != 3:
print("Usage: direct_kafka_wordcount.py <broker_list> <topic>", file=sys.stderr)
sys.exit(-1)
# 从第二个参数分别获取 2 3 参数赋值给 brokers, topic
brokers, topic = sys.argv[1:]
# 自定义sparkConf
conf = SparkConf()
# 创建sparkContext 建立 driver 和 work的会话
sc = SparkContext(master='local[4]', appName="my streaming wordcount")
# 创建sparkStreaming
ssc = StreamingContext(sc, 5)
# 使用KafkaUtils的静态方法创建kafka直连流 DStream
kk = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": brokers})
lines=kk.map(lambda x : x[1])
words=lines.flatMap(lambda x:x.split(' '))
pairs=words.map(lambda x:(x,1))
wordcounts=pairs.reduceByKey(lambda x,y:x+y)
#上面的都叫转化transformation 下边的是行为action
wordcounts.foreachRDD(writeResultToFile)
#完成之后客户端不能停,启动并等待完成
ssc.start()
ssc.awaitTermination()
先在/home/hadoop/文件下新建一个目录
然后启动zookeeper ( ./bin/zookeeper-server-start.sh config/zk.properties)
在启动flume(./bin/flume-ng agent -c conf -f conf/aa.conf -n a1 -Dflume.root.logger=info,console)(flume的端口号改h成python2:9092)
在启动一个broker(./bin/kafka-server-start.sh conf/kafka1.properties)
接着启动一个消费者(./bin/kafka-console-consumer.sh --bootstrap-server python2:9092 --topic cctv1)
接着把我们编写的程序放过来,用文件上传到hadoop上
在改下
spark-submit shishi.py python2:9092 cctv1
发现又报错了
第二种方式比较麻烦,我们来使用第一种方式
看一下5秒钟复制一次
这时候我们新建一个文件vi test1