慕课网实战sparkstreaming实时流处理项目实战笔记二十之铭文升级版

集技术与颜值于一身 集技术与颜值于一身     2022-10-13     770

关键词:

铭文一级:

Spring Boot整合Echarts动态获取HBase的数据
1) 动态的传递进去当天的时间
a) 在代码中写死
b) 让你查询昨天的、前天的咋办?
在页面中放一个时间插件(jQuery插件),默认只取当天的数据
2) 自动刷新展示图
每隔多久发送一个请求去刷新当前的数据供展示


统计慕课网当天实战课程从搜索引擎过来的点击量
数据已经在HBase中有的
自己通过Echarts整合Spring Boot方式自己来实现

 

铭文二级:

在Spring Boot项目pom.xml下引入<repositories>

<repositories>
  <repository>
    <id>cloudera</id>
    <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
  </repository>
</repositories>

  

引入HBase的依赖:org.apache.hbase:hbase-client:1.2.0-cdh5.7.0

拷贝HBaseUtils进来过来改,添加方法:

/**
     * 根据表名和输入条件获取HBase的记录数
     */
    public Map<String, Long> query(String tableName, String condition) throws Exception {
        Map<String, Long> map = new HashMap<>();
        HTable table = getTable(tableName);
        String cf = "info";
        String qualifier = "click_count";
        Scan scan = new Scan();
        Filter filter = new PrefixFilter(Bytes.toBytes(condition));
        scan.setFilter(filter);
        ResultScanner rs = table.getScanner(scan);
        for(Result result : rs) {
            String row = Bytes.toString(result.getRow());
            long clickCount = Bytes.toLong(result.getValue(cf.getBytes(), qualifier.getBytes()));
            map.put(row, clickCount);
        }
        return  map;
    }

重点:

先得到table,再根据查询条件condition过滤出rs,

然后遍历rs->直接获得row,根据cf、qualifier得到点击数clickCount

将row、clickCount添加put进map

过滤条件:

Scan scan = new Scan();

scan.setFilter(new PrefixFilter(Bytes.toBytes(condition)));

ResultScanner rs = getTable(tableName).getScanner(scan);

 

添加主函数进行测试:

public static void main(String[] args) throws Exception {
        Map<String, Long> map = HBaseUtils.getInstance().query("imooc_course_clickcount" , "20171022");

        for(Map.Entry<String, Long> entry: map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }  

重点:

Map.Entry<String, Long> entry: map.entrySet()

entry.getKey() + " : " + entry.getValue()

此处用到的是第三种:Map集合的四种遍历方式

 

返回的结果为:20171022_128 :1066  //只是获得课程id无法满足要求要求

为了匹配Echarts的name、value属性,所以需要组装一个domain:CourseClickCount

新建一个数据访问类:CourseClickCountDAO

新建query方法,返回值为List<CourseClickCount>

参考代码:

package com.imooc.dao;
import com.imooc.domain.CourseClickCount;
import com.imooc.utils.HBaseUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * 实战课程访问数量数据访问层
 */
@Component
public class CourseClickCountDAO {
    /**
     * 根据天查询
     */
    public List<CourseClickCount> query(String day) throws Exception {
        List<CourseClickCount> list = new ArrayList<>();
        // 去HBase表中根据day获取实战课程对应的访问量
        Map<String, Long> map = HBaseUtils.getInstance().query("imooc_course_clickcount","20171022");
        for(Map.Entry<String, Long> entry: map.entrySet()) {
            CourseClickCount model = new CourseClickCount();
            model.setName(entry.getKey());
            model.setValue(entry.getValue());
            list.add(model);
        }
        return list;
    }
    public static void main(String[] args) throws Exception{
        CourseClickCountDAO dao = new CourseClickCountDAO();
        List<CourseClickCount> list = dao.query("20171022");
        for(CourseClickCount model : list) {
            System.out.println(model.getName() + " : " + model.getValue());
        }
    }
}

 

但是,得到的还是课程Id,还没有具体的名称,所以还要加一层映射关系

建立Web层ImoocStatApp:

/**
 * web层
 */
@RestController
public class ImoocStatApp {
    private static Map<String, String> courses = new HashMap<>();
    static {
        courses.put("112","Spark SQL慕课网日志分析");
        courses.put("128","10小时入门大数据");
        courses.put("145","深度学习之神经网络核心原理与算法");
        courses.put("146","强大的Node.js在Web开发的应用");
        courses.put("131","Vue+Django实战");
        courses.put("130","Web前端性能优化");
    }
    @Autowired
    CourseClickCountDAO courseClickCountDAO;
//    @RequestMapping(value = "/course_clickcount_dynamic", method = RequestMethod.GET)
//    public ModelAndView courseClickCount() throws Exception {
//        ModelAndView view = new ModelAndView("index");
//        List<CourseClickCount> list = courseClickCountDAO.query("20171022");
//        for(CourseClickCount model : list) {
//            model.setName(courses.get(model.getName().substring(9)));
//        }
//        JSONArray json = JSONArray.fromObject(list);
//        view.addObject("data_json", json);
//        return view;
//    }
    @RequestMapping(value = "/course_clickcount_dynamic", method = RequestMethod.POST)
    @ResponseBody
    public List<CourseClickCount> courseClickCount() throws Exception {
        List<CourseClickCount> list = courseClickCountDAO.query("20171022");
        for(CourseClickCount model : list) {
            model.setName(courses.get(model.getName().substring(9)));
        }
        return list;
    }
    @RequestMapping(value = "/echarts", method = RequestMethod.GET)
    public ModelAndView echarts(){
        return new ModelAndView("echarts");
    }
}

 

static{}内容应该配到数据库里面去,此处只是为了方便

另外需要添加注解

ImoocStatApp:@RestController

CourseClickCountDAO层:@Component

HelloBoot:@RestController

domain/CourseClickCount:@Component

自动装载:@Autowired

如果不是用ajax获取数据则:ModelAndView courseClickCount()

若是则升级成:List<CourseClickCount> courseClickCount()

 

注意:json格式需要添加依赖

net.sf.json-lib:json-lib:2.4:jdk1.5(classifier)

 

substring(9)  //从第9位取到最后

 

动态页面设计,data删除后,栏目不见:

legend: {
orient: 'vertical',
left: 'left'
},

引入Echarts、JQuery(使用Ajax交互需要)的js文件:

<!-- 引入 ECharts 文件 -->
<script src="js/echarts.min.js"></script>

<!-- 引入 jQuery 文件 -->
<script src="js/jquery.js"></script>

修改series下的data,原先:

data:[
                    {value:3350, name:'Spark SQL项目实战'},
                    {value:3100, name:'Hadoop入门'},
                    {value:2340, name:'Spark Streaming项目实战'},
                    {value:1350, name:'大数据面试题'},
                    {value:15480, name:'Storm项目实战'}
                ],

  

修改后:

data: (function(){ //<![CDATA[
                    var datas = [];
                    $.ajax({
                        type: "POST",
                        url: "/imooc/course_clickcount_dynamic",
                        dataType: 'json',
                        async: false,
                        success: function(result) {
                            for(var i=0; i<result.length; i++) {
                                datas.push({"value":result[i].value, "name":result[i].name})
                            }
                        }
                    })
                    return datas;
                    //]]>
                })(),

  

没有加会报类型错误

//<![CDATA[

//]]>

 

打包到生产上面:

在本地的project文件夹目录下:mvn clean package -DskipTests

scp jar包 到linux上

启动包:java -jar jar包名

慕课网实战sparkstreaming实时流处理项目实战笔记九之铭文升级版

铭文一级:核心概念:StreamingContextdefthis(sparkContext:SparkContext,batchDuration:Duration)={this(sparkContext,null,batchDuration)}defthis(conf:SparkConf,batchDuration:Duration)={this(StreamingContext.createN 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记三之铭文升级版

铭文一级:Flume概述Flumeisadistributed,reliable,andavailableserviceforefficientlycollecting(收集),aggregating(聚合),andmoving(移动)largeamountsoflogdatawebserver(源端)===>flume===>hdfs(目的地)设计目标: 可靠性 扩展性 管理性业界同 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记十一之铭文升级版

铭文一级:第8章SparkStreaming进阶与案例实战黑名单过滤访问日志==>DStream20180808,zs20180808,ls20180808,ww==>(zs:20180808,zs)(ls:20180808,ls)(ww:20180808,ww)黑名单列表==>RDDzsls==>(zs:true)(ls:true) ==>20180808 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记五之铭文升级版

铭文一级:单节点单broker的部署及使用$KAFKA_HOME/config/server.propertiesbroker.id=0listenershost.namelog.dirszookeeper.connect启动Kafkakafka-server-start.shUSAGE:/home/hadoop/app/kafka_2.11-0.9.0.0/bin/kafka-server-st 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记十七之铭文升级版

...问量yyyyMMddcourseid使用数据库来进行存储我们的统计结果 SparkStreaming把统计结果写入到数据库里面 可视化前端根据:yyyyMMddcourseid把数据库里面的统计结果展示出来选择什么数据库作为统计结果的存储呢? RDBMS:MySQL、Oracle... daycour... 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记六之铭文升级版

铭文一级:整合Flume和Kafka的综合使用avro-memory-kafka.confavro-memory-kafka.sources=avro-sourceavro-memory-kafka.sinks=kafka-sinkavro-memory-kafka.channels=memory-channelavro-memory-kafka.sources.avro-source.type= 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记十五之铭文升级版

铭文一级:[木有笔记]铭文二级:第12章SparkStreaming项目实战行为日志分析:1.访问量的统计2.网站黏性3.推荐 Python实时产生数据访问URL->IP信息->referer和状态码->日志访问时间->写入到文件中本地与虚拟机都要装了python... 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记十九之铭文升级版

铭文一级:(没有内容)铭文二级:创建Springboot项目:看官网,QuickStart下面有两个依赖,必须得使用但是如果用IDEA构建Springboot,则会自动添加NewProject->SpringInitializr->Next任意确定:com.imooc.sparkweb选版本、点击左边的web->... 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记七之铭文升级版

铭文一级:第五章:实战环境搭建Spark源码编译命令:./dev/make-distribution.sh--name2.6.0-cdh5.7.0--tgz-Pyarn-Phadoop-2.6-Phive-Phive-thriftserver-Dhadoop.version=2.6.0-cdh5.7.0铭文二级:第五章:实战环境搭建(所有都配置到环境变量)1、Scala的安装:Downl 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记十八之铭文升级版

铭文一级:功能二:功能一+从搜索引擎引流过来的HBase表设计create‘imooc_course_search_clickcount‘,‘info‘rowkey设计:也是根据我们的业务需求来的20171111+search+1项目打包:mvncleanpackage-DskipTests报错:[ERROR]/Users/rocky/source/work/sparktrain/sr... 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记二十之铭文升级版

铭文一级:SpringBoot整合Echarts动态获取HBase的数据1)动态的传递进去当天的时间 a)在代码中写死 b)让你查询昨天的、前天的咋办? 在页面中放一个时间插件(jQuery插件),默认只取当天的数据2)自动刷新展示图 每隔多久发送一个... 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记十六之铭文升级版

