ODPS技术架构及应用实践


《程序员》杂志2014年10月刊《凌云》云计算大数据阿里云ODPShadoop
摘要:ODPS是分布式的海量数据处理平台,提供了丰富的数据处理功能和灵活的编程框架。本文从ODPS面临的挑战、技术架构、Hadoop迁移到ODPS、应用实践注意点等方面带领我们初步了解了ODPS的现状与前景。

初识ODPS

ODPS是分布式的海量数据处理平台,提供了丰富的数据处理功能和灵活的编程框架,主要的功能组件有如下几个。

  • Tunnel服务:数据进出ODPS的唯一通道,提供高并发、高吞吐量的数据上传和下载服务。
  • SQL:基于SQL92并进行了本地化扩展,可用于构建大规模数据仓库和企业BI系统,是应用最为广泛的一类服务。
  • DAG编程模型:类似Hadoop MapReduce,相对SQL更加灵活,但需要一定的开发工作量,适用于特定的业务场景或者自主开发新算法等。
  • Graph编程模型:用于大数据量的图计算功能开发,如计算PageRank。
  • XLIB:提供诸如SVD分解、逻辑回归、随机森林等分布式算法,可用于机器学习、数据挖掘等场景。
  • 安全:管控ODPS中的所有数据对象,所有的访问都必须经过鉴权,提供了ACL、Policy等灵活强大的管理方式。

ODPS采用抽象的作业处理框架将不同场景的各种计算任务统一在同一个平台之上,共享安全、存储、数据管理和资源调度,为来自不同用户需求的各种数据处理任务提供统一的编程接口和界面。

和阿里云的其他云计算服务一样,ODPS也是采用HTTP RESTful服务,并提供Java SDK、命令行工具(Command Line Tool,CLT)和上传下载工具dship,以及阿里云官网提供统一的管理控制台界面。在阿里内部,有多个团队基于ODPS构建交互界面的Web集成开发环境,提供数据采集、加工、处理分析、运营和维护的一条龙服务。基于ODPS进行应用开发,最直接的是使用CLT以及dship等工具。如果不能满足需要,也可以进一步考虑使用ODPS SDK或RESTful API等进行定制开发,如图1所示。


图1  ODPS应用开发模式

如果你的业务发展需要一个足够强大、能开箱即用的大数据处理平台,并且不想花费太多精力去关注这一切如何实现与运维,那么ODPS是一个非常理想的选择。

规模的挑战

在DT时代,数据是宝贵的生产资料,但不断扩大的数据规模给ODPS带来了极大的挑战。在阿里内部就曾直面这种情况:在可以预见的时间内,单个集群的规模无法再容纳所有的数据。

解决方案是扩大单集群的规模,同时让应用系统可以管理多个集群。在这个背景下,ODPS作为一个海量数据的处理平台,结合5K项目开发了多集群管理的功能,使得数据处理的规模跨上了一个新的台阶。当单个计算集群的存储或计算容量不足时,将数据重新分布到新的集群上。更重要的一点是,这种跨多个集群的能力,对上层应用是透明的,用户在运行SQL或者Graph模型时,不必了解数据是分布在哪个物理集群上,如图2所示。


图2  ODPS的跨集群能力

网站日志分析

这里,我们将基于最常见的网站日志分析这一应用场景,实践如何通过ODPS来构建企业数据仓库,包括数据的导入导出以及清洗转换。其ETL过程与基于传统数据库的解决方法并不完全一致,在数据传输环节并没有太多的清洗转换,这项工作是在数据加载到ODPS后,用SQL来完成的。在数据加载到ODPS后,可以充分利用平台的水平扩展能力,处理的数据量可以轻松地扩展到PB级别,而且作为一个统一的平台,除构建数据仓库外,在ODPS中利用内置的功能即可进行数据挖掘和建模等工作。在实际工作中,数据采集、数仓构建和数据挖掘等都是由不同的团队来完成的,针对这一情况,ODPS中提供了完善的安全管理功能,可以精确地控制每个人可以访问到的数据内容(下例中为突出主要的过程,忽略了用户的授权管理)。

数据来源于网站酷壳(CoolShell.cn)上的HTTP访问日志数据(access.log),格式如下:


