发布于: Aug 22, 2022

大数据元数据管理是高效利用数据湖的关键,本文将会为你讲解如何使用 Apache Atlas on Amazon EMR 进行元数据的搜索工作。

为了演示 Apache Atlas 的功能,我们在本文中执行了以下操作(您可以选择 1a 或者 1b 任意一种方式来启动带 Atlas 的 EMR 集群):

  1. 使用 Amazon Web Services CLI 或 Amazon Web Services CloudFormation 启动一个 Amazon EMR 集群
  2. 使用 Hue 填充外部 Hive 表
  3. 查看 Hive 表的数据沿袭
  4. 创建一个分类
  5. 使用 Atlas 领域专用语言发现元数据

以下步骤将指导您使用 Amazon Web Services CLI 安装 Atlas on Amazon EMR。此安装将使用 Hadoop、HBase、Hive 和 Zookeeper 创建一个 Amazon EMR 集群。此外还执行了一个步骤,运行位于 Amazon S3 存储桶中的脚本,以将 Apache Atlas 安装在 /apache/atlas 文件夹下。

运行自动化外壳 shell 脚本基于如下假设:

  • 您已配置了 Amazon Web Services CLI 程序包的有效本地副本,其中包含访问密钥和加密密钥。
  • 您在计划部署集群的 Amazon Web Services 区域中具有默认密钥对、VPC 和子网。
  • 您拥有足够的权限,可以在 Amazon Web Services CLI 中配置的默认 Amazon Web Services 区域内创建 S3 存储桶和 Amazon EMR 集群。
aws emr create-cluster --applications Name=Hive Name=HBase Name=Hue Name=Hadoop Name=ZooKeeper \
  --tags Name="EMR-Atlas" \
  --release-label emr-5.16.0 \
  --ec2-attributes SubnetId=<subnet-xxxxx>,KeyName=<Key Name> \
--use-default-roles \
--ebs-root-volume-size 100 \
  --instance-groups 'InstanceGroupType=MASTER, InstanceCount=1, InstanceType=m4.xlarge, InstanceGroupType=CORE, InstanceCount=1, InstanceType=m4.xlarge \
  --log-uri ‘<S3 location for logging>’ \
--steps Name='Run Remote Script',Jar=command-runner.jar,Args=[bash,-c,'curl https://s3.amazonaws.com/aws-bigdata-blog/artifacts/aws-blog-emr-atlas/apache-atlas-emr.sh -o /tmp/script.sh; chmod +x /tmp/script.sh; /tmp/script.sh']

成功执行命令后,系统将显示包含集群 ID 的输出:

{
    "ClusterId": "j-2V3BNEB9XQ54H"
}

使用以下命令列出活动集群的名称(准备就绪后,您的集群将显示在列表中):

aws emr list-clusters --active

在上一条命令的输出中,查找服务器名称 EMR-Atlas(除非您在脚本中更改了该默认名称)。如果您有可用的 jq 命令行实用程序,则可以运行以下命令来过滤除了该名称及其对应集群 ID 之外的所有内容:

aws emr list-clusters --active | jq '.[][] | {(.Name): .Id}'
输出示例:
{
  "external hive store on rds-external-store": "j-1MO3L3XSXZ45V"
}
{
  "EMR-Atlas": "j-301TZ1GBCLK4K"
}

在集群显示在活动列表中之后,Amazon EMR 和 Atlas 即可开始运行。

您还可以使用 CloudFormation 启动集群。使用 emr-atlas.template 来设置您的 Amazon EMR 集群,或使用以下按钮直接从 Amazon Web Services 管理控制台启动:

若要启动,请为以下参数提供值:

VPC

<VPC>

Subnet

<子网>

EMRLogDir

<Amazon EMR 日志记录目录,例如 s3://xxx>

KeyName

<EC2 密钥对名称>

使用 CloudFormation 模板预置 Amazon EMR 集群可实现与前面列示的 CLI 命令相同的结果。