铭文一级:linuxcrontab 网站:http://tool.lu/crontab 每一分钟执行一次的crontab表达式:*/1****crontab-e */1****/home/hadoop/data/project/log_generator.sh对接python日志产生器输出的日志到Flumestreaming_project.conf选型:access.log==>控制台输出 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记二十一之铭文升级版

铭文一级:DataV功能说明1)点击量分省排名/运营商访问占比 SparkSQL项目实战课程:通过IP就能解析到省份、城市、运营商2)浏览器访问占比/操作系统占比 Hadoop项目:userAgentDataV访问的数据库(MySQL),需要能够在公网上访问DataV测试... 查看详情

sparkstreaming实时流处理项目实战

SparkStreaming实时流处理项目实战网盘地址:https://pan.baidu.com/s/1wmfez6_mOTUquRFBpCqhhw密码:kbty备用地址(腾讯微云):https://share.weiyun.com/176190792247a0fba33c6c6759ece61b密码:aamg4t第1章课程介绍课程介绍第2章初识实时流处理本章节将从一个... 查看详情

sparkstreaming实时流处理项目实战sparkstreaming整合kafka实战一(代码片段)

SparkStreaming整合Kafka实战SparkStreaming对kafka的支持SparkStreaming整合kafka的两种方式receiver方式:基于线程拉取数据direct方式:直接连接模式1.Receiver-basedApproachkafka对接streaming实战SparkStreaming对kafka的支持sparkstreaming官 查看详情

sparkstreaming实时流处理项目实战

第1章课程介绍  1-1-导学-  1-2-授课习惯和学习建议  1-3-OOTB环境使用演示  1-4-Linux环境及软件版本介绍  1-5-Spark版本升级第2章初识实时流处理  2-1-课程目录  2-2-业务现状分析 ... 查看详情

基于flume+kafka+sparkstreaming打造实时流处理项目实战课程

...消息队列Kafka、分布式列式数据库HBase、及当前最火爆的SparkStreaming打造实时流处理项目实战,让你掌握实时处理的整套处理流程,达到大数据中级研发工程师的水平!下载地址:百度网盘下载    IT交流群:9780552 查看详情

pk2227-sparkstreaming实时流处理项目实战

PK2227-SparkStreaming实时流处理项目实战新年伊始,学习要趁早,点滴记录,学习就是进步!随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你... 查看详情