一个典型的企业数据仓库通常包含数据采集、数据加工和存储、数据展现等几个过程,如图3所示。


图3  数据仓库主要过程

数据采集

真实的网站日志数据中不可避免地会存在很多脏数据,可以先通过脚本对源数据做简单的处理解析,去掉无意义的信息,例如第二个字段“-”。在数据量比较大的情况下,单机处理可能成为瓶颈。这时可以将原始的数据先上传到ODPS,充分利用分布式处理的优势,通过ODPS SQL对数据进行转换。

在ODPS中,大部分的数据都是以结构化的表形式存在的,因此第一步要创建ODS层源数据表。由于数据是每天导入ODPS中,所以采取分区表,以日期字符串作为分区,在ODPS CLT中执行SQL如下:


假设当前数据是20140301这一天的,添加分区如下:


解析后的数据文件在/home/admin/data/20140301/output.log下,通过dship命令导入ODPS中,如下:


数据加工和存储

在ods_log_tracker表中,request字段包含三个信息:HTTP方法、请求路径和HTTP协议版本,如“GET /articles/4914.html HTTP/1.1”。在后续处理中,会统计方法为GET的请求总数,并对请求路径进行分析,因而可以把原始表的request字段拆解成三个字段method、url和protocol。这里使用的是ODPS SQL内置的正则函数解析的字符串并生成表dw_log_parser:


与传统的RDBMS相比,ODPS SQL面向大数据OLAP应用,没有事务,也没有提供update和delete功能。在写结果表时,尽量采用INSERT OVERWRITE到某个分区来保证数据一致性(如果用户写错数据,只需要重写该分区,不会污染整张表)。如果采用INSERT INTO某张表的方式,那么在作业因各种原因出现中断时,不方便确定断点并重新调度运行。

ODPS SQL提供了丰富的内置函数,极大方便了应用开发者。对于某些功能,如果SQL无法完成的话,那么可以通过实现UDF(用户自定义函数)来解决。例如希望将ip字段转化成数字形式,从而和另一张表关联查询,可以实现UDF,如下:


编译生成JAR包udf_ip2num.jar,将它作为资源上传到ODPS,然后创建函数并测试,如下:


表dual(需要用户自己创建)类似于Oracle中的dual表,包含一列和一行,经常用于查询一些伪列值(pseudo column),是SQL开发调试的利器。

对于较复杂的数据分析需求,还可以通过ODPS DAG(类似MapReduce)编程模型来实现。篇幅限制,这里不一一介绍。


图4  PV/UV展示结果

数据展现

应用数据集市往往是面向业务需求对数据仓库表进行查询分析,例如统计基于终端设备信息的PV和UV,生成结果表adm_user_measures。R是一款开源的、功能强大的数据分析工具。通过R来绘图,展示结果报表可以有两种方式:一是通过dship命令将数据导出到本地,再通过R展现结果;二是在R环境中安装RODPS Package,直接在R中读取表中的数据并展现。在RStudio中,基于小样本数据统计的展现结果如图4所示。

迁移到ODPS

Hadoop作为开源的大数据处理平台,已得到了广泛应用。在使用Hadoop集群的用户,可以比较轻松地迁移到ODPS中,因为ODPS SQL与Hive SQL语法基本一致,而MapReduce作业可以迁移到更加灵活的DAG的执行模型。对于数据的迁移,可以通过ODPS Tunnel来完成。

数据通道服务ODPS Tunnel是ODPS与外部交互的统一数据通道,能提供高吞吐量的服务并且能够水平进行服务能力的扩展。Tunnel服务的SDK集成于ODPS SDK中。实际上,dship也是调用SDK实现的客户端工具,支持本地文件的导入导出。我们鼓励用户根据自己的场景需求,开发自己的工具,例如基于SDK开发对接其他数据源(如RDBMS)的工具。

把海量数据从Hadoop集群迁移到ODPS的基本思路是:实现一个Map Only程序,在Hadoop的Mapper中读取Hadoop源数据,调用ODPS SDK写到ODPS中。执行逻辑大致如图5所示。

Hadoop MapReduce程序的执行逻辑主要包含两阶段:一是在客户端本地执行,如参数解析和设置、预处理等,这在main函数完成;二是在集群上执行Mapper,多台Worker分布式执行map代码。在Mapper执行完成后,客户端有时还会做一些收尾工作,如执行状态汇总。


