亚马逊AWS官方博客

构建在Amazon EMR之上的Apache Atlas展现数据目录和数据血缘

一、背景介绍

在数据驱动业务的时代,各行各业中不同体量的客户都意识到数据的重要性,但是面对日益增加的各式各样的数据,如何知晓这些数据是什么,什么时间,什么地方发生了变化,这个数据的拥有者又是谁,等等。只有清楚的知晓这些内容,才能让不同的业务部门利用到数据,也才能做到数据驱动业务。这个时候,数据的元数据管理与数据治理成为企业级数据湖的重要部分。本文聚焦于构建在Amazon EMR之上的Apache Atlas展现数据目录和数据血缘。

二、简要说明

Amazon EMR是是一个托管的Hadoop平台,可简化运行大数据框架(如Apache Hadoop和Apache Spark)的方式, 在亚马逊云科技的公有云平台上处理和分析海量数据。借助这些框架和相关的开源项目 (如 Apache Hive 和 Apache Pig)。您可以处理用于分析目的的数据和商业智能工作负载。此外,您可以使用 Amazon EMR 提取/处理/载入数据到其他亚马逊云科技的数据存储和数据库中,例如 Amazon Simple Storage Service (Amazon S3) 。

Apache Atlas最早由HortonWorks实现,用来管理Hadoop项目里面的元数据,进而设计为数据治理的框架。后来开源出来给Apache社区。以下是其架构图:

图片来源:https://atlas.apache.org/#/Architecture

该框架天然就支持横向扩展,能很好的和Hadoop平台中其他组件进行集成,非常适合在共有云上使用。

Apache Atlas的最核心部分就是类型管理系统(Type System),用户可以把数据资产进行类型定义,然后使用Ingest/Export模块进行元数据的导入、修改、删除等管理。和外界的接口可以通过Http/Rest API或使用Kafaka进行消息交换。数据对象存放在按照图的模式进行管理的JanusGraph图数据库中,具体JanusGraph又把元数据存放在HBase中,索引存放在Solr中。这样用户可以非常便捷和直观的通过层次图进行浏览,可以按照字符串进行精确的检索。

另外,Atlas为组织提供开放的元数据管理和治理能力,以建立其数据资产的目录。Atlas支持数据的分类,数据发现,数据血缘。它还提供了搜索关键元素及其业务定义的功能。

三、环境部署

此处我们会使用两种方式来创建Amazon EMR集群和安装Atlas,分别是手动创建Amazon EMR集群和安装Atlas,以及通过CDK来自动创建Amazon EMR集群和安装Atlas

(一)手动创建Amazon EMR集群和安装Atlas

1) 创建Amazon EMR集群

首先创建一个带有Apache Hadoop、Hive、HBase、Hue和ZooKeeper等应用的Amazon EMR集群。Apache Atlas使用Apache Solr进行搜索功能,使用Apache HBase进行存储。Solr和HBase都安装在持久的Amazon EMR集群上,作为Atlas安装的一部分。

aws emr create-cluster --auto-scaling-role EMR_AutoScaling_DefaultRole --termination-protected --applications Name=Hadoop Name=Hive Name=HBase Name=Hue Name=ZooKeeper --ebs-root-volume-size 50 --ec2-attributes '{"KeyName":"<your_key_name>","InstanceProfile":"EMR_EC2_DefaultRole","SubnetId":"subnet-0c3b898eea96b4f3e","EmrManagedSlaveSecurityGroup":"sg-0d5296d5ecc314461","EmrManagedMasterSecurityGroup":"sg-0f5a587aa2c9d43dc"}' --service-role EMR_DefaultRole --enable-debugging --release-label emr-5.33.0 --log-uri 's3n://aws-logs-6***********-cn-northwest-1/elasticmapreduce/' --name 'emratlas' --instance-groups '[{"InstanceCount":2,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"InstanceGroupType":"CORE","InstanceType":"m5.xlarge","Name":"Core - 2"},{"InstanceCount":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"InstanceGroupType":"MASTER","InstanceType":"m5.xlarge","Name":"Master - 1"}]' --scale-down-behavior TERMINATE_AT_TASK_COMPLETION --region cn-northwest-1


下面的命令显示Amazon EMR集群的状况

aws emr list-clusters --active | jq .Clusters[0]


如下图说明集群已经正常可用。

2) 创建额外的步骤

aws emr add-steps --cluster-id j-18RWZV76AQF4M  --steps Name='Run Script',Jar=command-runner.jar,Args=[bash,-c,'curl https://aws-bigdata-jerry-blog.s3.cn-northwest-1.amazonaws.com.cn/apache-atlas.sh -o /tmp/script.sh; chmod +x /tmp/script.sh; /tmp/script.sh']

