基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用

背景

随着互联网服务的广泛普及与技术应用的深入发展,日志数据作为记录系统活动、用户行为和业务操作的宝贵资源,其价值愈发凸显。然而,当前海量日志数据的产生速度已经远远超出了传统数据分析工具的处理能力,这不仅要求我们具备高效的数据收集和存储机制,更呼唤着强大、灵活且易用的数据分析平台的诞生。在此背景下,Apache Spark,这一专为大规模数据处理而设计的计算引擎,成为了构建高性能日志分析应用的理想选择。阿里云 EMR Serverless Spark 版是一款全托管、一站式的数据处理平台,基于Spark Native Engine构建,专为大规模数据处理和分析设计,提供弹性、高效的服务,让用户无需关注基础设施管理,100%兼容Spark,简化从开发到运维的全链路工作流程。本文将以 OSS 日志处理场景为例,演示使用 EMR Serverless Spark 产品快速搭建日志分析应用。

OSS-HDFS 审计日志简介

阿里云的 OSS-HDFS 服务,是专为大数据处理和云原生数据湖存储设计的产品。该服务由阿里云的JindoFS提供技术支持,旨在无缝桥接阿里云对象存储(OSS)与 HDFS 生态系统,为 Apache Hadoop、Hive、Spark、Flink 等大数据处理框架提供高性能、高兼容性的存储解决方案。在阿里云 OSS 控制台创建一个新的 OSS Bucket 时可以选择开通 HDFS 服务,创建完成后新的 OSS Bucket 即可支持 HDFS 接口访问:

HDFS审计日志(Audit Log)是Hadoop分布式文件系统(HDFS)的一个重要组成部分,它详尽地记录了所有用户对 HDFS 执行的操作信息。这些日志对于系统管理员监控、安全审计以及故障排查至关重要。每当用户通过 HDFS 的 NameNode 执行操作(如读取、写入、删除文件或目录等),NameNode 就会生成一条审计日志记录。类似于开源版 HDFS,OSS-HDFS 默认就支持 auditlog 日志,在根目录下的 /.sysinfo/auditlog 目录下保存了近一个月的审计日志,并且按照日期目录进行切分。

审计日志条目通常包含一些关键信息,比如操作时间、操作人、操作成功与否、来源IP、操作命令、操作目标文件等。下面三条日志分别记录了delete、getfileinfo和mkdir操作详情:

2024-05-14 00:12:37.746 allowed=true    ugi=hadoop (auth:UNKNOWN)       ip=172.16.0.99  cmd=delete      src=/tmp/hive/hadoop/c7e1564c-7f3f-4fe9-b993-1d56e1ddcd47       dst=<null>      perm=<null>     proto=rest
2024-05-14 00:07:36.652 allowed=true    ugi=hadoop (auth:UNKNOWN)       ip=172.16.0.99  cmd=getfileinfo src=/tmp/hive/hadoop/34567e8a-a5f2-4f6b-802c-ca4db2cc1d58       dst=<null>      perm=<null>     proto=rest
2024-05-14 00:12:37.316 allowed=true    ugi=hadoop (auth:UNKNOWN)       ip=172.16.0.99  cmd=mkdirs      src=/tmp/hive/hadoop/c7e1564c-7f3f-4fe9-b993-1d56e1ddcd47/_tmp_space.db dst=<null>      perm=hadoop:supergroup:rwx------        proto=rest

EMR Serverless Spark 工作空间简介

使用 EMR Serverless Spark 产品之前,需要了解工作空间相关的概念,工作空间是 EMR Serverless Spark 为业务开发划分的基本单元,是任务、资源和权限的集合。接下去就可以参考产品的快速入门文档来体验:

  1. 阿里云账号角色授权:开通工作空间的前置操作

  2. 创建Spark工作空间:需要提前开通 OSS 和 DLF 等阿里云服务

  3. SQL任务快速入门:接下去的 EMR Serverless Spark 任务开发会使用 SQL 任务

EMR Serverless Spark 任务开发

下面我们来演示如何通过EMR Serverless Spark搭建一个日志分析应用。日志分析的一个很常见的需求是分析前一天访问 OSS-HDFS Bucket 的来源IP,比如希望找到有来自某些IP的异常突发流量,或者在事后调查敏感文件是否被异常IP所访问。因为SQL是在数据分析中最常用的工具,所以使用 Spark SQL 来分析OSS-HDFS的审计日志。前面我们已经通过《SQL任务快速入门》对 SparkSQL 类的任务有了简单的了解,这部分内容会针对数据仓库源数据层、明细层、汇总层分别创建一个 SQL 任务。

源数据层