图5  Hadoop到ODPS的数据迁移

这里,我们在客户端本地的main函数中解析参数,创建UploadSession,把SessionID传给Mapper,Mapper通过SessionID获取UploadSession,实现写数据到ODPS。当Mapper执行完成后,客户端判断执行结果状态,执行Session的commit操作,把成功上传的数据Move到结果表中。

默认情况下,Hadoop会自动根据文件数划分Mapper个数。在文件大小比较均匀时,这种方式没什么问题。然而存在大文件时,整个大文件只在一个Mapper中执行可能会很慢,造成性能瓶颈。这种情况下,应用程序可自己对文件进行切分。

下面实现一个类Hdfs2ODPS来完成这个功能。其中run函数完成了前面提到的主要逻辑,主要代码如下(其中包括了对ODPS Tunnel的使用):



在这个函数中,首先调用函数parseArguments对参数进行解析(后面会给出),然后初始化DataTunnel和UploadSession。创建UploadSession后,获取SessionID,并设置到conf中,在集群上运行的Mapper类会通过该conf获取各个参数。然后,调用runJob函数,其代码如下:


runJob函数设置Hadoop conf,然后通过JobClient.runJob(conf);启动Mapper类在集群上运行,最后调用conf.getNumMapTasks() 获取Task数,Task数即上传到ODPS的并发数。在Mapper中,可以通过conf.getLong("mapred.task.partition")获取Task编号,其值范围为[0, NumMapTasks)。因此,在Mapper中可以把Task编号作为上传的blockid。客户端在Mapper成功返回时,就完成commit所有的Session。

应用实践注意点

与单机环境相比,在ODPS这样的分布式环境中进行开发,思维模式上需要有很大转变。下面分享一些实践中的注意点。

在分布式环境下,数据传输需要涉及不同机器的通信协作,可以说它是使用ODPS整个过程中最不稳定的环节,因为它是一个开放性问题,由于数据源的不确定,如文件格式、数据类型、中文字符编码格式、分隔符、不同系统(如Windows和Linux)下换行符不同,double类型的精度损失等,存在各种未知的情况。脏数据也是不可避免的,在解析处理时,往往是把脏数据写到另一个文件中,便于后续人工介入查看,而不是直接丢弃。在上传数据时,Tunnel是Append模式写入数据,因而如果多次写入同一份数据,就会存在数据重复。为了保证数据上传的“幂等性”,可以先删除要导入的分区,再上传,这样重复上传也不会存在数据重复。收集数据是一切数据处理的开始,所以必须非常严谨可靠,保证数据的正确性,否则在该环节引入的正确性问题会导致后续处理全部出错,且很难发现。

对于数据处理流程设计,要特别注意以下几点。

  • 数据模型:好的数据模型事半功倍。
  • 数据表的分区管理:如数据每天流入,按日期加工处理,则可以采取时间作为分区,在后续处理时可以避免全表扫描,同时也避免由于误操作污染全表数据。
  • 数据倾斜:这是作业运行慢的一个主要原因,数据倾斜导致某台机器成为瓶颈,无法利用分布式系统的优势,主要可以从业务角度解决。
  • 数据的产出时间:在数据处理Pipeline中,数据源往往是依赖上游业务生成的,上游业务的数据产出延迟很可能会影响到整个Pipeline结果的产出。
  • 数据质量和监控:要有适当的监控措施,如某天发生数据抖动,要找出原因,及时发现潜在问题。
  • 作业性能优化:优化可以给整个Pipeline的基线留出更多时间,而且往往消耗资源更少,节约成本。
  • 数据生命周期管理:设置表的生命周期,可以及时删除临时中间表,否则随着业务规模扩大,数据会膨胀很快。

此外,数据比对、A/B测试、开发测试和生产尽可能采用两个独立的Project。简言之,在应用开发实践中,要理解计费规则,尽可能优化存储计算开销。

ODPS现状和前景

