准备:首先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