首先是日志文件的来源,我们要建立一个源数据层(ODS)的表,因为审计日志已经被归档到OSS-HDFS的系统目录里,所以我们可以通过Spark SQL建一个CSV外表:

  1. 表路径指向系统目录 oss://..oss-dls.aliyuncs.com/.sysinfo/auditlog/ (在操作的时候需要将 BUCKET_NAME 和 REGION_ID 替换为实际使用的 OSS Bucket 名称和所在地域)

  2. 日志条目中的不同字段用制表符(tab)分隔,所以指定 sep = '\t'

  3. {ds} 是 Serverless Spark开发和调度平台使用的内置变量,代表业务日期(T-1)。比如在2024年5月21日运行的SQL任务,业务时间是指前一天,{ds}=2024-05-20(在这里无需手动替换 ds 值)

DROP TABLE IF EXISTS s_oss_hdfs_audit_tmp;
CREATE TABLE s_oss_hdfs_audit_tmp (
  tm string,
  allowed string,
  ugi string,
  ip string,
  cmd string,
  src string,
  dst string,
  perm string,
  proto string
) USING csv 
OPTIONS (
  path 'oss://<BUCKET_NAME>.<REGION_ID>.oss-dls.aliyuncs.com/.sysinfo/auditlog/${ds}',
  sep '\t'
);

把这个SQL文件(s_oss_hdfs_audit_tmp.sql)保存后,点击发布。

数仓明细层

其次,我们要基于这个ODS外表创建一张数据仓库明细层(DWD)表,以Parquet格式存储,并按天进行分区。我们需要对 ODS 表进行简单的清洗和转换,比如把access_time从字符串转换成timestamp类型,将字段内容 ip=172.16.0.99 转换为 IP 地址 172.16.0.99 等。这个SQL里同样使用了 ${ds} 内置变量。

CREATE TABLE IF NOT EXISTS dwd_oss_hdfs_audit_di (
  access_time timestamp,
  allowed string,
  ugi string,
  ip string,
  cmd string,
  src string,
  dst string,
  perm string,
  proto string,  
  dt string
) 
USING parquet 
PARTITIONED BY (dt);

INSERT OVERWRITE TABLE dwd_oss_hdfs_audit_di partition (dt = '${ds}')
SELECT 
  to_timestamp(tm),
  split_part(allowed, '=', 2),
  split_part(ugi, '=', 2),
  split_part(ip, '=', 2),
  split_part(cmd, '=', 2),
  split_part(src, '=', 2),
  split_part(dst, '=', 2),
  split_part(perm, '=', 2),
  split_part(proto, '=', 2)
FROM
  s_oss_hdfs_audit_tmp;

把这个SQL文件(dwd_oss_hdfs_audit_di.sql)保存后,点击发布。

数仓汇总层

最后,我们对数仓明细层数据做一个简单的分析,取出前一天请求量最大的20个IP地址,我们会创建一张 DWS 汇总表:

CREATE TABLE IF NOT EXISTS dws_oss_hdfs_ip_ana (
  ip string,
  cnt bigint,
  dt string
) 
USING parquet 
PARTITIONED BY (dt);

INSERT OVERWRITE TABLE dws_oss_hdfs_ip_ana partition (dt = '${ds}')
SELECT 
  ip,
  count(*) cnt
FROM
  dwd_oss_hdfs_audit_di
WHERE
  dt = '${ds}'
GROUP BY ip
ORDER BY cnt DESC
LIMIT 20;

把这个SQL文件(dws_oss_hdfs_ip_ana.sql)保存后,点击发布。

EMR Serverless Spark 任务编排

创建工作流

在前面的章节中,我们已经分别在数据仓库源数据层、明细层、汇总层各创建一个 SQL 任务,这些任务都处于“已发布”状态。接下去我们需要创建一个工作流把这三个SQL任务进行适当的编排,并且让工作流能在每天的固定时间进行调度。在 Serverless Spark 工作空间的导航栏中找到“任务编排”链接,点击“创建工作流”后进入新建工作流 oss_hdfs_auditlog 的配置界面。在这个界面里需要填写工作流名称和资源队列,同时可以选择调度类型是“调度器”,调度周期是每天的 00:05。

编辑节点

在编辑工作流的页面,鼠标左键双击节点,或者单击下方的添加节点,进入节点编辑页面。我们需要按顺序选择s_oss_hdfs_audit_tmp、dwd_oss_hdfs_audit_di、dws_oss_hdfs_ip_ana节点,加入到工作流中。

同时也需要配置节点依赖关系,比如 dwd_oss_hdfs_audit_di 节点的上游节点是 s_oss_hdfs_audit_tmp,dws_oss_hdfs_ip_ana 节点的上游节点是 dwd_oss_hdfs_audit_di。

