• 基于Spark的电影推荐系统(推荐系统~6)


    第四部分-推荐系统-实时推荐之实时数据加工

    • 把测试集(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

  • 相关阅读:
    【转载】Sqlserver存储过程中使用Select和Set给变量赋值
    【转载】腾讯云如何将一个域名解析到另一个域名上
    【转载】Sqlserver限制最大可使用内存
    【转载】 腾讯云通过设置安全组禁止某些IP访问你的服务器
    【转载】 C#使用Select方法快速获取List集合集合中某个属性的所有值集合
    【转载】哪些域名后缀可在工信部进行备案操作
    【转载】 C#使用string.Join快速用特定字符串串联起数组
    【转载】Sqlserver使用Convert函数进行数据类型转换
    【转载】Sqlserver根据生日计算年龄
    【转载】 腾讯云硬盘不够用,如何对硬盘进行扩容
  • 原文地址:https://www.cnblogs.com/liuge36/p/12614706.html
Copyright © 2020-2023  润新知