使用superset和Athena进行数据可视化

由于目前中国区region没有上线QuickSight服务,可视化环节我们将使用本地Docker部署superset来进行,要完成本实验,请确保您的本地环境已经安装Docker。您可以参考这里的指导快速完成Docker在本地的安装。您也可以快速启动一台EC2或EKS/ECS来部署superset镜像。
1,如果您已经安装了Docker,请执行docker version 检查是否安装成功。
➜ docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:21:11 2020
OS/Arch: darwin/amd64
Experimental: false.................
2,现在,我们从互联网下载Superset docker镜像
请使用拉取镜像的命令:docker pull amancevice/superset
Using default tag: latest
latest: Pulling from amancevice/superset
8f0fdd3eaac0: Downloading [===> ] 3.578MB/50.38MB
d918eaefd9de: Downloading [====================> ] 3.144MB/7.812MB
43bf3e3107f5: Downloading [===============> ] 3.062MB/9.996MB
27622921edb2: Waiting
dcfa0aa1ae2c: Waiting
ca7e1bbea389: Waiting .................
检查是否已经完成镜像的下载:docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
amancevice/superset latest 796cfafa63e2 6 weeks ago 1.8GB
3,启动Superset容器 docker run -p 8088:8088 -d amancevice/superset
docker run -p 8088:8088 -d amancevice/superset
989c3f7b54397ba0e94cc69a73be95842c1c909a64e91439801f45396f88af3d
4,查看Superset容器运行状态,docker ps
➜ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c5786163f7f amancevice/superset "gunicorn superset.a…" 2 hours ago Up 2 hours (healthy) 0.0.0.0:8088->8088/tcp sleepy_euclid
➜ superset
5,初始化Superset容器,注册账号信息,并等待初始化完成,请将查看docker状态命令中的CONTAINER ID指定在命令中,执行docker exec -it CONTAINERID superset-init,例如docker exec -it 7c5786163f7f superset-init。随后自定义账户信息您可以全部输入admin或您自定义的名字
➜ docker exec -it 7c5786163f7f superset-init
Username [admin]: admin
User first name [admin]: admin
User last name [user]: admin
Email [admin@fab.org]: admin
Password:
Repeat for confirmation:
/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
""")
2020-03-03 08:13:49,694:INFO:root:logging was configured successfully
2020-03-03 08:13:49,819:INFO:root:Configured ....................
6,最后,为superset加入连接Athena需要的依赖,请执行docker exec -it CONTAINERID pip install PyAthenaJDBC
➜ docker exec -it 7c5786163f7f pip install PyAthenaJDBC
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: PyAthenaJDBC in ./.local/lib/python3.6/site-packages (2.1.0)
Requirement already satisfied: jpype1<=0.7.0,>=0.6.0 in ./.local/lib/python3.6/site-packages (from PyAthenaJDBC) (0.7.0)
Requirement already satisfied: future in /usr/local/lib/python3.6/site-packages (from PyAthenaJDBC) (0.18.2)
以上,我们完成了Superset的安装和对接Athena的准备工作。
现在您可以在数据库中添加表,还记得我们刚刚用 Glue 聚合了两个评分表吗,我们可以再用Glue创建他的表结构,并在superset里使用他
登录到AWS管理控制台https://console.aws.amazon.com/。
在AWS管理控制台的右上角,确认您位于所需的AWS区域。
从所有服务列表中单击“Glue”。这将带您进入AWS Glue控制台页面。
单击左侧面板上的“爬网程序”,然后单击“添加爬网程序”
对于爬网程序名称名称,输入你自定义的名称,例如RatingForSuperset。
单击下一步
对于数据存储,请确保已选择S3。浏览到在实验1中创建的存储桶(实验1中记录的存储桶)中的xxxxxx-Partner-works。单击选择,在点击到您在上一环节中将两张rating表做聚合ETL输出的路径,如这里的
354790194606-partner-workshop/ml/trainingdata/rating/。

单击下一步
选择否以添加其他数据存储
单击下一步
选择一个现有的IAM角色,然后在下拉框中选择glue-service-role,他应该具有读取S3的权限。
单击下一步
对于“频率”,选择“按需运行”,然后单击“下一步”。
对于“数据库”,单击“添加数据库”,例如命名为“ml-data-lake”,然后单击“创建”。
单击下一步
查看配置,然后单击“完成”。
在“爬网程序”页面上,选中刚创建的爬网程序的复选框,然后单击“运行爬网程序”。
等待搜寻器完成。
单击左侧面板上的数据库,然后选中您自定义的数据库名称(如示例的ml-data-lake)数据库旁边的复选框,然后单击查看表。
验证您的表是根据S3数据创建的。 表名为rating

现在我们配置Athena查询rating的数据。
登录到AWS管理控制台https://console.aws.amazon.com/。
在AWS管理控制台的右上角,确认您位于所需的AWS区域。
从所有服务列表中单击“Athena”。这将带您进入Athena控制台页面。
如果您的账号之前没有使用过Athena,你将看见欢迎导航页面,导航会要求你输入Athena Query result location,这是你未来使用Athena进行查询保存结果的S3位置,请您输入任意自定义的路径,例如s3://tmp-263168716248/athena-output/.未来你也可以通过Athena页面右上角的Settings按钮配置该项

ml-data-lake,这样您将在Tables项看见Glue中存储的两个表,2020和rating(它们的数据在S3,数据结构在Glue catalog)。

我们继续配置,完成superset对接Athena,以实现可视化 1,首先,我们为superset准备一个具有权限的IAM用户
用户,点击添加用户,随后填写用户名,例如workshop-superset,并在访问类型上点击编程访问,点击下一步
直接附加现有策略,在筛选策略栏位,我们依次搜索并勾选以下3个策略:AWSGlueConsoleFullAccess ,AmazonAthenaFullAccess ,AmazonS3FullAccess ,点击两次下一步至审核页面
检查无误,点击创建用户
创建用户成功后将看见凭证获取页面,我们点击下载CSV,或者点击访问秘钥栏位的显示,这将获取一会将赋予superset的 AKSK凭证,请保留这个页面或记录AKSK值备用

2,浏览器访问superset客户端http://localhost:8088,输入您刚刚自定义的用户名密码进行登录,例如admin/admin

3,来到superset控制台,现在配置连接Athena
点击Data,点击Database,进入到Database管理页面,点击右上角的加号进行数据库添加


4,在添加数据库页面,需要填写Database名称,和SQLAlchemy URI,SQLAlchemy URI格式组成如下:
awsathena+rest://{aws_access_key_id}:{aws_secret_access_key}@athena.{region_name}.amazonaws.com.cn/{schema_name}?s3_staging_dir={s3_staging_dir}&…
{aws_access_key_id}:{aws_secret_access_key}是您刚刚创建的IAM ASSK{region_name}是你的Athena所在区域{schema_name}是你Glue中存放表元数据的数据库名称{s3_staging_dir}是你保存查询结果和记录的桶名称和路径(您可以填写Athena结果保存路径,或是创建一个新的桶路径填在这里)例如最终拼接出中国区域的连接地址示例: awsathena+rest://AKIASJCHSJHN87DXD980:XXXXXXXXXX@athena.cn-northwest-1.amazonaws.com.cn/ml-data-lake?s3_staging_dir=s3://aws-athena-query-results-xx/
全球区域的连接地址示例: awsathena+rest://AKIAT2RQT5XMNQINWOG7:xxxxxxxxxx@athena.us-east-2.amazonaws.com/ml-data-lake?s3_staging_dir=s3://tmp-263168716248/athena-output/

5,填写完后点击TEST CONNECTION测试连接可用性.其他项均可使用默认,点击创建以创建新的catalog连接。
点击Sources,点击Dataset,进入到Dataset管理页面,点击右上角的加号进行表添加
填写你的表名称,与Glue保持一致,例如rating,点击SAVE

4,执行可视化查询

rating表的结构,4个字段分别是用户ID、电影ID、评分、时间戳.我们可以选择2位的柱状图已做实例。请选择我们刚刚添加的rating表和柱状图模板。


例如,Query里为Group by选择userid,在Metrics栏位为rating表选择COUNT,AVG,MAX,MIN,这样,您将可以看见全部用户进行了多少次电影评分,这么多次打分中平均分是多少,打出的最高分以及打出的最低分。
例如,Visualization Type 选择Pie Chart(饼图),Query里为Metrics栏位选择rating表的AVG,Group by选择movieid,Row limit选择10,这样,您将可以看见被点评打分次数最高的10部电影饼图分布。
依然使用饼图,你还可以在Query里为Metrics栏位选择rating表的COUNT,Group by选择movieid,Filters选择COUNT(rating) > 200,Row limit选择10,这样,您将可以打分次数高于200次的前10部电影,并且他们按平均分进行分布。
您还可以点击右上角的各种功能按钮,例如结果导出为JSON,CSV,查看SQL语句。查看SQL语句将反馈您锁点选的查询的SQL代码,您可以将它复制到Athena中运行,验证SQL结果。

回到superset中,当您点击任意列名,排列将切换正序和倒序。或许您可以继续深挖,可视化出评分的平均分最高的电影ID,分析哪些用户为相同的电影打出了接近的分数等等操作。
当您点击左上角SAVE将可以把您绘制的图标添加到指定的dashboard。

至此,我们完成了实验4。请您考虑:当我的业务有海量的存量数据,他们或许有空值,无效值,我们如果建立数仓分层,superset这类数据可视化工具应该去什么样的表格