此步骤主要是安装Atlas的和kafka这样的依赖的组件。具体内容请查看Github 链接( https://github.com/jerryjin2018/Bigdata-Atlas/blob/main/apache-atlas.sh )

正常执行完成。

aws emr list-steps --cluster-id j-18RWZV76AQF4M | jq .Steps[0]

登陆到Amazon EMR集群master节点上,可以看到Atlas服务已经启动,并且监听在21000端口。

(二)通过CDK自动创建Amazon EMR集群和安装Atlas

可以参考链接 https://github.com/aws-samples/aws-cdk-emr-atlas

1) 准备前置条件

(1)你需要准备一个密钥对,将被赋给Amazon EMR集群中的EC2实例,在接下来步骤中的aws-cdk-emr-atlas/aws-emr-cdk目录中的app-config.yaml文件中进行配置

(2)你需要创建两个S3桶,并在app-config.yaml中配置为s3_log_bucket和s3_script_bucket

aws s3 mb s3://jerry-cdk-emr-log-bucket
aws s3 mb s3://jerry-cdk-emr-script-bucket


(3)将aws-cdk-emr-atlas/aws-emr-cdk放置到刚才为s3_script_bucket创建的S3桶,上面的例子中的jerry-cdk-emr-script-bucket

(4)EMR服务的IAM角色和工作流IAM角色将被自动创建

(5)一个带有公共子网的VPC将被自动创建

2) 创建Amazon EMR集群

亚马逊云科技Cloud Development Kit(CDK) 是一种开源软件开发框架,可让您使用熟悉的编程语言来定义云应用程序资源。

亚马逊云科技CDK利用编程语言的常见性和表达能力为应用程序建模。它为您提供名为结构的高级组件,使用经过验证的默认值预配置云资源,因此您无需成为专家也可构建云应用程序。亚马逊云科技CDK通过亚马逊云科技 CloudFormation以安全、可重复的方式预置您的资源。它还支持您编写和分享体现组织要求的自定义结构,帮助您更快启动新项目。

按照此链接( https://docs.aws.amazon.com/zh_cn/cdk/latest/guide/getting_started.html

中的步骤,安装CDK和下载相关安装代码(此处以Amazon Linux 2环境为例)

sudo npm install -g aws-cdk
cdk –version
git clone https://github.com/aws-samples/aws-cdk-emr-atlas
cd aws-cdk-emr-atlas/aws-emr-cdk


注意修改一下aws-cdk-emr-atlas/aws-emr-cdk目录中app-config.yml文件的内容,主要就是替换你的亚马逊云科技的Account ID和对应EMR集群所在的区域。还有就是EMR的版本和S3桶的桶名和秘钥对,具体是如下5项你已经准备了的.

另外就是用如下命令将apache-atlas-emr.sh上传到为s3_script_bucket创建的S3桶,上面的例子中的jerry-cdk-emr-script-bucket

aws s3 cp apache-atlas-emr.sh s3://jerry-cdk-emr-script-bucket/


安装相应的依赖包和创建Amazon EMR集群和安装Atlas

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip3 install PyYAML
pip3 install aws_cdk.core
pip3 install aws_cdk.aws_emr
pip3 install aws_cdk.aws_ec2
cdk deploy
#You may need to upgrade CDK CLI through following command 
npm install -g aws-cdk

创建Amazon EMR集群的过程
下面的命令显示Amazon EMR集群的状况

aws emr list-clusters --active | jq .Clusters[0]

登陆到Amazon EMR集群master节点上,可以看到Atlas服务已经启动,并且监听在21000端口。

(三)后续步骤

1) 创建浏览器代理

因为创建的Amazon EMR集群中服务(除了SSH服务)是不会直接对公网开放的,那如何从你的workstation访问这些服务了。可以通过“使用SSH动态端口转发与主节点之间的 SSH 隧道” https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-ssh-tunnel.html

和“配置浏览器代理以查看EMR主节点上托管的服务“ https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-connect-master-node-proxy.html

来访问。

2) 访问Atlas

通过亚马逊云科技Amazon EMR的页面,我们可以看到我们刚刚创建的EMR集群的信息。当我们选择”应用程序历史记录”选项时,我们可以看到On-cluster application user interfaces的信息,这里包含了EMR集群中的一些服务的访问地址。我们按照“HDFS 名称节点”的URL的格式,将端口换为21000,我们就可以访问Atlas的服务页面

在开启SSH动态端口转发情况下,访问Atlas的web界面(默认的用户名和密码都是admin),如下图:

Atlas 允许用户为他们想要管理的元数据对象定义一个模型。该模型由称为 “类型” (type)的定义组成。这些元数据对象也被被称为“实体”(entities)。由 Atlas 管理的所有元数据对象(例如Hive表)都使用类型进行建模,并表示为各种类型的“实体”(entities)。

