Spark项目实战:大数据实时流处理日志(非常详细)

一、实战内容

  • 编写python脚本,源源不断产生学习网站的用户行为日志。
  • 启动 Flume 收集产生的日志。
  • 启动 Kfka 接收 Flume 接收的日志。
  • 使用 Spark Streaming 消费 Kafka 的用户日志。
  • Spark Streaming将数据清洗过滤非法数据,然后分析日志中用户的访问课程,统计课程数,得到最受欢迎课程TOP5,第二个业务是统计各个搜索引擎的搜索量。(通过分析日志还可以实现很多其他的业务,基于篇幅,本项目只实现其中两个)。
  • 将 Spark Streaming 处理的结果写入 HBase 中。
  • 前端使用 Spring MVC、 Spring、 MyBatis 整合作为数据展示平台。
  • 使用Ajax异步传输数据到jsp页面,并使用 Echarts 框架展示数据。
  • 本实战使用IDEA2018作为开发工具,JDK版本为1.8,Scala版本为2.11。

二、大数据实时流处理分析系统简介

  • 1.需求
    如今大数据技术已经遍布生产的各个角落,其中又主要分为离线处理实时流处理。本实战项目则是使用了实时流处理,而大数据的实时流式处理的特点:
    1.数据会不断的产生,且数量巨大。
    2.需要对产生额数据实时进行处理。
    3.处理完的结果需要实时读写进数据库或用作其他分析。
    针对以上的特点,传统的数据处理结构已经无力胜任,因而产生的大数据实时流处理的架构思想。
  • 2.背景及架构
    数据的处理一般涉及数据的聚合,数据的处理和展现能够在秒级或者毫秒级得到响应。针对这些问题目前形成了Flume + kafka + Storm / Spark /Flink + Hbase / Redis 的技架构。本实战采用Flume + kafka + Spark + Hbase的架构。

三、实战所用到的架构和涉及的知识

  • 1.后端架构
    1.Hadoop-2.6.0-cdh5.7.0
    2.Spark-2.2.0-bin-2.6.0-cdh5.7.0
    3.Apache-flume-1.9.0-bin
    4.Kafka_2.11-1.0.0
    5.Hbase-1.2.0-cdh5.7.0
  • 2.前端框架
    1.Spring MVC-4.3.3.RELEASE
    2.Spring-4.3.3.RELEASE
    3.MyBatis-3.2.1
    4.Echarts