在继续下一步之前,请耐心等待,直到 CloudFormation 堆栈的事件中显示堆栈的状态已转为“CREATE_COMPLETE”。

接下来,您登录到 Apache Atlas 和 Hue,并使用 Hue 创建 Hive 表。

要登录到 Atlas,请首先使用 Amazon EMR 管理控制台在集群安装中找到 Master 服务器的公共 DNS 名称。然后,使用以下命令创建到 Atlas Web 浏览器的 SSH 隧道。

ssh -L 21000:localhost:21000 -i key.pem hadoop@<EMR Master IP Address>

如果前面的命令不起作用,请确保您的密钥文件 (*.pem) 具有适当的权限。您可能还必须向主服务器的安全组添加一条 SSH(端口 22)的入站规则。

成功创建 SSH 隧道后,请使用以下 URL 访问 Apache Atlas UI。

http://localhost:21000

此时您应该看到如下所示的屏幕。默认的登录详细信息是用户名 admin、密码 admin。

要为 Hue 设置 Web 界面,请遵循 Amazon EMR 文档中的步骤。与对 Apache Atlas 执行的操作一样,在远程端口 8888 上创建 SSH 隧道以进行控制台访问:

ssh -L 8888:localhost:8888 -i key.pem hadoop@<EMR Master IP Address>

隧道启动后,使用以下 URL 进行 Hue 控制台访问。

http://localhost:8888/

首次登录时,系统会要求您创建一个 Hue 超级用户,如下所示。注意保存好超级用户凭据,切勿遗失。

创建 Hue 超级用户后,您可以使用 Hue 控制台运行 Hive 查询。

登录到 Hue 后,请执行以下步骤并运行以下 Hive 查询:

o 运行 HQL 新建一个数据库:

create database atlas_emr;
use atlas_emr;

o  使用存储在 S3 上的数据创建一个名为 trip_details 的新外部表。将 S3 位置更改为您拥有的存储桶地址。

CREATE external TABLE trip_details
(
  pickup_date        string ,
  pickup_time        string ,
  location_id        int ,
  trip_time_in_secs  int ,
  trip_number        int ,
  dispatching_app    string ,
  affiliated_app     string 
)
row format delimited
fields terminated by ',' stored as textfile
LOCATION 's3://aws-bigdata-blog/artifacts/aws-blog-emr-atlas/trip_details/';

o  使用存储在 S3 上的数据创建一个名为 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-blog/artifacts/aws-blog-emr-atlas/zone_lookup/';

o  通过联接以下表创建 trip_details 和 trip_zone_lookup 的交叉表:

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

接下来,执行 Hive 导入。在 Atlas 中导入的元数据时,只能通过 Amazon EMR 服务器(没有 Web UI)上的命令行来使用 Atlas Hive 导入工具。  首先,请使用 SSH 登录到 Amazon EMR 主服务器:

ssh -i key.pem hadoop@<EMR Master IP Address>

然后执行以下命令。该脚本要求您输入 Atlas 的用户名和密码。默认用户名是 admin,默认密码是 admin。

/apache/atlas/bin/import-hive.sh

如果导入执行成功,其效果如下所示:

