夏日已至,气温升高,又到了一年难熬的梅雨季节。作为一名技术宅,我望了眼藏在角落里吃灰的树莓派,便萌生了通过树莓派完成数据采集,经过大数据处理,得到可视化家庭温湿度报表的想法。
最终的效果如下,我产出了两个看版,第一个可以看到最近1小时每分钟的温湿度情况,第二个可以看到一天每小时的温湿度情况。
大数据处理流程概览
首先,我们先来了解一下大数据处理的主要步骤,主要为数据产生、数据采集与存储、数据分析与处理、数据应用4个步骤,通过访问阿里云大数据产品官网,可以了解到这些信息:
  1. 数据产生:业务系统每天产生的大量业务数据、日志,存储在各自独立的数据源里。
  2. 数据采集与存储:通过DataWorks提供数据集成服务,可以将多种数据源类型,根据设定的调度任务,定时同步系统的数据至MaxCompute。
  3. 数据分析与处理:完成数据采集后,可以在MaxCompute中对数据进行离线处理(俗称ETL过程,Extract-Transform-Load);也可以结合Flink和Hologres对数据进行实时处理。
  4. 数据应用:数据加工完成后,可以通过报表进行可视化展示与分享。
图片来源:https://www.aliyun.com/product/bigdata/ide

我整理出了本次实现案例的数据开发方案,如下图所示:
  • 数据产生:树莓派连接温湿度传感器,间隔2秒读取数据,并实时上报到SLS日志服务进行存储。
  • 数据采集与存储:使用数据集成工具,将SLS日志服务的数据同步至MaxCompute。
  • 数据分析与处理:遵循数仓规范,在DataWorks里完成数据开发。
  • 数据应用:将开发完成的数据关联到QuickBI,进行可视化报表搭建。

接下来,我们按照这个流程逐步实现。
一、数据产生
概览:使用树莓派连接温湿度传感器,基于JavaScript我们可以快捷完成数据的读取,随后基于阿里云SLS服务,将采集到的数据实时上报并存储。 

什么是树莓派


图片来源:https://www.raspberrypi.com/products/raspberry-pi-4-model-b/

树莓派于2012年问世,外形只有信用卡大小,它是一款基于ARM的微型电脑主板,却具有电脑的所有基本功能,此外还具有GPIO接口能力,可以很方便完成与硬件的通信。
它出现的本意并非撼动消费者市场,而是以低廉的价格去促进计算机教育,做出好玩的实验,这是树莓派流行的主要原因。

什么是GPIO编程

GPIO(General-Purpose IO Ports),即通用IO接口。GPIO主要分为输入和输出两种功能。可以实现一些简单设备的控制。比如在输入模式下,将该IO连接传感器,可以用于检测外部状态;当作为输出时,可以通过输出高/低电平来控制外部设备的运转。
树莓派天然支持GPIO编程,以树莓派4B为例,它提供了40个接口,其中21个为GPIO接口,见下图圈出来的位置。

图片来源:https://pinout.xyz/
树莓派目前提供多种编程语言的开发SDK,这极大地降低了我们操作硬件的成本,我们不需要掌握电位变化的基础知识,只需要调用API便可以轻松读取数据,接下来我们来介绍本文的核心 -- DHT11温湿度传感器。

DHT11温湿度传感器

DHT11温湿度传感器,可以测量20-90%的湿度区间, 0~50℃的温度区间,采样周期 >= 1秒/次,外观如下图所示:

图片来源:https://developer.aliyun.com/
article/843529

它包含三个针脚,分别是电源正负极、一个数据针脚。通过将信号针脚与树莓派的某一个GPIO针脚连接,便可以源源不断的读取信息。

采集与上报数据

我们按照下图将树莓派与传感器进行连接,其中传感器的数据针脚连接到树莓派的编号为21的GPIO针脚。

连接成功后,我们基于开源项目 node-dth-sensor 来完成传感器数据的获取,只需要编写简单的JavaScript代码,调用 read 方法,就可以获取到温湿度数据,如下所示:
const
 sensor = 
require
(
"node-dht-sensor"
);

const
 SENSOR_TYPE = 
11
// 传感器类型,本例为DHT11型号传感器,因此赋值为11
const
 GPIO_PIN = 
