搭建批处理系统

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 搭建批处理系统

故事背景


友圈一位要做毕设的小姐姐在求助postman怎么用,我就帮她答疑了一下。

我知道她的专业不是计算机相关的,所以很奇怪为什么要用postman。

原来她的毕设是要基于微博上最近10年关于房价的话题数据,来做分析,做未来房价的走势预测,训练模型。

她经过一番调研之后决定用百度的【语言处理技术】,实现基础数据的语义分析,即:情感极性分类结果,0负向、1中性、2正向。


官方提供的是基于postman的演示demo,虽然对咱们专业人士来讲很简答,但是对学文科的小姐姐还是有一定门槛的。

我教会小姐姐postman的使用之后问了她一个问题:


搞定数据源


小姐姐已经通过某宝拿到了20W+关于房价的微博数据,现在需要做的就是基于语义分析来获得这20W+数据集对房价走势的判断(我们使用了百度提供的【语言处理技术 NLP】服务),通过Navicat直接导入Excel中的数据源即可。


  1. 首先根据数据源和百度语义接口返回结果,设计mysql表结构。


微信图片_20221112124917.jpg


  1. 考虑到数据有20万+,利用了mysql的可视化工具[Navicat]导入数据,也方便小姐姐操作。


微信图片_20221112124922.jpg


微信图片_20221112124925.jpg



微信图片_20221112124930.jpg



注意:要做好表格源字段和目标字段的匹配


微信图片_20221112124933.jpg


  1. 首次导入选择直接追加;后续优化模型重复导入数据时选择更新。


微信图片_20221112124938.jpg


  1. 点击开始即可导入Excel源数据到mysql数据库中


微信图片_20221112124942.jpg


  1. 导入完成,在Navicat控制台通过查询命令,共查询到231007条数据


微信图片_20221112124947.jpg


搭建开发环境


考虑到小姐姐最终的目的是训练模型,而非学习编程,所以搭建开发环境还是怎么简单怎么来, 所以我就推荐她使用LNMP一键安装包,10几分钟左右就把LNMP环境搭建好了


撸代码


脚本关键代码及思路:


字段说明:


mysql语句中 liuxx 是数据库名 semantic_analysis是表名


代码设计思路:


使用do while循环,批量循环请求百度AI语义分析接口,查询positive_prob=0的数据(即未进行语义分析的数据)。

当查询不到数据时,说明所有数据已经成功请求百度语义分析接口,且将返回结果更新到数据表中。


注意问题:


每次查询之后都会休眠1秒,因为百度免费版语义分析请求接口有QPS限制,避免出现无效请求


实现流程


查询数据:


  1. 查询条件是 positive_prob=0(代表本条数据未请求百度接口)
  2. 查询排序: 根据id倒序
  3. 查询翻页: 每次查询10条


处理数据,请求百度接口:


  1. 将查询到的数据进行json_encode()处理,进而请求百度接口


处理百度返回结果


  1. 异常处理:当百度返回的error_code为282131时,表示文本内容过长,超过了百度语义分析的字数限制。
  2. mysql会将不符合百度语义分析的数据源删除,不再重复请求
  3. 输出返回结果,方便查询信息,定位问题


将返回结果更新到数据表中


  1. 当百度的返回结果 positive_prob 字段的值不为0时,表示语义分析成功,已返回结果
  2. 将返回的结果更新到mysql数据表中


批处理脚本核心文件代码:


文件名:batchProcessing.php


<?php
ini_set('memory_limit', '256M'); //内存管理
include '../include/ConfigLiuxx.php'; //引入数据配置文件
include '../include/Db.php';//引入db数据库
include '../include/Logger.php';//引入log文件
include '../include/Request.php';//引入 http请求文件
define('Index_table', 'semantic_analysis'); //设置数据表名 语义分析
$db_liuxx = new Db($db_liuxx); //引入db配置文件
/**
 * 百度语义分析脚本
 */
$access_token = "xxxxxxxxxxx";  //百度提供的token
$url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=' . $access_token; //按百度要求拼接请求url
$limit = 10;
$offset = 0;
do {
    $datas = $db_liuxx->get_all('select * from liuxx.semantic_analysis WHERE positive_prob = 0  order by id desc limit ' . $offset . ',' . $limit);
    foreach ($datas as $key => $value) {
        $id = $value['id'];
        $text = $value['text'];
        $params = ['text' => $text];
        $bodys = json_encode($params);
        $response = request_post($url, $bodys);
        $res_data = json_decode($response, true);
        if ($res_data['error_code'] == 282131) {
            $db_liuxx->query('delete from liuxx.semantic_analysis WHERE id = ' . $id);
            var_dump($id . '  文本过长 删除');
        }
        echo 'id:';
        var_dump('百度返回:');
        var_dump($res_data);
        $data = [
            'positive_prob' => $res_data['items'][0]['positive_prob'],
            'confidence' => $res_data['items'][0]['confidence'],
            'negative_prob' => $res_data['items'][0]['negative_prob'],
            'sentiment' => $res_data['items'][0]['sentiment'],
            'ctime' => time(),
        ];
        if ($data['positive_prob']) {
            var_dump($data);
            //更新条件
            $condition = 'id = ' . $id;
            $res = $db_liuxx->query('update liuxx.semantic_analysis set positive_prob = ' . $data['positive_prob'] . ', confidence = ' . $data['confidence'] . ', negative_prob = ' . $data['negative_prob'] . ', sentiment = ' . $data['sentiment'] . ' where id = ' . $id);
            var_dump($res);
        } else {
            var_dump('百度未返回结果');
        };
    }
    sleep(1);
} while (!empty($datas)); //能查到数据就一直循环
?>
/**
 * 发起http post请求(REST API), 并获取REST请求的结果
 * @param string $url
 * @param string $param
 * @return - http response body if succeeds, else false.
 */