Type:Atlas中的 “类型” 定义了如何存储和访问特定类型的元数据对象。类型表示了所定义元数据对象的一个或多个属性集合。如果您有开发背景,很容易将 “类型” 理解成面向对象的编程语言的 “类” 定义的或关系数据库的 “表模式”。

当我们在Atlas的SEARCH选项中的“Search By Type”中选择Asset再Search,可以看到我们目前什么内容也没有,因为数据目录中还没有数据:

四、数据目录和数据血缘

1) 创建实验数据一

Atlas安装包提供了两个例子数据。登陆到Amazon EMR的master节点上,我们先来看看这两个例子数据:

cd /apache/atlas/bin/
ls -l
sudo python ./quick_start.py
sudo python ./quick_start_v1.py




我们在Atlas中再Search Asset,看到了各种类型(Type)的“实体”(entities)。

Atlas 提供了一些预定义的系统类型,特别是如下的集中类型:

Asset:此类型包含名称,说明和所有者等属性

DataSet:此类型扩展了Referenceable和Asset 。在概念上,它可以用于表示存储数据的类型。在 Atlas 中,hive表,Sqoop RDBMS表等都是从 DataSet 扩展的类型。扩展 DataSet 的类型可以期望具有模式,它们将具有定义该数据集的属性的属性。例如, hive_table 中的 columns 属性。另外,扩展 DataSet 的实体类型的实体参与数据转换,这种转换可以由 Atlas 通过 lineage(血缘)生成图形。

Process:此类型扩展了Referenceable和Asset 。在概念上,它可以用于表示任何数据变换操作。例如,将原始数据的 hive 表转换为存储某个聚合的另一个 hive 表的 ETL 过程可以是扩展过程类型的特定类型。流程类型有两个特定的属性,输入和输出。

Apache atlas的其中一个核心特性就是可以追溯数据湖中数据的血缘关系(lineage)并以可视化的方式呈现,使用户能够快速了解数据的生命周期,并能够知晓数据是从那里来以及和数据湖中数据之间的关联关系。

2) 创建实验数据二

我们来创建一些Hive的外表,从如下链接下载一些公开的数据集,并做简单处理(删除几个不需要的字段,和更改字段名称),再将数据文件上传到笔者的名称为aws-bigdata-jerry-blog的S3存储桶中。

https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page

登陆到Amazon EMR集群的master节点上,在命令提示符处,输入命令:

hive
show databases;
show tables;


创建trip_details表

CREATE external TABLE trip_details
(
  dispatching_num    int ,
  pickup_datetime    string ,
  dropoff_datetime   string ,
  location_id        int 
)
row format delimited
fields terminated by ',' stored as textfile
LOCATION 's3://aws-bigdata-jerry-blog/trip_details/';


创建trip_zone_lookup表

CREATE external TABLE trip_zone_lookup 
(
LocationID     int ,
Borough        string ,
Zone           string ,
service_zone   string
)
row format delimited
fields terminated by ',' stored as textfile
LOCATION 's3://aws-bigdata-jerry-blog/trip_zone_lookup/';


查看trip_details和trip_zone_lookup表的数据的条数:

创建一个由trip_details和trip_zone_lookup join的表trip_details_by_zone

create table trip_details_by_zone as select *  from trip_details p join trip_zone_lookup z on z.LocationID = p.location_id;


这次我们在Atlas中再Search Asset,看到了更多类型(Type)的“实体”(entities),特别是hive_table,hive_column和hive_process.

这次我在Atlas左侧选择的SEARCH选项中的“Search By Type”中选择hive_table, “Search By Text”中选择trip_details_by_zone,再Search:

从Properties,我们能看到关于这张表的信息,特别是这张表中的数据字段是什么,什么时间,什么地方发生了变化(创建时间),这个数据的拥有者又是谁,等等。

我们再来看一下表trip_details_by_zone的血缘关系(lineage)和关系(Relationships)

五、总结

在这篇博客中,我们概述了通过使用AWS CLI和通过CDK来安装和配置Amazon EMR集群,以及在Amazon EMR集群之上部署和配置Apache Atlas。我们还探讨了如何将数据导入Atlas,并使用Atlas界面来查询和查看相关数据的数据目录和数据血缘。

参考材料:

https://www.jianshu.com/p/c65f54dd5e7d
https://my.oschina.net/sunmin/blog/3064462
https://atlas.apache.org/2.0.0/InstallationSteps.html
https://developpaper.com/getting-started-with-apache-atlas/

本篇作者

金忠敏

AWS解决方案架构师,现在专注于云计算解决方案和架构的工作。具有超过15年的IT从业经验,曾从事软件开发,售后支持,系统交付,售前等工作。参与过很多大型项目架构设计和实施交付。

贾婷

AWS快速原型解决方案架构师,致力于帮助客户设计和开发大数据方向的快速原型方案,有游戏、汽车行业的大数据开发经验。在业余时间,她喜欢跑步、瑜伽以及和家人旅行。