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效果
至此,生产者创建完毕