核心概念
下面介绍Kafka相关概念,以便运行下面实例的同时,更好地理解Kafka.
接下来在Ubuntu系统环境下测试简单的实例。按顺序执行如下命令:
进入kafka所在的目录
cd /usr/local/kafka
bin/zookeeper-server-start.sh config/zookeeper.properties
命令执行后不会返回Shell命令输入状态,zookeeper就会按照默认的配置文件启动服务,请千万不要关闭当前终端.启动新的终端,输入如下命令:
cd /usr/local/kafka
bin/kafka-server-start.sh config/server.properties
kafka服务端就启动了,请千万不要关闭当前终端。启动另外一个终端,输入如下命令:
cd /usr/local/kafka
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic zhaogw
topic是发布消息发布的category,以单节点的配置创建了一个叫zhaogw的topic.可以用list列出所有创建的topics,来查看刚才创建的主题是否存在。
bin/kafka-topics.sh --list --zookeeper localhost:2181
可以在结果中查看到zhaogw这个topic存在。接下来用producer生产点数据:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic zhaogw
hello world
hello hadoop
然后再次开启新的终端或者直接按CTRL+C退出。然后使用consumer来接收数据,输入如下命令:
cd /usr/local/kafka
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic zhaogw --from-beginning
便可以看到刚才产生的三条信息。说明kafka安装成功。
package com.zgw.spark.streaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* Created by Zhaogw&Lss on 2019/10/22.
*/
object Sparkstreaming_Kafka {
def main(args: Array[String]): Unit = {
var sparkConf =new SparkConf().setMaster("local[*]").setAppName("SparkStream").set("spark.testing.memory", "2147480000")
//分析环境对象以及采集周期
val streamContext = new StreamingContext(sparkConf,Seconds(25))
/* val inputFile = "hdfs://192.168.181.128:8020/spark/"*/
//kafka Stream
val kafkaDsream: ReceiverInputDStream[(String, String)] = KafkaUtils.createStream(
streamContext,
"dblab-VirtualBox:2181",
"zhaogw",
Map("zhaogw" -> 3)
)
//将采集数据进行分解
val dStream: DStream[String] = kafkaDsream.flatMap(t=> t._2.split(" "))
//将数据进行结构转变
val map: DStream[(String, Int)] = dStream.map((_,1))
//聚合处理
val key: DStream[(String, Int)] = map.reduceByKey(_+_)
//结果打印
key.print()
//启动采集器
streamContext.start()
//等待采集器执行
streamContext.awaitTermination()
}
}
核心代码
//kafka Stream
val kafkaDsream: ReceiverInputDStream[(String, String)] = KafkaUtils.createStream(
streamContext,
"dblab-VirtualBox:2181",
"zhaogw",
Map("zhaogw" -> 3)
)
查看该方法的源码
def createStream(
ssc: StreamingContext,
zkQuorum: String,
groupId: String,
topics: Map[String, Int],
storageLevel: StorageLevel = StorageLevel.MEMORY_AND_DISK_SER_2
)
这里使用到了kafka
的工具类 KafkaUtils
,第一个参数是StreamingContext
对象,第二个参数是zk所在的主机名(与hosts文件中的配置对应),第三个参数是groupId,第四个参数是topics。
启动项目,并在linux主机发送两条消息
hello zzzz
hello heihei