三个节点编辑完成之后,自动生成如下 DAG,完成工作流的编辑。

发布工作流

在工作流编辑页面右上角,点击“发布工作流”,在输入发布信息后点击“确认”,完成工作流的发布。

发布工作流之后自动跳转回到工作流列表,我们可以看到新创建的工作流。打开“调度状态”开关,之后工作流会根据调度器的设置进行按天调度。

点击工作流名称,进入工作流调度实例列表,在这里可以看到每次调度运行的成功或失败的任务节点,也可以点击右上角的“手动运行”按钮进行一次手动调度。

在每天凌晨的定时调度完成之后或者一次手动调度成功之后,我们可以回到 SQL 任务开发界面,在编辑器中输入如下 SQL 查询语句,可以快速获取到前一天请求 OSS-HDFS 数量最多的前 20 个 IP 地址:SELECT * FROM dws_oss_hdfs_ip_ana where dt = '${ds}';我们可以得到类似下面的 SQL 运行结果:

总结

本文演示了使用 Serverless Spark 产品搭建一个日志分析应用的全流程,包括数据开发和生产调度以及交互式查询等场景。EMR Serverless Spark 在 2024年5月正式开启公测,在公测期间可以免费使用最高 100 CU 计算资源,欢迎试用。如果您在使用 EMR Serverless Spark 版的过程中遇到任何疑问,可钉钉扫描以下二维码加入钉钉群(群号:58570004119)咨询。

快速跳转
  1. EMR Serverless Spark 版官网:https://www.aliyun.com/product/bigdata/serverlessspark

  2. 产品控制台:https://emr-next.console.aliyun.com/

  3. 产品文档:https://help.aliyun.com/zh/emr/emr-serverless-spark/

  4. SQL 任务快速入门:Spark SQL任务快速入门_开源大数据平台 E-MapReduce(EMR)-阿里云帮助中心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/673974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何正确理解事件溯源架构模式?

在微服务架构盛行的当下&#xff0c;DDD&#xff08;领域驱动设计&#xff09;也得到了崭新的发展。同时&#xff0c;随着DDD的不断发展&#xff0c;也诞生了一些新的设计思想和开发模式&#xff0c;今天要介绍的事件溯源是其中具有代表性的一种模式。 事件溯源模式是DDD领域中…

复习kafka

Kafka 介绍 Kafka 是一种分布式的&#xff0c;基于发布/订阅的消息系统。它最初由 LinkedIn 开发&#xff0c;并于 2011 年开源。Kafka 的设计目标是提供一种高效、可靠的消息传输机制&#xff0c;能够处理大量的实时数据。 Kafka 基本概念 Producer&#xff1a;生产者&#xf…

告别复制粘贴:AI辅助毕业论文写作全攻略

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…

vue配置代理服务器解决跨域方法

一.vue配置代理服务器解决跨域方法一 过程如图&#xff1a; 1.在配置文件中设置代理服务器的地址 //vue.config.js module.exports{pages:{index:{// 入口entry:src/main.js,},},lintOnSave:false, //关闭语法检测// 开启代理服务器devServer:{proxy:http://localhost:8000//…

cruscal算法经典题目讲解——Leetcode道路建设

道路建设 (nowcoder.com) kruscal例题&#xff1a; 由题目可得&#xff0c;给出n个点求出n个点的最小生成树&#xff0c;权值计算规则为两点间的曼哈顿距离 我们采用cruscal算法实现。首先我们要先构建路线edge&#xff0c;我们建立一个结构体edge表示路线&#xff0c;包含成…

Ubuntu Todesk远程连接一直卡在100%

关于Todesk远程Linux卡在连接服务器的解决方案 在网上看到很多篇文章都说改硬解码什么的 反正我试过是没用 下面是我的解决方案 编辑下面的文件 sudo vim /etc/gdm3/custom.conf 这里如果大家不会使用 vim 退出 1. 按一下ESC键 2. 同时按住shfit: 3. 输入wq 4. 回车重启系…

【Unity Shader入门精要 第12章】屏幕后处理效果(三)

1. Bloom效果 Bloom描述的是图像中较亮的部分向周围一定范围内发生扩散&#xff0c;造成一种朦胧的效果&#xff0c;常用于表现游戏中的灯光或隧道出口之类的效果。 下面的例子将实现一个简单的Bloom效果&#xff0c;其原理是&#xff1a; 将原始图像中较亮&#xff08;灰度…

Word2021中的The Mathtype DLL cannot be found问题解决(office 16+mathtype7+非初次安装)

