Project——智慧出行——module1--tf_producer——步骤6:Producer.scala

scala 的main目录下创建scala class :
这里写图片描述
完整的Producer.scala代码:

package main

import java.text.DecimalFormat
import java.util
import java.util.Calendar

import com.alibaba.fastjson.JSON
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}
import utils.PropertyUtil

import scala.util.Random

object Producer {
  def main(args: Array[String]): Unit = {

    // 1 读取kafka配置信息
    // import utils.PropertyUtil
    val props = PropertyUtil.properties
    // 2 创建kafka生产者对象
    // import org.apache.kafka.clients.producer.KafkaProducer
    val producer = new KafkaProducer[String, String](props)

    // 3 模拟生产实时数据,每5分钟切换一次车辆速度
    // import java.util.Calendar
    // getTimeInMillis得到当前毫秒数, / 1000 得到当前“秒”
    var startTime = Calendar.getInstance().getTimeInMillis / 1000
    // 4 定义切换周期(单位:s)
    val trafficCycle = 10
    // 5 利用循环,不停的开始产生模拟数据
    while (true) {
      // 6 模拟产生监测点(模拟20个监测点id)
      // import java.text.DecimalFormat
      val randomMonitorID = new DecimalFormat("0000").format(Random.nextInt(20) + 1)
      // 7 定义随机速度
      var randomSpeed = ""
      // 8 当前时间获取(数据产生时间)
      val currentTime = Calendar.getInstance().getTimeInMillis / 1000
      // 9 速度切换判断,模拟(堵车)切换周期:5分钟
      if (currentTime - startTime > trafficCycle - 1) {
        // 10 产生随机速度数据[0, 16)(单位:km/h)
        randomSpeed = new DecimalFormat("000").format(Random.nextInt(16))
        // 11 在堵车5分钟后,结束堵车状态
        if (currentTime - startTime > (trafficCycle - 1) * 2) {
          startTime = currentTime
        }
      } else {
        // 12 产生随机速度数据[30, 61)(单位:km/h)
        randomSpeed = new DecimalFormat("000").format(Random.nextInt(31) + 30)
      }
      // 13 打印模拟数据,测试
      // println(randomMonitorID + "," + randomSpeed)
      // 15 json序列化数据后,再上传数据到kafka中
      // import java.util(貌似与scala中的HashMap冲突,scala允许无缝连接java的api)
      val jsonMap = new util.HashMap[String, String]()
      // 16 monitor_id到json
      jsonMap.put("monitor_id", randomMonitorID)
      // 17 Speed到json
      jsonMap.put("speed", randomSpeed)
      // 18 序列化json
      // import com.alibaba.fastjson.JSON
      val event = JSON.toJSON(jsonMap)
      // 19 查看序列化后结果,json字符串
      println(event)
      // 20 将消息传送到kafka
      // import org.apache.kafka.clients.producer.ProducerRecord
      producer.send(new ProducerRecord[String, String](props.getProperty("kafka.topics"), event.toString))
      // 14 减缓线程,便于观察
      //Thread.sleep(200)

    }
  }
}

第13步结束测试产生数据
(加入Thread.sleep(1000)语句可以减缓数据产生速度,便于观察)
这里写图片描述
第19步json后结果:
这里写图片描述
第20步结果
启动集群的zookeeper服务 (全部节点都要启动)

zkServer.sh start

启动hadoop服务(主节点启动)

start-all.sh

启动kafka集群(全部节点都要启动)

kafka-server-start.sh /home/hadoop/kafka_2.11/config/server.properties

创建kafka主题traffic(一个节点执行)

kafka-topics.sh --zookeeper centosa:2181 --topic traffic --create --replication-factor 1 --partitions 3

这里写图片描述

检查主题

kafka-topics.sh --list --zookeeper centosa:2181  

(kafka-topics.sh –zookeeper centosa:2181 –list效果相同 )
这里写图片描述

创建kafka的控制台消费者

kafka-console-consumer.sh --zookeeper centosa:2181 --topic traffic --from-beginning

(如果kafka.properties中的bootstrap.servers中使用的是ip地址,则需要将名称改为ip地址)
–from-beginning可以去掉
这里写图片描述
run Producer.scala
这里写图片描述
带不带–from-beginning的区别:
–from-beginning,读取历史未消费的数据

  • 第一次使用时由于没有历史数据,所以没差别
  • 第二次使用时,无论是否产生数据,均会显示历史未消费数据,但数据顺序会变化

下图为第二次使用kafka,有–from-beginning,但没有启动Producer.scala效果
这里写图片描述

至此,生产者创建完毕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值