阿里巴巴提出了“数据分享第一平台”的愿景,其多年来坚持投资开发ODPS平台的初心就是希望有一天能够以安全和市场的模式,让中小互联网企业能够使用阿里巴巴最宝贵的数据。阿里内部提出了所有数据“存、通和用”,将不同业务数据关联起来,发挥整体作用。ODPS目前正在发展中,它在规模上,支持淘宝核心数据仓库,每天有PB级的数据流入和加工;在正确性上,支持阿里金融的小额无担保贷款业务,其对数据计算的准确性要求非常苛刻;在安全上,支持支付宝数据全部运行在ODPS平台上,由于支付宝要符合银行监管需要,对安全性要求非常高,除了支持各种授权和鉴权审查,ODPS平台还支持“最小访问权限”原则:作业不但要检查是否有权限访问数据,而且在整个执行过程中,只允许访问自己的数据,不能访问其他数据。

前面的示例只是展现了ODPS的冰山一角。作为阿里巴巴云计算大数据平台,ODPS采用内聚式平台系统架构,各个组件紧凑内聚,除了结构化数据处理SQL、分布式编程模型MapReduce外,还包含图计算模型、实时流处理和机器学习平台,如图6所示。


图6  ODPS功能模块

随着ODPS对外开放的不断推进和第三方数据的流入,相信会有各种创新在ODPS上生根发芽、开花结果。

尽管如此,云计算和大数据是两个新兴的领域,技术和产品发展日新月异。作为一个平台,虽然ODPS已在阿里内部被广泛使用,但在产品和技术上还有很多方面需要进一步完善和加强,希望ODPS能够和云计算大数据应用共同成长,成为业界最安全、最可靠和最方便易用的平台。

本文主要内容节选自作者即将出版的新书《ODPS权威指南》。

本文作者:张云远,长期工作于数据仓库及BI领域,先后任职于建设银行、TCS及惠普,2011年加入阿里云,担任ODPS产品经理,主要负责SQL模块的产品功能。经历了阿里金融等数据仓库在ODPS上的建设过程,作为登月一号项目的PM负责将小微金服离线数据平台迁移到ODPS。

李妹芳,阿里数据平台事业部工程师,曾译有《Linux系统编程》、《数据之美》、《数据可视化之美》等书,其新书《ODPS权威指南》即将上市。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssh,scp带密码操作

1、远程执行,带密码参数 sshpass 安装命令: yum install sshpass 执行命令: sshpass -p "mima" ssh rootlocalhost --------参数小写p,密码mima 2、非22端口 ssh -p 9062 111.111.111…

junit 测试 dao_JUnit测试Spring Service和DAO(带有内存数据库)

junit 测试 dao这篇文章描述了如何为Spring Web Application的Services和DAO实现JUnit测试。 它建立在Spring MVC-Service-DAO-Persistence Architecture Example的基础上 。 从Github的Spring-Web-JPA-Testing目录中可以找到该示例。 提醒 测试装置 –固定状态,用…

C++判断文件夹是否存在

判断文件夹是否存在一、判断文件夹是否存在: 1.用CreateDirectory(".//FileManege",NULL);如果文件夹FileManege不存在,则创建。 2.或者if(_access(".//FileManege",0)-1),表示FileManege不存在。 3.或者…

ODPS MR开发 WordCount

参考: ODPS初始篇--客户端配置和使用:http://blog.itpub.net/26613085/viewspace-1327313/ odps dship客户端使用:http://blog.itpub.net/26613085/viewspace-1328434/ 有了上面两篇文章,就可以使用ODPS的客户端;使用O…

跨域设置

# 参考: https://blog.csdn.net/linzi1994/article/details/82724429 https://www.cnblogs.com/ShaunChen/p/5998800.html# 配置详解: # 跨域设置 CORS_ORIGIN_ALLOW_ALL True # 允许所有域名 CORS_ALLOW_CREDENTIALS True # 允许获取cookie CORS_UR…

kdb q介绍

Q起源Kx systems公司的创始人之一Arthur Whitney在2003年研发了列式数据库KDB和它的操作语言q。q也可以写成Q。设计之初,q语言要做到简洁,高效和富表达性。 q的起源受到多种语言的启示。包括APL、LISP和函数式编程。 APL是一个向量语言,所以…

mysql多大_洞悉MySQL底层架构:游走在缓冲与磁盘之间