function request_post($url = '', $param = '')
{
    if (empty($url) || empty($param)) {
        return false;
    }
    $postUrl = $url;
    $curlPost = $param;
    // 初始化curl
    $curl = curl_init();
    // 抓取指定网页
    curl_setopt($curl, CURLOPT_URL, $postUrl);
    // 设置header
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 要求结果为字符串且输出到屏幕上
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    // post提交方式
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
    // 运行curl
    $data = curl_exec($curl);
    curl_close($curl);
    return $data;
}


执行批处理脚本


nohup:表示脚本生成的log日志和打印信息输出到nohup.log文件中

&:表示脚本后台运行


nohup php batchProcessing.php &


获得结果


脚本运行完毕后,即可在mysql中查询到经百度语义分析接口处理过的数据,结果示例如下图:


微信图片_20221112124950.jpg


导出数据


通过Navcat工具,小姐姐就可以方便的将mysql数据结果导出到Excel。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 缓存 算法
【自己动手画CPU】存储系统设计
博文“【自己动手画CPU】存储系统设计”探讨了在自制 CPU 中存储系统的设计。存储系统是计算机中至关重要的组成部分,负责存储和检索数据。文章介绍了在 DIY CPU 中实现存储系统的关键考虑因素,包括存储器的类型、存储器与 CPU 的连接方式以及数据存取的速度和效率。通过深入探讨存储系统的设计原理和实现方式,读者可以更好地理解计算机内部结构,并且为自己动手设计和构建 CPU 提供了有益的指导和启发。
184 0
【自己动手画CPU】存储系统设计
|
资源调度 分布式计算 安全
伏羲—阿里云分布式调度系统
在12月12日的云栖社区在线培训上,“飞天”分布式系统核心开发人员陶阳宇分享了《伏羲-阿里云分布式调度系统》。他主要从伏羲系统架构、任务调度、资源调度、容错机制、规模挑战、安全与性能隔离方面介绍了伏羲分布式系统架构和设计理念。
22088 0
|
3月前
高性能并行编程与优化 | 第02讲回家作业
本文是关于高性能并行编程与优化课程的第二讲回家作业,包括作业要求、初始运行结果、抄的答案以及改进后的运行结果。作业内容涉及对双链表类`List`的修改,要求避免不必要的拷贝、修复智能指针问题、实现深拷贝构造函数、解释为什么可以删除拷贝赋值函数以及改进`Node`的构造函数。同时,还提供了如何提交作业、设置https代理的链接以及评分规则。
高性能并行编程与优化 | 第02讲回家作业
|
3月前
|
C++
高性能并行编程与优化 | 第01讲回家作业
本文是关于高性能并行编程与优化的回家作业,涉及CMake错误解决、编译问题处理、代码和编译结果分享、使用方法说明以及躺坑记录。
高性能并行编程与优化 | 第01讲回家作业
|
3月前
高性能并行编程与优化 | 第03讲回家作业
本文是关于高性能并行编程与优化课程的第三讲回家作业,包括题目要求、代码答案抄写以及成功运行的截图。
高性能并行编程与优化 | 第03讲回家作业
|
3月前
|
算法 编译器
高性能并行编程与优化 | 第04讲回家作业
本文是关于高性能并行编程与优化课程的第四讲回家作业,包括作业要求、原始代码运行结果、优秀的代码答案以及优化后的运行结果和解析。作业目标是利用所学知识优化多体引力求解器的代码,要求不能使用多线程并行和算法复杂度优化,但可以通过编译器和平台优化来提升性能。
高性能并行编程与优化 | 第04讲回家作业
|
4月前
|
存储 分布式计算 算法
"揭秘!MapReduce如何玩转压缩文件,让大数据处理秒变‘瘦身达人’,效率飙升,存储不再是烦恼!"
【8月更文挑战第17天】MapReduce作为Hadoop的核心组件,在处理大规模数据集时展现出卓越效能。通过压缩技术减少I/O操作和网络传输的数据量,不仅提升数据处理速度,还节省存储空间。支持Gzip等多种压缩算法,可根据需求选择。示例代码展示了如何配置Map输出压缩,并使用GzipCodec进行压缩。尽管压缩带来CPU负担,但在多数情况下收益大于成本,特别是Hadoop能够自动处理压缩文件,简化开发流程。
73 0
|
7月前
|
缓存 Rust 安全
rcore 笔记 批处理系统 邓氏鱼(一)
rcore 笔记 批处理系统 邓氏鱼
137 0
|
7月前
|
Rust 数据处理
rcore 笔记 批处理系统 邓氏鱼(三)
rcore 笔记 批处理系统 邓氏鱼
112 0
|
7月前
|
存储 缓存 Rust
rcore 笔记 批处理系统 邓氏鱼(二)
rcore 笔记 批处理系统 邓氏鱼
82 0