kafka

本文介绍Kafka的不同部署方式,包括单节点单Broker、单节点多Broker及多节点多Broker部署,并详细展示了如何使用Spark Streaming消费Kafka中的数据,实现流式处理。
1、kafka的部署
---------------------------




1.单节点 单broker
1 下载tar包,并tar 
  配置相关服务:
1)zookeeper.properties
dataDir=~/kfk/zk
2)server.properties
log.dirs=~/kfk/kafka0-logs
   配置环境变量 KAFKA_HOME
2  启动zoo服务:zookeeper-server-start.sh config/zookeeper.properties
3  启动kfk服务:kafka-server-start.sh soft/kafka/config/server.properties
4  创建主题: kafka-topics.sh --create --topic firsttopic --zookeeper localhost:2181 --partitions 1 --replication-factor 1
5  启动生产者:kafka-console-producer.sh --broker-list localhost:9092 --topic test
6  启动消费者:kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
   0.8 及以上版本有所不同




2.单节点 多broker
1 下载tar包,并tar 
  配置相关服务:
1)zookeeper.properties
dataDir=~/kfk/zk
2)server.properties
log.dirs=~/kfk/kafka0-logs
   配置环境变量 KAFKA_HOME
        2  复制kafka  server.properties配置文件,修改参数
3个参数:
log.dirs=~/kfk/kafka0-logs
broker.id=1
port=9093
 
2  启动zoo服务:zookeeper-server-start.sh config/zookeeper.properties
3  启动kfk服务:kafka-server-start.sh soft/kafka/config/server.properties
4  创建主题: kafka-topics.sh --create --topic firsttopic --zookeeper localhost:2181 --partitions 1 --replication-factor 1
  
5  启动生产者:kafka-console-producer.sh --broker-list localhost:9092 --topic test
6  启动消费者:kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning




3.多节点 多broker

1.Spark Streaming
----------------------
Spark Streaming 使用离散化流(discretized stream)作为抽象表示,叫作DStream。DStream 是随时间推移而收到的数据的序列。
在内部,每个时间区间收到的数据都作为RDD 存在,而DStream 是由这些RDD 所组成的序列(因此得名"离散化")。


创建出来的DStream 支持两种操作,
一种是转化操作(transformation),会生成一个新的DStream
另一种是输出操作(output operation),可以把数据写入外部系统中。






和批处理程序不同,Spark Streaming 应用需要进行额外配置来保证24/7 不间断工作。




要开始接收数据,必须显式调用StreamingContext 的start() 方法。这样,Spark Streaming 就会开始把Spark 作业不断交给下面的SparkContext 去调度执行。
执行会在另一个线程中进行,所以需要调用awaitTermination 来等待流计算完成,来防止应用退出。


DStream 的转化操作可以分为无状态(stateless)和有状态(stateful)两种。
• 在无状态转化操作中,每个批次的处理不依赖于之前批次的数据。常见的RDD转化操作,例如map()、filter()、reduceByKey() 等,都是无状态转化操作。
  无状态转化操作也能在多个DStream 间整合数据,不过也是在各个时间区间内。




• 相对地,有状态转化操作需要使用之前批次的数据或者是中间结果来计算当前批次的数据。
   有状态转化操作包括基于滑动窗口的转化操作和追踪状态变化的转化操作。
   DStream 的有状态转化操作是跨时间区间跟踪数据的操作;也就是说,一些先前批次的数据也被用来在新的批次中计算结果。主要的两种类型是滑动窗口和updateStateByKey(),
前者以一个时间阶段为滑动窗口进行操作,后者则用来跟踪每个键的状态变化(例如构建一个代表用户会话的对象)。
有状态转化操作需要在你的StreamingContext 中打开检查点机制来确保容错性。


ssc.checkpoint("hdfs://...")




push
val kafkaParams = Map(
      "zookeeper.connect" -> "slave3:2181",
      "group.id" -> "spark-streaming-test",
      "zookeeper.connection.timeout.ms" -> "1000")


pull
val kafkaParams = Map[String, String]("metadata.broker.list" -> "slave3:9092")

 

import kafka.serializer.StringDecoder
import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}

object TestKFKPUSH {

  def main(args: Array[String]): Unit = {
    var conf = new SparkConf().setAppName("TestSSC").setMaster("local[4]")

    val ssc = new StreamingContext(conf,Seconds(5))

    ssc.sparkContext.setLogLevel("WARN")

    val kafkaParams = Map[String,String](
      "zookeeper.connect" -> "slave3:2181",
      "group.id" -> "spark-streaming-test",
      "zookeeper.connection.timeout.ms" -> "1000"
    )

    val topic = Array("kfktopic").map((_,1)).toMap
    val ds = KafkaUtils.createStream[String,String,StringDecoder,StringDecoder](ssc,kafkaParams,topic,StorageLevel.MEMORY_AND_DISK)

    val wordcounts = ds.map(_._2).flatMap(_.split("\\s")).map((_,1)).reduceByKey(_+_)
    wordcounts.print()

    ssc.start()
    ssc.awaitTermination()

  }
}

 

import kafka.serializer.StringDecoder
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}

object TestKFKPULL {
  def main(args: Array[String]): Unit = {
    var conf = new SparkConf().setAppName("TestSSC").setMaster("local[4]")

    val ssc = new StreamingContext(conf,Seconds(5))

    ssc.sparkContext.setLogLevel("WARN")
    val kafkaParams = Map[String,String](
      "metadata.broker.list" -> "slave3:9092"
    )
    val topics = Array("kfktopic").toSet
    val ds = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder](ssc,kafkaParams,topics)

    val wordcounts = ds.map(_._2).flatMap(_.split("\\s")).map((_,1)).reduceByKey(_+_)
    wordcounts.print()

    ssc.start()
    ssc.awaitTermination()
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值