提起MySQL,其实网上已经有一大把教程了,为什么我还要写这篇文章呢,大概是因为网上很多网站都是比较零散,而且描述不够直观,不能系统对MySQL相关知识有一个系统的学习,导致不能形成知识体系。为此我撰写了这…

odps新手上路之安装Eclipse开发环境

只看楼主更多操作楼主 发表于: 2014-11-07—本帖被 亮伟 执行取消精华操作(2014-11-27)—准备工作:登录阿里云官网,开通odps服务。创建一个odps的project。安装odps的客户端,具体的方法见 传送门下载Eclipse并解压缩。建议到官网上下载。作…

mfc对话框在不同计算机上显示不全

出现MFC对话框在不同计算机上显示不全的或者显示大小不一样的活可以调整电脑的分辨率也可以在创建对话框时根据分辨率来调整控件。

c++二进制转十进制_二进制,八进制,十进制,十六进制转换详解~

点 击 上 方 蓝 字 关 注 我 们 哦 ^-^本文思维导图:1.数制:用一组固定的数字和一套统一的规则来表示数目的方法称为数制。进位计数制的要素:①、数码:用来表示进制数的元素。二进制:0,1。八进制:0,1,2,3,4…

复习第三章多态

第三章 多态 本章需要掌握的东西 掌握多态的优势和应用场合答:多态的优势可以减少代码量,更加清晰明了。,应用场合为,一个事物需要做多种事情的时候需要用到多态。 2.掌握父类和子类之间的类型转换 答:父类引用转向子…

java堆 数据结构 堆_Java中的紧凑堆外结构/组合

java堆 数据结构 堆在上一篇文章中,我详细介绍了代码对主内存的访问方式的含义。 从那时起,我就在Java中可以做什么以实现更可预测的内存布局提出了很多疑问。 有些模式可以使用数组支持的结构来应用,我将在另一篇文章中讨论。 这篇文章将探讨…

Unix环境高级编程学习笔记(七) 多线程

线程概述 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只…

testflight开发者已将您从测试计划中移除_使用 TestFlight 测?试 App

目前市面上对于iOS开发的签名样式大致分为三种: a、企业签 依赖于苹果企业级开发者账号b、超级签 依赖于苹果个人开发者账号c、tf签 TestFlight Beta 版测试让您可以分发您 App 的 Beta 版构建版本给测试员并收集反馈。您可以在您的 App Store Connect 帐户中一次为…

MFC操作ini文件方法

转自:http://blog.csdn.net/rayborn1105/article/details/8192142 一个不错的接口:http://blog.csdn.net/qq575787460/article/details/8185339 在我们的程序设计中经常需要对一些参数进行配置,配置好后还要在下一次启动仍然有效,…

Java 8流中的数据库CRUD操作

在开始使用新工具时要克服的最大障碍是让您着手处理小事情。 到目前为止,您可能对新的Java 8 Stream API的工作方式充满信心,但是您可能尚未将其用于数据库查询。 为了帮助您开始使用Stream API创建,修改和读取SQL数据库,我整理了…

网络时间同步

linux yum install ntp ntpdate -y 时间同步命令:ntpdate time.windows.com 开机启动: chkconfig ntpd on 查看开机启动:chkconfig --list ntpd ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 转载于:https://www.cnblogs.com/…

java 权限url权限_SpringBootSecurity学习(11)网页版登录之URL动态权限

动态权限前面讨论用户登录认证的时候,根据用户名查询用户会将用户拥有的角色一起查询出来,自动实现判断当前登录用户拥有哪些角色。可以说用户与角色之间的动态配置和判断security做的非常不错。不过在配置方法级别的权限的时候,使用注解虽然…

线程使用

嵌入式中线程应用还是看需求,一般不常用(在不会使用的情况下)一、编译有线程的应用程序需要编译时指定编译lib库 ( -l pthread) 如:gcc main.c -o main -l pthread 才能编译通过。二、线程使用。1、线程运行…

C++ MFC string转Cstring为什么会乱码

前段时间学习mfc编了一个小程序,其中涉及到CString 与string的转换的时候感觉特别蛋疼,因此再此总结一下经验。希望能够对大家能有所帮助 通常有两种字符集模式 unicode字符集 和 ascii字符集,其中unicode有多种编码方式。utf8, …