前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spark运用-恢复实时数据

Spark运用-恢复实时数据

作者头像
每天学Java
发布2020-06-01 10:43:51
4890
发布2020-06-01 10:43:51
举报
文章被收录于专栏:每天学Java每天学Java
业务背景

目前在个人的网站和小程序中上线了文章模块,于是想在网站的功能集锦模块中将每日文章访问的实时数据进行展示, 由于当作一个小的功能集成到网站中,所以并没有使用太多的中间件, 只是单纯的在拦截器那里加一些逻辑将文章访问数据存入到内存中(并不是Redis),然后提供接口将数据在页面上进行展示。于是就出现了一个问题,由于是小功能嵌入到网站上,更改重启很频繁,导致每次重启今日文章数据都会丢失, 最终想到利用Spark来恢复每日数据。

呈现效果

网址:www.study-java.cn

微信小程序:每天学Java

解决过程

1.在存入内存前,将访问数据存入日志中记录下来。

2.启动项目过程中,利用Spark解析日志,恢复日志数据。

实现过程

Order配合ApplicationRunner代表启动执行run方法。

代码语言:javascript
复制
@Component
@Order(3)
public class AnalysedArticle implements ApplicationRunner, Serializable {
    private Logger logger = LoggerFactory.getLogger(AnalysedArticle.class);

    @Override
    public void run(ApplicationArguments args) throws Exception {
        logger.info("恢复数据");
        reSume();
    }
    
    //重启恢复今日的文章访问量
    public void reSume() {
        LocalDate date = LocalDate.now();
        String logFile = "file:///home/project/email/viewJar/log/" + date + ".json";
        SparkConf sparkConf = new SparkConf().setAppName("Resume").setMaster("local[4]");
        JavaSparkContext sc = null;
        try {
        sc = new JavaSparkContext(sparkConf);
        //导入文件
        JavaRDD<String> logData = sc.textFile(logFile).cache();
        
        logData.foreach(new VoidFunction<String>() {
            @Override
            public void call(String s) throws Exception {
                logger.info(s);
                JSONObject jsonObject = JSON.parseObject(s);
                String url;
                if ((url = jsonObject.getString("url")).contains(".md")) {
                    //DataModal使用Map存储数据
                    DataModal.put(url);
                }
            }
        });
        }finally {
            sc.close();
        }

    }

    public static void main(String[] args) {
        new AnalysedArticle().reSume();
    }


}

DataModal

代码语言:javascript
复制
public class DataModal {
    //日期->文章后缀:数量
    private static Map<String, Map<String, AtomicInteger>> map;

    static {
        map = new HashMap<>();
    }


    public static void put(String url) {
        synchronized (DataModal.map) {
            LocalDate date = LocalDate.now();
            Map<String, AtomicInteger> map2 = DataModal.map.get(date.toString());
            if (map2 == null) {
                Map<String, AtomicInteger> map3 = new HashMap<>();
                DataModal.map.put(date.toString(), map3);
                DataModal.map.get(date.toString()).put(url.substring(url.lastIndexOf("/") + 1), new AtomicInteger(1));
            } else {
                AtomicInteger atomicInteger = DataModal.map.get(date.toString()).get(url.substring(url.lastIndexOf("/") + 1));
                if (atomicInteger != null) {
                    atomicInteger.incrementAndGet();
                } else {
                    DataModal.map.get(date.toString()).put(url.substring(url.lastIndexOf("/") + 1), new AtomicInteger(1));
                }

            }
        }
    }

    public static  Map<String, AtomicInteger> get(LocalDate localDate){
       return DataModal.map.get(localDate.toString());
    }
    
    public static void remove(){
       //凌晨清空数据
       map = null;
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 业务背景
  • 呈现效果
  • 解决过程
  • 实现过程
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档