四、项目实战

  • 1.后端开发实战
    1.构建项目

    构建Scala工程项目,并添加Maven支持。

    2.引入依赖
      <properties>
          <scala.version>2.11.8</scala.version>
          <hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
          <spark.version>2.2.0</spark.version>
          <hbase.version>1.2.0-cdh5.7.0</hbase.version>
      </properties>
    
      <repositories>
          <repository>
              <id>cloudera</id>
              <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
          </repository>
      </repositories>
    
     <dependencies>
          <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${
         scala.version}</version>
          </dependency>
      
          <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>${
         hadoop.version}</version>
          </dependency>
      
          <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-client</artifactId>
                <version>${
         hbase.version}</version>
          </dependency>
      
          <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId> spark-streaming-kafka-0-8_2.11</artifactId>
            <version>${
         spark.version}</version>
          </dependency>
      
          <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-scala_2.11</artifactId>
            <version>2.6.5</version>
          </dependency>
      
          <dependency>
            <groupId>net.jpountz.lz4</groupId>
            <artifactId>lz4</artifactId>
            <version>1.3.0</version>
          </dependency>
          
          <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-streaming_2.11</artifactId>
                <version>${
         spark.version}</version>
          </dependency>
      
          <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
          </dependency>
      
          <dependency>
                <groupId>com.ggstar</groupId>
                <artifactId>ipdatabase</artifactId>
                <version>1.0-SNAPSHOT</version>
          </dependency>
     </dependencies>
    
    3.创建工程包结构

    在scala目录下创建如下包结构:
    创建工程包结构

    4.编写代码

    (1). 在util包下创健Java类HBaseUtils,用于连接HBase,存储处理的结果:
    util包下创健Java类HBaseUtils
    HBaseUtils完整代码如下:

     /**
     * Hbase工具类,用于:
     * 连接HBase,获得表实例
     */
    public class HBaseUtils {
         
    
        private Configuration configuration = null;
        private Connection connection = null;
        private static HBaseUtils instance = null;
    
        /**
         * 在私有构造方法中初始化属性
         */
        private HBaseUtils(){
         
            try {
         
                configuration = new Configuration();
                //指定要访问的zk服务器
                configuration.set("hbase.zookeeper.quorum", "hadoop01:2181");
                //得到Hbase连接
                connection = ConnectionFactory.createConnection(configuration);
            }catch(Exception e){
         
                e.printStackTrace();
            }
        }
    	
    	/**
    	* 获得HBase连接实例
    	*/
    	
       public static synchronized HBaseUtils getInstance(){
         
            if(instance == null){
         
                instance = new HBaseUtils();
            }
            return instance;
        }
    
        /**
         *由表名得到一个表的实例
         * @param tableName
         * @return
         */
        public  HTable getTable(String tableName) {
         
            HTable hTable = null;
            try {
         
                hTable = (HTable)connection.getTable(TableName.valueOf(tableName));
            }catch (Exception e){
         
                e.printStackTrace();
            }
            return hTable;
        }
    }
    

    在util包下创Scala object类DateUtils,用于格式化日志的日期,代码如下:

    /**
    * 格式化日期工具类
    */
    object DateUtils {
         
    
    //指定输入的日期格式
    val YYYYMMDDHMMSS_FORMAT= FastDateFormat.getInstance("yyyy-MM-dd hh:mm:ss")
    //指定输出格式
    val TARGET_FORMAT = FastDateFormat.getInstance("yyyyMMddhhmmss")
    
    //输入String返回该格式转为log的结果
    def getTime(time:String) = {
         
      YYYYMMDDHMMSS_FORMAT.parse(time).getTime
    }
    
    def parseToMinute(time:String) = {
         
      //调用getTime
      TARGET_FORMAT.format(getTime(time))
     }
    }
    

    (2). 在domain包下创建以下几个Scala样例类:
    ClickLog:用于封装清洗后的日志信息:
    在domain包下创建ClickLog
    然后将该类声明为样例类,在class关键字前增加case关键字:
    在这里插入图片描述
    ClickLog 类完整代码如下:

     /**
      * 封装清洗后的数据
      * @param ip 日志访问的ip地址
      * @param time 日志访问的时间
      * @param courseId 日志访问的实战课程编号
      * @param statusCode 日志访问的状态码
      * @param referer 日志访问的referer信息
      */
    case class ClickLog (ip:String,time:String,courseId:Int,statusCode:Int,referer:String)
    

    再创建样例类 CourseClickCount 用于封装课程统计的结果,样例类 CourseSearchClickCount 用于封装搜索引擎的统计结果,因为创建过程与上面的ClickLog 类一样,这里不再展示,直接给出完整代码:
    CourseClickCount 类完整代码如下:

       /**
        * 封装实战课程的总点击数结果
         * @param day_course 对应于Hbase中的RowKey
         * @param click_count 总点击数
         */
       case class CourseClickCount(day_course:String,click_count:Int)
    

    CourseSearchClickCount 类完整代码如下:

        /**
      * 封装统计通过搜索引擎多来的实战课程的点击量
      * @param day_serach_course 当天通过某搜索引擎过来的实战课程
      * @param click_count 点击数
      */
    case class CourseSearchClickCount(day_serach_course:String,click_count:Int)
    

    (3). 在dao包下创建以下Scala的object类:
    CourseClickCountDao :用于交互HBase,把课程点击数的统计结果写入HBase:
     在dao包下创建CourseClickCountDao
    CourseClickCountDao 类的完整代码如下:

    	/**
      * 实战课程点击数统计访问层
      */
    object CourseClickCountDao {
         
    
        val tableName = "ns1:courses_clickcount"  //表名
        val cf = "info"   //列族
        val qualifer = "click_count"   //列
    
      /**
        * 保存数据到Hbase
        * @param list (day_course:String,click_count:Int) //统计后当天每门课程的总点击数
        */
      def save(list:ListBuffer[CourseClickCount]): Unit = {
         
      	//调用HBaseUtils的方法,获得HBase表实例
        val table = HBaseUtils.getInstance().getTable(tableName)
        for(item <- list){
         
          //调用Hbase的一个自增加方法
          table.incrementColumnValue(Bytes.toBytes(item.day_course),
            Bytes.toBytes(cf),
            Bytes.toBytes(qualifer),
            item.click_count)  //赋值为Long,自动转换
        }
      }
    }
    

    CourseClickCountDao :用于交互HBase,把搜引擎搜索数量的统计结果写入HBase,创建过程与CourseClickCountDao 类一致故不再展示,完整代码如下:

    object CourseSearchClickCountDao {
         
      val tableName = "ns1:courses_search_clickcount"
      val cf = "info"
      val qualifer = "click_count"
    
      /**
        * 保存数据到Hbase
        * @param list (day_course:String,click_count:Int) //统计后当天每门课程的总点击数
        */
      def save(list:ListBuffer[CourseSearchClickCount]): Unit = {
         
        val table = HBaseUtils.getInstance().getTable(tableName)
        for(item <- list){
         
          table.incrementColumnValue(Bytes.toBytes(item.day_serach_course),
            Bytes.toBytes(cf),
            Bytes.toBytes(qualifer),
            item.click_count)  //赋值为Long,自动转换
        }
      }
    }
    

    注意: 代码中的HBase表需要提前创建好,详情请看本节的 8.在HBase中创建项目需要的表
    (4). 在application包下创建Scala的object类 CountByStreaming,用于处理数据,是本项目的程序入口,最为核心的类:
    在这里插入图片描述
    CountByStreaming 类的完整代码如下:

    object CountByStreaming {
         
    
      def main(args: Array[String]): Unit = {
         
    
        /**
          * 最终该程序将打包在集群上运行,
          * 需要接收几个参数:zookeeper服务器的ip,kafka消费组,
          * 主题,以及线程数
          */
        if(args.length != 4){
         
            System.err.println("Error:you need to input:<zookeeper> <group> <toplics> <threadNum>")
            System.exit(1)
          }
    
          //接收main函数的参数,外面的传参
          val Array(zkAdderss,group,toplics,threadNum) = args
    
        /**
          * 创建Spark上下文,下本地运行需要设置AppName
          * Master等属性,打包上集群前需要删除
          */
        val sparkConf = new SparkConf()
            .setAppName("CountByStreaming")
            .setMaster("local[4]")
          
          //创建Spark离散流,每隔60秒接收数据
          val ssc = new StreamingContext(sparkConf,Seconds(60))
          //使用kafka作为数据源
          val topicsMap = toplics.split(",").map((_,threadNum.toInt)).toMap
          //创建kafka离散流,每隔60秒消费一次kafka集群的数据
          val kafkaInputDS = KafkaUtils.createStream(ssc,zkAdderss,group,topicsMap)
    
           //得到原始的日志数据
          val logResourcesDS = kafkaInputDS.map(_._2)
        /**
          * (1)清洗数据,把它封装到ClickLog中
          * (2)过滤掉非法的数据
          */
          val cleanDataRDD = logResourcesDS.map(line => {
         
            val splits = line.split("\t")
            if(splits.length != 5) {
               //不合法的数据直接封装默认赋予错误值,filter会将其过滤
              ClickLog("", "", 0, 0, "")
            }
            else {
         
            val ip = splits(0)   //获得日志中用户的ip
            val time = DateUtils.parseToMinute(splits(1)) //获得日志中用户的访问时间,并调用DateUtils格式化时间
            val status = splits(3).toInt  //获得访问状态码
            val referer = splits(4)
            val url = splits(2).split(" ")(1)  //获得搜索url
            var courseId = 0
            if(url.startsWith("/class")){
         
              val courseIdHtml = url.split("/")(2)
              courseId = courseIdHtml.substring(0,courseIdHtml.lastIndexOf(".")).toInt
            }
            ClickLog(ip,time,courseId,status,referer)  //将清洗后的日志封装到ClickLog中
            }
          }).filter(x => x.courseId != 0 )   //过滤掉非实战课程
    
        /**
          * (1)统计数据
          * (2)把计算结果写进HBase
          */
          cleanDataRDD .map(line => {
         
            //这里相当于定义HBase表"ns1:courses_clickcount"的RowKey,
            // 将‘日期_课程’作为RowKey,意义为某天某门课的访问数
            (line.time.substring(0,8) + "_" + line.courseId,1)   //映射为元组
          }).reduceByKey(_ + _)   //聚合
            .foreachRDD(rdd =>{
             //一个DStream里有多个RDD
            rdd.foreachPartition(partition => {
            //一个RDD里有多个Partition
              val list = new ListBuffer[CourseClickCount]
              partition.foreach(item => 
  • 80
    点赞
  • 541
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
### 回答1: 这是一篇关于大型电商用户行为分析大数据平台的实战文章。文章介绍了如何使用Spark技术构建一个可扩展的、高性能的大数据平台,用于分析电商用户的行为数据。该平台可以处理海量的数据,提供实时的数据分析和可视化展示,帮助电商企业更好地了解用户行为,优化产品和服务,提升用户体验和销售业绩。文章详细介绍了平台的架构设计、数据处理程、数据分析方法和可视化展示方式,对于从事大数据分析和电商业务的人员具有很高的参考价值。 ### 回答2: 大数据平台在如今的电商领域中扮演着越来越重要的角色,帮助电商企业更好地了解用户需求、优化营销策略、提高销售效率和用户体验。而在这个领域中,Spark大数据分析引擎的应用也愈发广泛,帮助企业更好地处理和分析海量的数据。 电商用户行为分析大数据平台的构建需要考虑多个因素,包括数据采集、数据存储和数据处理等方面。其中,数据采集是关键的一环,需要收集用户在电商平台中的各种行为数据,如浏览商品、下单、付款和退款等。这些数据需要经过初步处理和清洗后才能被存储到大数据平台中。 在数据存储方面,Hadoop和HBase是两个常用的大数据存储技术。Hadoop可以将各种不同类型的数据按照文件的形式存储,而HBase则是分布式的、面向列的数据库,可以更好地支持结构化数据的存储和查询。 在数据处理方面,Spark作为一种快速而通用的大数据处理引擎,具有良好的扩展性、高效性和易用性。Spark可以处理非常大的数据集,并且可以在内存中缓存数据以加速处理速度。此外,Spark还提供了一些高级API,如Spark SQL、MLlib和GraphX等,可以帮助企业更高效地进行数据分析和挖掘。 在电商用户行为分析大数据平台的具体使用场景中,Spark可以用于用户行为分析、推荐算法优化、用户画像构建和活动效果评估等方面。例如,可以使用Spark对用户浏览、下单和购买等行为数据进行分析,探索用户行为模式,挖掘用户需求,优化商品推荐和定价策略;同时,可以使用Spark对不同用户群体的行为数据进行整合和分析,为企业提供更准确的用户画像信息,帮助企业更好地了解不同用户群体的特点和需求。通过这些分析,企业可以精准地掌握用户需求,提高产品服务质量和营销效果,加速企业的发展和壮大。 ### 回答3: 随着电商市场的不断发展,对于用户的行为分析越来越重要,为了更好地提升用户体验和销售业绩,企业需要构建一个可靠的电商用户行为分析大数据平台。而Spark大型项目实战:电商用户行为分析大数据平台(一)则是这一领域的先锋。 Spark大型项目实战:电商用户行为分析大数据平台(一)所涉及到的核心技术主要有三个方面:数据采集、数据处理及数据分析。 首先是数据采集。在电商平台上,用户的行为主要包括页面访问、商品浏览、购物车添加、下单付款等。为了获取这些数据,需要在网站内添加代码或者使用第三方网站统计工具进行数据采集。 其次是数据处理。这一步骤主要利用Spark进行离线数据处理式数据处理,包括数据清洗、数据整合、数据融合、数据统计等。对于数据清洗来说,首先需要对数据进行去重、过滤,然后再进行数据整合、数据融合。数据统计则是非常重要的一步,可以统计用户的浏览、下单、付款等行为,以此来评估用户的消费行为和进行推荐。在式数据处理方面,可以使用Kafka和Spark Streaming对实时数据进行处理,以提升数据处理效率和精确度。 最后是数据分析。通过对采集和处理的数据进行分析,可以对用户消费行为、支付渠道、商品销售情况等进行全面评估和推广分析。可以通过编写Spark程序,使用SQL和Python进行数据分析,从而挖掘出数据中隐藏的价值。例如可以通过用户行为数据来推荐商品、针对用户定制促销策略等。 以上就是Spark大型项目实战:电商用户行为分析大数据平台(一)的主要内容。通过使用Spark等技术,企业可以深入了解用户的消费行为,优化促销策略和提高销售业绩,提升用户满意度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值