21
;
// GPIO针脚编号,本例中连接到了21编号,这里根据实际连线情况需要变化参数。
sensor.read(SENSOR_TYPE, GPIO_PIN, 
function (err, temperature, humidity
{

if
 (!err) {

console
.log(
"temperature"
, temperature, 
"humidity"
, humidity);

    }

  });

随后,我们结合阿里云SLS日志服务,每隔2秒,做一次数据上报,示意代码如下:
const
 sensor = 
require
(
"node-dht-sensor"
);

const
 SLS = 
require
(
"./sls"
); 
// 基于sls日志服务的sdk做简单封装
const
 projectName = 
"自定义"
;

const
 logStoreName = 
"自定义"
;

const
 reporter = 
new
 SLS(projectName);

const
 SENSOR_TYPE = 
11
// 传感器类型,本例为DHT11型号传感器,因此赋值为11
const
 GPIO_PIN = 
21
// GPIO针脚编号,本例中连接到了21编号,这里根据实际连线情况需要变化参数。
setInterval(
() =>
 {

  sensor.read(SENSOR_TYPE, GPIO_PIN, 
function (err, temperature, humidity
{

if
 (!err) {

      reporter.put(logStoreName, {

        temperature,

        humidity,

      });

    }

  });

}, 
2000
);


最后,我们使用pm2运行该段脚本,使其在后台常驻运行:
$ pm2 start dht11.js
进入SLS日志服务控制台,检查是否有数据上报成功:
二、数据采集与存储
概览:这一节我们的目标是将SLS的日志数据采集并存储到MaxCompute里,本案例中我们为了尽可能实时地看到数据情况,将数据采集的频率设置为5分钟/次,实现近实时数据采集,也可以大致满足我们的需求。 
第一步:建立需要存储同步后的数据的表,按照数仓规范,存放业务源头数据的表,我们需要将其命名为ods_前缀,其英文全称为Operational Data Store,在数据分析与处理章节,我们会详细介绍。


第二步:使用数据集成工具完成数据同步,获取SLS里的上报时间需要将采集字段命名为__receive_time__

第三步:设置任务调度时间,每5分钟执行一次,每次获取执行时向前5分钟的数据,在调度配置里使用$[yyyymmddhh24miss]参数表达当前时间(精确到秒),使用$[yyyymmddhh24miss-1/24/60*5]参数表达当前时间的前5分,提交任务,进入到运维中心后,便可以看到调度任务已经在等待中了。

第四步:使用临时查询工具,检查数据是否成功同步。
三、数据分析与处理
概览:在Dataworks里进行数据处理,依据数仓建设规范分别构建ODS层、DWD层、DWS层、ADS层。根据上报的温湿度明细数据,计算出最近1小时每分钟的温湿度数据、每天每小时的温湿度数据。 
首先,在数据分析处理之前,需要先明确最终需要产出的结果是什么:
  • 最近1小时每分钟的温湿度情况
  • 每小时的温湿度变化情况以及是否舒适
  • 每日舒适率
以下是个人的定义,不一定严谨,仅供参考:
  • 舒适区间:人体感觉适宜的温度在22到26度之间,相对湿度在40%到70%,在这样的温度和湿度的环境下人体感觉相对比较舒服。
  • 舒适率:(舒适小时数 / 当天已统计小时数) * 100%,例如 上午10:00,当天共统计10个小时,其中舒适小时数为5个小时,因此当天舒适率为 (5/10)*100% = 50%
随后我们进行数据处理阶段,数据处理阶段是非常灵活的,为了尽可能让数据资产规范可持续消费,应当遵循一定规范进行建设,目前业界普遍按照维度建模和数仓建模的思路来组织整个开发过程,具体如下:
  • 第一步:构建ODS层,目标是1比1完整接入,不考虑易用性,仅仅要求全。这一步将SLS日志同步到ods_sensor表里
  • 第二步:构建DWD层,目标是加入规范,数据清洗,拼接相关字段,让数据好用。这一步将ods_sensor里的日期时间戳转化为标准的date格式,并且完成是否为舒适数据的判断,最终生产为dwd_sensor表
  • 第三步:构建DWS层,目标是对数据适度汇总,让数据易用。这一步根据dwd_sensor表,生产出最近1小时和每小时的轻度汇总表,分别为dws_sensor_latest_1h和dws_sensor_1day
  • 第四步:构建ASD层,与业务直接关联的需求在此完成,上述舒适率便是一个个性化需求,因此放在这里构建,产出ads_comfort_rate_day
最终构建后的数仓结构如下(在dataworks里以可视化方式呈现表依赖关系):
四、数据应用
概览:这一步只需要将产出的数据表,关联到Quick BI中,便可以快捷搭建出可视化看板。 
第一步:新建数据源,与MaxCompute形成关联,随后便可以获取到所有的表信息

第二步:新建数据集,将MaxCompute表在这里进一步加工,例如调整名称,字段类型调整,展示格式调整。

第三步:搭建看板,挑选适合的图表,将字段关联,你还可以增加各种过滤器进行筛选。

五、小结
通过采集温湿度数据并进行可视化处理,让沉睡已久的树莓派重新焕发生机,整个过程是充满乐趣的。提及日常生活,我们每天每个人其实都在不断地产生数据,大数据离我们并不远,运动手环、智能家居、购物推荐其实都在无形应用着这些数据,我们既是生产者,亦是消费者。
希望本文可以唤起大家动手进行大数据处理的热情,采集并消费身边的数据,人人都可以做大数据分析。

关注「Alibaba F2E」微信公众号把握阿里巴巴前端新动向
继续阅读
阅读原文