第四部分-推荐系统-实时推荐之实时数据加工
- 把测试集(30%总数据)的数据 ,怼到 Kafka 消息队列里
前置准备
Kafka系列一之架构介绍和安装
Kafka系列三之单节点多Broker部署
启动Kafka
[root@hadoop001 ~]# nohup kafka-server-start.sh $KAFKA_HOME/config/server-1.properties &
[1] 3126
[root@hadoop001 ~]# nohup: 忽略输入并把输出追加到"nohup.out"
[root@hadoop001 ~]# nohup kafka-server-start.sh $KAFKA_HOME/config/server-2.properties &
[2] 3526
[root@hadoop001 ~]# nohup: 忽略输入并把输出追加到"nohup.out"
[root@hadoop001 ~]#
[root@hadoop001 ~]#
[root@hadoop001 ~]# nohup kafka-server-start.sh $KAFKA_HOME/config/server-3.properties &
[3] 3895
[root@hadoop001 ~]# nohup: 忽略输入并把输出追加到"nohup.out"
Kafka常用命令
kafka-topics.sh --zookeeper hadoop001:2181 --create --replication-factor 3 --partitions 1 --topic movie_topic
kafka-topics.sh --describe --zookeeper hadoop001:2181 --topic movie_topic
kafka-console-producer.sh --broker-list hadoop001:9095 --topic movie_topic
kafka-console-consumer.sh --zookeeper hadoop001:2181 --topic movie_topic
当然 --help 最好使
KAFKA 其实特别重要,后面再花时间好好研究研究
开始Coding:
步骤一: 继续在前面的项目中,新建包streaming,新建KafkaProducer
package com.csylh.recommend.streaming
import java.util.Properties
import com.csylh.recommend.config.AppConf
import org.apache.kafka.clients.producer._
import org.apache.spark.sql.Dataset
/**
* Description: 测试集(30%总数据)的数据 ,怼到 Kafka 消息队列里
*
*
* @Author: 留歌36
* @Date: 2019/10/18 10:17
*/
object KafkaProducer extends AppConf {
def main(args: Array[String]) {
// 如果数据不加 limit限制,会出现OOM错误
val testDF = spark.sql("select * from testData limit 10000")
val props = new Properties()
// 指定kafka的 ip地址:端口号
props.put("bootstrap.servers", "hadoop001:9093,hadoop001:9094,hadoop001:9095")
// 配置可以设定发送消息后是否需要Broker端返回确认,有"0","1","all"
// props.put("acks", "all")
// props.put("retries", "0")
// props.put("batch.size", "16384")
// props.put("linger.ms", "1")
// props.put("buffer.memory", "33554432")
// 设定ProducerRecord发送的key值为String类型
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
// 设定ProducerRecord发送的value值为String类型
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
val topic = "movie_topic"
import spark.implicits._
val testData:Dataset[(String,String)] = testDF.map(x => (topic, x.getInt(0).toString() + "|" + x.getInt(1).toString + "|" + x.getDouble(2).toString()))
val producer = new KafkaProducer[String, String](props)
// 如果服务器内存不够,会出现OOM错误
val messages = testData.toLocalIterator
while (messages.hasNext) {
val message = messages.next()
val record = new ProducerRecord[String, String](topic, message._1, message._2)
println(record)
producer.send(record)
// 延迟10毫秒
Thread.sleep(1000*5)
}
producer.close()
// TODO... for循环会有序列化的问题
//for (x <- testData) {
// val message = x
// val record = new ProducerRecord[String, String]("test", message._1, message._2)
// println(record)
// producer.send(record)
// Thread.sleep(1000)
//}
// 不用testData.map或者foreach,因为这两种方法会让你的数据做分布式计算,在计算时,处理数据是无序的。
// testData.foreach
}
}
步骤二:将创建的项目进行打包上传到服务器
~~mvn clean package -Dmaven.test.skip=true~~
步骤三:编写shell 执行脚本
```powershell
[root@hadoop001 ml]# vim kafkaProducer.sh
export HADOOP_CONF_DIR=/root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
$SPARK_HOME/bin/spark-submit
--class com.csylh.recommend.streaming.KafkaProducer
--master spark://hadoop001:7077
--name KafkaProducer
--driver-memory 2g
--executor-memory 1g
--total-executor-cores 1
--jars /root/app/kafka_2.11-1.1.1/libs/kafka-clients-1.1.1.jar
/root/data/ml/movie-recommend-1.0.jar
步骤四:执行 sh kafkaProducer.sh 即可
保证控台台能不断的消费到数据。
有任何问题,欢迎留言一起交流~~
更多文章:基于Spark的电影推荐系统:https://blog.csdn.net/liuge36/column/info/29285