Enter username for atlas :- admin
Enter password for atlas :- 
2018-09-06T13:23:33,519 INFO [main] org.apache.atlas.AtlasBaseClient - Client has only one service URL, will use that for all actions: http://localhost:21000
2018-09-06T13:23:33,543 INFO [main] org.apache.hadoop.hive.conf.HiveConf - Found configuration file file:/etc/hive/conf.dist/hive-site.xml
2018-09-06T13:23:34,394 WARN [main] org.apache.hadoop.util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2018-09-06T13:23:35,272 INFO [main] hive.metastore - Trying to connect to metastore with URI thrift://ip-172-31-90-79.ec2.internal:9083
2018-09-06T13:23:35,310 INFO [main] hive.metastore - Opened a connection to metastore, current connections: 1
2018-09-06T13:23:35,365 INFO [main] hive.metastore - Connected to metastore.
2018-09-06T13:23:35,591 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Importing Hive metadata
2018-09-06T13:23:35,602 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Found 2 databases
2018-09-06T13:23:35,713 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/uniqueAttribute/type/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:35,987 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Database atlas_emr is already registered - id=cc311c0e-df88-40dc-ac12-6a1ce139ca88.Updating it.
2018-09-06T13:23:36,130 INFO [main] org.apache.atlas.AtlasBaseClient - method=POST path=api/atlas/v2/entity/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:36,144 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Updated hive_db entity: name=atlas_emr@primary, guid=cc311c0e-df88-40dc-ac12-6a1ce139ca88
2018-09-06T13:23:36,164 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Found 3 tables to import in database atlas_emr
2018-09-06T13:23:36,287 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/uniqueAttribute/type/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:36,294 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Table atlas_emr.trip_details is already registered with id c2935940-5725-4bb3-9adb-d153e2e8b911.Updating entity.
2018-09-06T13:23:36,688 INFO [main] org.apache.atlas.AtlasBaseClient - method=POST path=api/atlas/v2/entity/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:36,689 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Updated hive_table entity: name=atlas_emr.trip_details@primary, guid=c2935940-5725-4bb3-9adb-d153e2e8b911
2018-09-06T13:23:36,702 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/uniqueAttribute/type/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:36,703 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Process atlas_emr.trip_details@primary:1536239968000 is already registered
2018-09-06T13:23:36,791 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/uniqueAttribute/type/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:36,802 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Table atlas_emr.trip_details_by_zone is already registered with id c0ff33ae-ca82-4048-9671-c0b6597e1475.Updating entity.
2018-09-06T13:23:36,988 INFO [main] org.apache.atlas.AtlasBaseClient - method=POST path=api/atlas/v2/entity/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:36,989 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Updated hive_table entity: name=atlas_emr.trip_details_by_zone@primary, guid=c0ff33ae-ca82-4048-9671-c0b6597e1475
2018-09-06T13:23:37,035 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/uniqueAttribute/type/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:37,038 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Table atlas_emr.trip_zone_lookup is already registered with id 834d102a-6f92-4fc9-a498-4adb4a3e7897.Updating entity.
2018-09-06T13:23:37,213 INFO [main] org.apache.atlas.AtlasBaseClient - method=POST path=api/atlas/v2/entity/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:37,214 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Updated hive_table entity: name=atlas_emr.trip_zone_lookup@primary, guid=834d102a-6f92-4fc9-a498-4adb4a3e7897
2018-09-06T13:23:37,228 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/uniqueAttribute/type/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:37,228 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Process atlas_emr.trip_zone_lookup@primary:1536239987000 is already registered
2018-09-06T13:23:37,229 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Successfully imported 3 tables from database atlas_emr
2018-09-06T13:23:37,243 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/uniqueAttribute/type/ contentType=application/json; charset=UTF-8 accept=application/json status=404
2018-09-06T13:23:37,353 INFO [main] org.apache.atlas.AtlasBaseClient - method=POST path=api/atlas/v2/entity/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:37,361 INFO [main] org.apache.atlas.AtlasBaseClient - method=GET path=api/atlas/v2/entity/guid/ contentType=application/json; charset=UTF-8 accept=application/json status=200
2018-09-06T13:23:37,362 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Created hive_db entity: name=default@primary, guid=798fab06-ad75-4324-b7cd-e4d02b6525e8
2018-09-06T13:23:37,365 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - No tables to import in database default
Hive Meta Data imported successfully!!!

成功导入 Hive 之后,您可以返回到 Atlas Web UI 来搜索 Hive 数据库或已导入的表。在 Atlas UI 的左窗格中,选择搜索,然后在其下方列出的两个字段中输入以下信息:

  • 按类型搜索:hive_table
  • 按文本搜索:trip_details
查询的输出如下所示:

相关文章