阿里云EMR大数据集群网站运营数据统计完全实战指南
一、阿里云EMR大数据平台概述
阿里云开源大数据平台E-MapReduce(简称EMR)是运行在阿里云平台上的一种大数据处理系统解决方案。EMR基于开源的Apache Hadoop和Apache Spark,让用户可以方便地使用Hadoop和Spark生态系统中的其他周边系统分析和处理数据。EMR还可以与阿里云其他的云数据存储系统和数据库系统进行数据传输,例如阿里云OSS和RDS等。
阿里云EMR提供了三种产品形态,以满足不同用户的需求:
- EMR on ECS:EMR负责将开源Hadoop生态的组件安装部署在ECS上,并启动相应的服务。用户可以在EMR控制台完成对集群ECS及服务的运维操作。这种形态适合需要完全掌控集群基础设施、对底层资源有自定义需求的场景。
- EMR on ACK:用户需要先完成ACK集群的安装部署。当ACK集群准备就绪后,EMR将基于ACK的资源安装部署大数据服务组件,并在容器内运行。这种形态适合已经采用容器化架构、希望统一管理大数据和在线业务的团队。
- EMR Serverless Spark:这是一款面向Data+AI的高性能Lakehouse产品,为企业提供了一站式的数据平台服务,包括任务开发、调试、调度及运维等功能。它100%兼容开源Spark生态,能够无缝集成到客户现有的数据平台。
在实际生产环境中,EMR on ECS是最为广泛使用的形态。EMR针对不同业务场景提供了数据湖集群、数据分析集群、实时数据流集群、数据服务集群四类预定义业务场景。
需要先登录阿里云控制台,点击:阿里云控制台
二、集群创建前的准备工作
2.1 账号注册与实名认证
使用EMR服务前,首先需要注册阿里云账号并完成实名认证。这是使用任何阿里云云服务的基础前置条件。
2.2 服务角色授权
完成对E-MapReduce的服务账号授予默认的EMR和ECS角色权限。这一步是必须的,因为EMR在创建集群、管理ECS实例、访问OSS存储等操作时,需要以服务角色的身份调用其他阿里云服务的API。授权操作可以在EMR控制台的引导下完成,系统会自动创建所需的默认角色。
2.3 RAM用户与权限规划
为确保阿里云账号及云资源的使用安全,如非必要都应避免直接使用阿里云账号(即主账号)来访问EMR集群。推荐的做法是使用RAM身份(即RAM用户和RAM角色)来访问EMR on ECS集群。
RAM用户需要由阿里云账号或拥有管理员权限的RAM用户、RAM角色来创建,且必须在获得授权后才能登录控制台或使用API访问阿里云账号下的资源。在权限管理上,应遵循最小权限原则——授予用户执行某项任务所需的权限,不授予其他无需用到的权限。
对于通过控制台访问的用户,推荐为其开启MFA多因素认证。不要把RAM用户的AccessKey ID和AccessKey Secret保存在工程代码中,否则可能导致AK泄露。建议使用STS或环境变量等方式获取访问授权。
阿里云EMR提供了多种系统权限策略供用户选择:
- AliyunEMRFullAccess:管理E-MapReduce的权限,包括EMR on ECS和EMR on ACK的所有权限。
- AliyunEMRReadOnlyAccess:只读访问E-MapReduce的权限。
- AliyunEMRDeveloperAccess:开发者权限,允许用户在EMR集群上提交作业和执行开发任务。
三、创建EMR集群的关键配置
在创建EMR集群时,需要考虑以下主要因素:业务场景、地域和存储服务、元数据服务、硬件与网络配置以及计费方式。
3.1 业务场景选择
EMR提供了以下预定义的业务场景:
- 数据湖(DataLake):适用于构建企业数据湖,支持多种数据格式和计算引擎,是网站运营数据统计的常用场景。
- 数据分析(Data Analytics):适用于OLAP分析场景,集成了StarRocks等分析型引擎。
- 实时数据流(Dataflow):适用于流式数据处理场景,集成了Flink等流计算引擎。
- 数据服务(DataServing):适用于在线数据服务场景,集成了HBase等NoSQL数据库。
对于网站运营数据统计,通常选择数据湖场景,并集成Hive、Spark等核心组件。
3.2 地域与存储规划
EMR提供多个地域选项,以确保集群地域与数据存储位置保持一致。合理选择地域可降低网络延迟、满足数据本地化合规要求,并优化资源成本。建议将EMR集群部署在与数据存储(如OSS Bucket)相同的地域,以利用内网高速传输。
对于存储架构,EMR支持计算与存储一体化和计算与存储分离两种架构。计算与存储分离架构将计算集群和存储集群分开部署,数据存储在OSS或OSS-HDFS中,计算集群按需弹性扩缩容,是成本优化的最佳实践。
3.3 元数据服务配置
EMR允许将元数据存储在Data Lake Formation(DLF)、ApsaraDB RDS for MySQL以及内置MySQL中。推荐使用DLF统一元数据,便于多集群共享元数据。
3.4 硬件与网络配置
EMR提供多种实例类型,如通用型、计算优化型和内存优化型,以适应不同的业务特征。此外,EMR允许部署多个Master节点以确保服务的高可用性(HA)。
在创建EMR集群进行软件配置时,关键参数配置如下:
- 地域:建议选择华东2(上海)或其他与业务相近的地域。
- 业务场景:数据湖。
- 产品版本:选择最新版本。
- 可选服务:根据实际需求选择组件,其中Hive组件、OSS-HDFS组件在网站日志分析场景中为必选。
- 元数据:DLF统一元数据。
- 集群存储根路径:选择OSS-HDFS实例。
对于EMR集群的不同配置,DataWorks产品支持情况存在一定差异。如果需要在DataWorks上进行EMR任务开发,建议在创建EMR集群前先参考DataWorks on EMR集群配置最佳实践。
3.5 计费方式选择
EMR提供以下计费方式:
- 包年包月(Subscription):预付费模式,适用于长期稳定的业务场景,单价较低。
- 按量付费(Pay-as-you-go):后付费模式,适用于短期或临时业务场景,灵活性高。
对于网站运营数据统计这类周期性的分析任务,可以采用包年包月方式购买基础集群,配合按量付费的Task节点应对突发计算需求。
四、DataWorks环境准备与数据同步
4.1 DataWorks工作空间创建
DataWorks是阿里云提供的一站式大数据开发治理平台,与EMR深度集成,支持数据同步、数据开发、任务调度和运维监控等全流程操作。
创建工作空间的步骤如下:
- 登录DataWorks控制台,切换至目标地域。
- 单击左侧导航栏中的"工作空间",进入空间列表页面。
- 单击"创建工作空间",创建标准模式空间(生产、开发环境隔离)。
4.2 Serverless资源组购买
数据同步与调度时,需要使用DataWorks的Serverless资源组。购买步骤如下:
- 登录DataWorks控制台,切换至目标地域。
- 单击左侧导航栏的"资源组",进入资源组列表页面。
- 单击"创建资源组",选择地域和可用区,设置资源组名称,根据界面提示完成配置和付款。
4.3 数据同步至OSS
网站运营数据统计的第一步是将原始数据同步到统一的数据存储中。通常,网站的用户信息存储在关系型数据库(如MySQL)中,而访问日志则存储在日志文件或HTTP数据源中。
在DataWorks中配置数据同步链路的步骤如下:
- 新建HttpFile数据源,访问网站日志数据文件。
- 新建MySQL数据源,访问用户基本信息数据。
- 配置数据集成离线同步任务,将两种数据源的数据同步至私有OSS数据源。
- 通过EMR Hive节点创建外部表,解析OSS中存储的数据。
OSS Bucket的创建可以在OSS控制台完成。在左侧导航栏单击"Bucket列表",在Bucket列表页面单击"创建Bucket"。
五、基于Hive的数据建模与查询
5.1 创建OSS外部表
在Hive中读写OSS时,需要先创建一个external表。以下示例展示了如何使用Hive创建OSS数据库和表:
-- 在OSS指定Bucket路径上创建数据库
CREATE DATABASE website_logs LOCATION "oss://your-bucket/website_logs";
-- 使用该数据库
USE website_logs;
-- 创建用户信息外部表
CREATE EXTERNAL TABLE ods_user_info (
uid STRING COMMENT '用户ID',
name STRING COMMENT '用户姓名',
age INT COMMENT '年龄',
gender STRING COMMENT '性别',
city STRING COMMENT '城市',
register_time STRING COMMENT '注册时间'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION "oss://your-bucket/website_logs/user_info/";
-- 创建网站访问日志外部表
CREATE EXTERNAL TABLE ods_raw_log (
log_time STRING COMMENT '访问时间',
uid STRING COMMENT '用户ID',
url STRING COMMENT '访问URL',
referer STRING COMMENT '来源页面',
user_agent STRING COMMENT '用户代理',
ip STRING COMMENT '客户端IP',
status_code STRING COMMENT '状态码',
response_time STRING COMMENT '响应时间'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION "oss://your-bucket/website_logs/raw_logs/";5.2 数据质量监控配置
在DataWorks中,可以为数据加工生成的表配置数据质量监控,提前识别脏数据并进行拦截,避免脏数据影响扩大。数据质量监控可以配置规则,如空值检查、唯一性检查、数据量波动检查等。
5.3 Hive数据加工示例
使用EMR Hive节点在DataWorks中对同步至OSS的原始数据进行加工。典型的加工流程包括:
- 清洗原始网站日志数据。
- 将清洗后的日志数据与用户记录进行关联。
- 将结果汇总到可消费的ADS表中。
以下是一个Hive数据加工的示例:
-- 清洗日志数据,过滤无效记录
CREATE TABLE dwd_cleaned_log AS
SELECT
log_time,
uid,
url,
referer,
user_agent,
ip,
status_code,
response_time
FROM ods_raw_log
WHERE uid IS NOT NULL
AND status_code = '200'
AND log_time IS NOT NULL;
-- 关联用户信息,生成用户行为明细表
CREATE TABLE dwd_user_behavior AS
SELECT
l.log_time,
l.uid,
u.name,
u.city,
u.gender,
u.age,
l.url,
l.referer,
l.user_agent,
l.ip,
l.response_time
FROM dwd_cleaned_log l
LEFT JOIN ods_user_info u ON l.uid = u.uid;
-- 按天汇总用户访问统计
CREATE TABLE ads_daily_user_stats AS
SELECT
DATE(log_time) AS stat_date,
uid,
COUNT(*) AS pv,
COUNT(DISTINCT url) AS unique_pages,
AVG(CAST(response_time AS DOUBLE)) AS avg_response_time
FROM dwd_cleaned_log
GROUP BY DATE(log_time), uid;六、基于Spark SQL的数据分析与用户画像
6.1 Spark SQL外部表创建
Spark SQL同样支持创建外部表访问存储在私有OSS中的数据。以下示例展示了如何使用Spark SQL创建用户信息表和日志信息表:
-- 创建用户信息外部表
CREATE TABLE ods_user_info_d_spark
USING parquet
OPTIONS (
path "oss://your-bucket/website_logs/user_info/"
);
-- 创建日志信息外部表
CREATE TABLE ods_raw_log_d_spark
USING parquet
OPTIONS (
path "oss://your-bucket/website_logs/raw_logs/"
);6.2 Spark SQL数据加工
在DataWorks的EMR Spark SQL节点中,利用Spark SQL函数对日志表进行切分处理。典型的加工流程包括:
- 对原始日志表进行拆分,生成明细日志表(dwd层)。
- 将明细日志表与用户表通过uid字段进行关联,生成汇总用户日志表(dws层)。
- 将汇总表进一步加工为可直接用于数据消费的表(ads层)。
以下是完整的Spark SQL数据加工示例代码:
-- 步骤1:拆分日志表,生成明细日志表(dwd层)
CREATE TABLE dwd_log_info_di_spark AS
SELECT
log_time,
uid,
url,
referer,
user_agent,
ip,
status_code,
response_time,
-- 使用Spark SQL内置函数提取日期
DATE(log_time) AS log_date,
HOUR(log_time) AS log_hour,
-- 使用内置函数解析IP地址的地理位置
CASE
WHEN ip LIKE '192.168.%' THEN '内网'
WHEN ip LIKE '10.%' THEN '内网'
WHEN ip LIKE '172.16.%' THEN '内网'
ELSE '公网'
END AS network_type
FROM ods_raw_log_d_spark
WHERE uid IS NOT NULL AND log_time IS NOT NULL;
-- 步骤2:关联用户信息,生成汇总用户日志表(dws层)
CREATE TABLE dws_user_info_all_di_spark AS
SELECT
l.log_date,
l.log_hour,
l.uid,
u.name,
u.city,
u.gender,
u.age,
l.url,
l.referer,
l.user_agent,
l.network_type,
l.response_time,
l.status_code
FROM dwd_log_info_di_spark l
INNER JOIN ods_user_info_d_spark u ON l.uid = u.uid;
-- 步骤3:生成用户画像汇总表(ads层)
CREATE TABLE ads_user_info_1d_spark AS
SELECT
uid,
MAX(name) AS user_name,
MAX(city) AS city,
MAX(gender) AS gender,
MAX(age) AS age,
COUNT(*) AS total_visits,
COUNT(DISTINCT log_date) AS active_days,
COUNT(DISTINCT url) AS unique_pages_viewed,
AVG(CAST(response_time AS DOUBLE)) AS avg_response_time,
-- 用户活跃时段偏好
MAX(CASE WHEN log_hour BETWEEN 6 AND 11 THEN 'morning'
WHEN log_hour BETWEEN 12 AND 17 THEN 'afternoon'
WHEN log_hour BETWEEN 18 AND 23 THEN 'evening'
ELSE 'night' END) AS preferred_time_slot
FROM dws_user_info_all_di_spark
GROUP BY uid;6.3 使用Spark SQL进行网站运营指标统计
以下是一些常用的网站运营数据统计SQL示例:
-- 统计每日PV和UV
SELECT
log_date,
COUNT(*) AS pv,
COUNT(DISTINCT uid) AS uv
FROM dwd_log_info_di_spark
GROUP BY log_date
ORDER BY log_date DESC;
-- 统计各城市的用户访问量
SELECT
city,
COUNT(DISTINCT uid) AS user_count,
COUNT(*) AS visit_count
FROM dws_user_info_all_di_spark
GROUP BY city
ORDER BY visit_count DESC;
-- 统计各页面的访问热度
SELECT
url,
COUNT(*) AS page_views,
COUNT(DISTINCT uid) AS unique_visitors
FROM dwd_log_info_di_spark
GROUP BY url
ORDER BY page_views DESC
LIMIT 20;
-- 统计用户留存率(以7天为例)
WITH daily_users AS (
SELECT
log_date,
uid
FROM dwd_log_info_di_spark
GROUP BY log_date, uid
),
first_visit AS (
SELECT
uid,
MIN(log_date) AS first_date
FROM daily_users
GROUP BY uid
)
SELECT
f.first_date,
COUNT(DISTINCT f.uid) AS new_users,
COUNT(DISTINCT d.uid) AS retained_users_7d,
ROUND(COUNT(DISTINCT d.uid) * 100.0 / COUNT(DISTINCT f.uid), 2) AS retention_rate_7d
FROM first_visit f
LEFT JOIN daily_users d
ON f.uid = d.uid
AND d.log_date = DATE_ADD(f.first_date, 7)
GROUP BY f.first_date
ORDER BY f.first_date DESC;七、基于Flink的实时数据统计
7.1 实时数据流架构
对于需要实时统计网站运营数据的场景,可以使用EMR Kafka和实时计算Flink构建实时数据流处理链路。通过采集程序将业务数据、日志和埋点数据等投递到EMR Kafka,利用Flink的实时计算功能将数据写入不同的分析系统,例如EMR StarRocks、EMR HBase和阿里云的实时数仓Hologres,以提供实时分析、点查调用和BI报表分析等操作。
Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了更高抽象层的API以便编写分布式任务。
7.2 Flink实时统计示例
以下是一个使用Flink SQL进行实时网站流量统计的示例:
-- 创建Kafka源表(实时访问日志流)
CREATE TABLE kafka_log_source (
log_time STRING,
uid STRING,
url STRING,
referer STRING,
user_agent STRING,
ip STRING,
status_code STRING,
response_time STRING,
proc_time AS PROCTIME()
) WITH (
'connector' = 'kafka',
'topic' = 'website_logs',
'properties.bootstrap.servers' = 'your-kafka-broker:9092',
'properties.group.id' = 'flink_consumer_group',
'scan.startup.mode' = 'latest-offset',
'format' = 'json'
);
-- 创建MySQL结果表(实时统计结果)
CREATE TABLE mysql_realtime_stats (
stat_time STRING,
total_pv BIGINT,
total_uv BIGINT,
unique_urls BIGINT,
PRIMARY KEY (stat_time) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://your-mysql-host:3306/website_stats',
'table-name' = 'realtime_stats',
'username' = 'your_username',
'password' = 'your_password'
);
-- 实时统计每分钟的PV和UV
INSERT INTO mysql_realtime_stats
SELECT
DATE_FORMAT(TUMBLE_START(proc_time, INTERVAL '1' MINUTE), 'yyyy-MM-dd HH:mm:ss') AS stat_time,
COUNT(*) AS total_pv,
COUNT(DISTINCT uid) AS total_uv,
COUNT(DISTINCT url) AS unique_urls
FROM kafka_log_source
GROUP BY TUMBLE(proc_time, INTERVAL '1' MINUTE);八、数据可视化与报表展示
8.1 Quick BI对接EMR数据源
Quick BI是一款全场景数据消费式的BI平台,通过智能的数据分析和可视化能力帮助企业构建数据分析系统。用户可以使用Quick BI制作漂亮的仪表板、格式复杂的电子表格、酷炫的大屏等。
添加EMR Serverless Spark数据源用于连通阿里云Serverless Spark数据库与Quick BI,连接成功后即可在Quick BI上进行数据的分析与展示。
8.2 EMR Notebook交互式分析
EMR Notebook是一个Serverless化的交互式数据分析和探索平台,满足大数据和AI融合下的数据处理需求。通过EMR Notebook可以完成对SQL的拖拽式操作及可视化,助您轻松完成数据分析及业务的自助探查。
九、集群监控与运维管理
9.1 日志管理
日志管理功能将EMR与日志服务SLS相结合,允许您在EMR控制台直接查询开源组件的日志。EMR联合日志服务推出日志功能,用于将EMR日志投递到日志服务进行查询分析。用户可以在EMR控制台中开启日志投递功能,将EMR日志投递到日志服务中。
9.2 监控告警配置
EMR提供了完善的监控告警功能。用户可以在EMR控制台的集群详情页中,单击上方的"监控诊断"页签,然后进入"报警管理"页面进行告警配置。
十、成本优化最佳实践
10.1 托管弹性伸缩
阿里云EMR发布了托管弹性伸缩功能,支持自动调整集群大小。在EMR托管弹性伸缩功能发布之前,用户必须提前预测工作负载或填写自定义弹性伸缩规则,这些规则取决于对服务框架(如Apache Spark或Apache Hive)的深入了解。预测工作负载或编写自定义规则比较困难且容易出错。
阿里云EMR发布托管弹性伸缩功能后,用户只需为集群指定最大和最小的Task节点数,阿里云EMR将自动在范围内调整集群规模,以实现最优性能。面对业务激增,EMR可以在较短时间内自动补充资源,并将新增任务调度至新的节点上;在业务高峰过后,自动移除多余的资源,任务平滑地回到原有节点上,提升资源利用率。
EMR会持续对集群上运行的工作负载相关的关键指标进行采样,自动调整集群大小,以获得最佳性能和资源利用率。
根据模拟测试数据,相比于固定集群配置,托管弹性伸缩在各类场景下都有较大的资源利用率提升:
- 有时间规律固定长作业场景:资源利用率从44.74%提升至87.85%。
- 有时间规律固定短作业场景:资源利用率从35.64%提升至74.58%。
- 夜间周期规律加白天随机提交场景:资源利用率从27.08%提升至76.19%。
- 无时间规律场景:资源利用率从39.18%提升至84.66%。
启用托管弹性伸缩,可将集群成本降低最高达60%。
10.2 计算与存储分离架构
EMR支持计算与存储分离架构,将计算集群和存储集群分开部署。数据存储在OSS或OSS-HDFS中,计算集群按需弹性扩缩容。这种架构的优势在于:
- 存储和计算可以独立扩缩容,避免资源浪费。
- 多个计算集群可以共享同一份数据,避免数据冗余。
- 计算集群可以在不使用时释放,大幅降低成本。
10.3 集群规划建议
在进行集群规划时,业务场景、地域和存储、元数据服务、硬件与网络以及计费方式等五个方面是主要考虑因素。科学的存储配置(如HDFS、OSS-HDFS/OSS)能提升数据读写效率、降低存储成本,同时保障数据可靠性。
对于网站运营数据统计场景,建议采用以下成本优化策略:
- 选择包年包月方式购买Master节点和Core节点,保障基础计算能力。
- Task节点采用按量付费并启用托管弹性伸缩,应对波动的计算需求。
- 数据存储在OSS-HDFS中,实现计算与存储分离。
- 使用DLF统一元数据,支持多集群共享。
十一、总结
本文全面介绍了如何使用阿里云EMR大数据集群统计网站运营数据。从EMR的产品形态选择、集群创建配置、数据同步、数据加工(包括Hive离线处理和Spark SQL分析)、实时数据流处理(Flink)、数据可视化(Quick BI)到成本优化(托管弹性伸缩与计算存储分离),形成了一个完整的大数据统计分析解决方案。
通过本文的实战指南,读者可以快速搭建起企业级的网站运营数据统计分析平台,实现对网站流量、用户行为、用户画像等核心运营指标的全面洞察,为精细化运营和业务决策提供有力的数据支撑。
常见问题解答
问1:EMR on ECS、EMR on ACK和EMR Serverless Spark三种形态如何选择?
答:EMR on ECS适合需要完全掌控集群基础设施、对底层资源有自定义需求的场景,是目前最广泛使用的形态。EMR on ACK适合已经采用容器化架构、希望统一管理大数据和在线业务的团队。EMR Serverless Spark适合希望免去集群运维负担、专注于数据处理分析的团队。
问2:DataWorks和EMR如何配合使用完成网站运营数据统计?
答:DataWorks与EMR深度集成,支持端到端的数据同步、处理、管理和消费。通过DataWorks的数据集成功能将网站日志和用户信息同步到OSS,然后使用EMR Hive节点或EMR Spark SQL节点进行数据加工和统计,最后通过DataWorks的数据质量监控保障数据质量。
问3:EMR托管弹性伸缩如何帮助降低集群成本?
答:托管弹性伸缩允许用户只指定集群的最大和最小Task节点数,EMR自动根据工作负载调整集群规模。在业务高峰时自动扩容,在空闲时自动缩容,最高可降低60%的集群成本。相比自定义伸缩规则,托管弹性伸缩无需深入了解Spark或Hive框架即可自动优化资源利用率。
问4:网站运营数据统计中,Hive和Spark SQL应该如何选择?
答:Hive适合传统的离线批处理场景,语法标准、生态成熟,适合TB级别以上的大规模数据ETL。Spark SQL基于内存计算,性能更快,适合需要迭代计算和复杂分析的场景。在实际项目中,两者可以结合使用——Hive负责数据清洗和基础汇总,Spark SQL负责复杂的用户画像分析和多维统计。
问5:如何保障EMR集群的数据安全?
答:建议从以下几个方面保障数据安全:使用RAM子账号并遵循最小权限原则;为RAM用户开启MFA多因素认证;不要将AccessKey硬编码在代码中,使用STS或环境变量获取授权;OSS Bucket设置为私有权限;配置VPC网络隔离。
问6:实时统计和离线统计在网站运营数据场景中如何分工?
答:实时统计使用Flink处理Kafka中的实时访问日志流,用于监控大屏、实时告警等对时效性要求高的场景。离线统计使用Hive或Spark SQL处理OSS中的历史数据,用于日报、周报、用户画像分析等对数据完整性要求高的场景。两者可以共存,实时统计提供即时洞察,离线统计提供深度分析。