问题描述&#xff0c;我的问题发生在word中无法使用自定义功能区中的mathtype 我的环境是&#xff1a;W11Word2021mathtype7 因为我是第二次安装mathtype7&#xff0c;所以我怀疑是因为没有卸载干净&#xff0c;于是我参考了下面这篇文章的做法 参考文章 1.首先重新卸载当前的…

IO流---字节流.Java

一&#xff0c;概述 IO流是存储和读取数据的解决方案。 I&#xff1a;input O:output流&#xff1a;像水流一样传输数据 因为IO流与File是息息相关的&#xff0c;所以在学习IO流之前&#xff0c;简单回顾一下File&#xff1a;&#x1f604;&#x1f60a;&#…

数据结构--数组(详细分析)

目录 &#x1f349;引言 &#x1f349;数组 &#x1f348;数组的特性 &#x1f348;数组的优缺点 &#x1f34d;优点&#xff1a; &#x1f34d;缺点&#xff1a; &#x1f348;数组的声明与初始化 &#x1f348;数组的常见操作 &#x1f34d; 插入操作 &#x1f34d;…

QTP——功能测试

一、前言&#xff08;课设目的及内容&#xff09; QTP是quicktest Professional的简称&#xff0c;是一种自动测试工具。使用QTP的目的是想用它来执行重复的手动测试&#xff0c;主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试&…

46、Flink 的 异步 I/O 算子详解

异步 I/O 1.需求 在与外部系统交互&#xff08;用数据库中的数据扩充流数据&#xff09;时&#xff0c;需要考虑与外部系统的通信延迟对整个流处理应用的影响。 同步交互&#xff1a;使用 MapFunction访问外部数据库的数据&#xff0c; MapFunction 向数据库发送一个请求然后…

企业软件产品和服务 之 设计保证安全 七项承诺

1. 引言 公司如何保护自己免受数据泄露的影响&#xff1f;标准答案就是&#xff1a; “启用多因素身份验证”——MTA&#xff08;Enable multifactor authentication&#xff09;。 但是&#xff0c;目前很多公司仍然盲目地只使用密码作为唯一的身份来源。 网络安全的核心是…

IPD推行成功的核心要素(九)需求管理助力产品从一次成功走向一直成功

在当今竞争激烈的商业环境中&#xff0c;项目的成功与否往往取决于其能否满足用户和利益相关者的需求。然而&#xff0c;理解、捕捉和有效管理这些需求并非易事。因此&#xff0c;需求管理在项目管理中扮演着至关重要的角色。需求管理是一个系统性的过程&#xff0c;旨在确保项…

直播分享|深入解析ts-morph:通过注释生成类型文档

♪ ♫ 你看小狗在叫 树叶会笑 风声在呢喃♫ ♪ 乘风追梦&#xff0c;童心未泯 OpenTiny 预祝所有大朋友、小朋友儿童节快乐~ 与此同时&#xff0c;OpenTiny 贡献者直播也即将开启啦~ 直播主题&#xff1a;【深入解析ts-morph&#xff1a;通过注释生成类型文档】 6月1日&am…

前驱图,程序执行和进程状态

目录 前驱图 程序的执行 顺序执行 并发执行 进程的定义 进程的状态 总结 前驱图 现在有两个任务分别为p1,p2; 只有执行了p1,才可以执行p2&#xff0c;此时可以称p1为p2的前驱。通过符号语言表示如下&#xff1a; p1->p2 程序的执行 下面引进一段代码来理解进程的概念…

IDEA 学习之 疑难杂症系列

IDEA 学习之 疑难杂症系列 1. Mapstruct 编译空指针问题 1.1. 现象 NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifest1.2. 原因 MapStruct 在 IDEA 2020.3 版本编译 NPE 问题 1.3. 解决办法 2. IDEA 学习之 编译内…

什么牌子的开放式耳机质量好?2024超强实力派品牌推荐!

耳机对于一个音乐人有重要这个不必多说&#xff0c;我朋友是个音乐编辑&#xff0c;他经常需要长时间佩戴耳机进行音频编辑和混音工作。在尝试过多款开放式耳机后&#xff0c;都没找到合适的。今天&#xff0c;我将从专业角度为大家带来几款热门开放式耳机的测评报告&#xff0…

Python 高级数据类型

列表List 定义列表 可以将不同的基本数据类型或者列表装到一个列表里 my_list [1,2,3,4,5] print(my_list) # [1, 2, 3, 4, 5] 直接打印出列表的内容 print(type(my_list)) # <class list>my_list ["1","2","3","4","…

MYSQL之安装

一&#xff0c;下载仓库包 wget -i -c https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm二&#xff0c;安装仓库 yum -y install mysql80-community-release-el7-3.noarch.rpmsed -i s/gpgcheck1/gpgcheck0/g mysql-community.repo三&#xff0c;安装MY…