写点什么

使用 Athena 替换 Hbase 实现对历史数据的查询分析

  • 2019-11-27
  • 本文字数:3677 字

    阅读完需:约 12 分钟

使用 Athena 替换 Hbase 实现对历史数据的查询分析

Apache HBase 是一种构建在 HDFS 之上的分布式、面向列的存储系统。在需要实时读写、随机访问超大规模数据集时,作为用户的首选分布式数据库;但 HBase 也有其局限性,譬如说不支持 SQL 语句查询,随着数据规模的变大,造成用户成本的大幅增加,其稳定性和故障恢复能力会变差,也给运维人员带来很大的挑战;我们在拜访客户时也发现有些用户将大量的历史数据和在线数据全部存储在 HBase 中也遇到了上述问题。因而本文将介绍一种帮助用户从 HBase 数据库中剥离出历史数据,减小 HBase 数据库的规模,提高其稳定性并大幅降低客户的成本,实现对历史数据的查询的方案。

Apache HBase 特点及应用场景

Apache HBase 是一个分布式,版本化,面向列的开源数据库,构建在 Aapche Hadoop 和 Aapche ZooKeeper 之上。它特别适合千万级的高并发海量数据的瞬间写入,而相对读数据量小的应用,支持存储结构化和非结构化数据和数据的多版本化。但它不适合大范围的扫描查询和支持多条件的查询,不支持基于 SQL 语句的查询。

Amazon Athena 特点及应用场景

Amazon Athena 是一种交互式查询服务,让您能够轻松使用标准 SQL 直接分析 Amazon S3 中的数据。只需在 AWS 管理控制台中单击几下,客户即可将 Athena 指向自己在 S3 中存储的数据,然后开始使用标准 SQL 执行临时查询并在数秒内获取结果。Athena 是 Serverless 服务,因此没有需要设置或管理的基础设施,客户只需为其执行的查询付费。它特别适合使用 Athena 处理日志、执行即席分析以及运行交互式查询。Athena 可以自动扩展并执行并行查询,因此可快速获取结果,对于大型数据集和复杂查询也不例外。


本次实验演示的 Demo 数据来自于纽约出租车公司公布的公开数据源 2017 年 1 月到 6 月份 Green Taxi trip 数据,下载链接:https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page。

准备模拟数据并上传到 S3 Bucket

登陆 AWS 管理控制台,创建 S3 bucket 命名为 nytaxisdata,然后创建三个文件夹分别命名为 green,hbasedata,hbaseexport 如下图所示:



处理数据


清理掉原始数据中的空格列,运行如下命令:


Bash


awk 'BEGIN{FS=OFS=","}{gsub(/ /,"-",$2);gsub(/ /,"-",$3);print $0}' green_tripdata_2017-01.csv |more
[hadoop@ip-172-31-28-170 ~]$ awk 'BEGIN{FS=OFS=","}{gsub(/ /,"-",$2);gsub(/ /,"-",$3);print $2,$3,$1,$6,$7}' green_tripdata_2017-01.csv >>greentrip01.csv
复制代码


如下图所示:



分别依次处理完对应的 6 个 excel 文件。然后将处理完的 2017 年 1 月到 6 月份的数据文件上传到 green 文件夹内,如下图所示:


创建 EMR 集群

登陆到 AWS 管理控制台,选择 EMR 服务,点击创建集群,如下图所示:



点击 Go to Advanced options,选择 Hadoop 和 HBase 服务如下图所示:



在 Storage Mode 中选择 S3,并设置上面刚创建的 bucket 路径 s3://nytaxisdata/hbasedata,如下图所示:



在 Hardware Configuration 设置中选择 Uniform instance groups,并设置网络,子网组及根卷大小,此处设置为 100G,如下图所示:



点击下一步,设置 EMR 集群的节点类型和实例数,如下图所示:



点击下一步输入集群名称 hbasecluster,其他默认即可,如下图所示:



点击 Next,设置 EC2 key pair,如下图所示:



点击 Create cluster,等待集群创建完成。

登陆 HBase 集群

创建一个表名为 taxiinfo 的表,指定列簇为 userinfo 和 Others,运行如下命令:


Bash


hbase(main):001:0> create 'taxiinfo','dropofftime','comno','others'
复制代码


如下图所示:


导入数据到 HBase 集群

运行如下命令:


Bash


sudo hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,dropofftime,comno,others:distance,others:length taxiinfo s3://nytaxisdata/green/greentrip01.csv
复制代码


一次运行上面的命令将 greentrip01.csc 到 greentrip06.csv 文件全部导入到 hbase 数据库名为 taxiinfo 中。


统计表中的数据总行数,运行命令 count,如下所示:


Bash


hbase(main):002:0> count 'taxiinfo',INTERVAL=>100000
Current count: 100000, row: 2017-01-04-22:58:55
Current count: 200000, row: 2017-01-08-16:39:14
Current count: 300000, row: 2017-01-12-15:35:40
……
Current count: 4300000, row: 2017-06-04-03:39:03
Current count: 4400000, row: 2017-06-08-09:56:53
Current count: 4500000, row: 2017-06-11-18:32:27
Current count: 4600000, row: 2017-06-15-20:14:35
Current count: 4700000, row: 2017-06-19-13:37:54
Current count: 4800000, row: 2017-06-23-15:21:13
Current count: 4900000, row: 2017-06-27-14:46:20
4989642 row(s) in 257.1330 seconds
=> 4989642
复制代码


至此,验证 HBase 中的数据准备完毕。

剥离 HBase 数据库中的历史数据

根据需要用户可以将 HBase 数据库中的历史数据进行导出,HBase 数据库中的数据导出为 CSV 文件有多种方式,譬如自己编写 MapReduce 类实现,或者借助 Pig 应用等,本文采用 happybase 包实现。HappyBase 是方便开发人员通过 python 实现与 HBase 进行交互的开发库,通过编写 Python 脚本方式非常灵活的将任意条件的存储在 HBase 中的数据抽取处理转换成 CSV 文件。


安装 HappyBase


登陆到 EMR Master 节点,运行如下命令:


Bash


[hadoop@ip-172-31-36-88 ~]$ sudo pip install happybase
复制代码


如下图所示:



导出 HBase 数据


编写 Python 脚本如下所示:


Python


import happybase, sys, os, string
# 设置导出数据目录/mnt
# Output directory for CSV files
outputDir = "/mnt"
# HBase Thrift server to connect to. Leave blank for localhost
server = ""
# 连接到HBASE数据库
c = happybase.Connection(server)
# Get the full list of tables
tables = c.tables()
# 轮询数据库中的所有表
for table in tables:
# 写文件
file = open(outputDir + "/" + table + ".csv", "w")
t = c.table(table)
print table + ": ",
count = 0
for prefix in string.printable:
try:
for key, data in t.scan(row_prefix=prefix):
# 第一个key
if count == 0:
startRow = key
for col in data:
value = data[col]
column = col[col.index(":")+1:]
# 写行,列,值
file.write("%s, %s, %s\n" % (key, column, value))
count += 1
except:
os.system("hbase-daemon.sh restart thrift")
c = happybase.Connection(server)
t = c.table(table)
continue
# 最后一个key
endRow = key
print "%s => %s, " % (startRow, endRow),
print str(count)
复制代码


保存运行命令:


Bash


python hbase_export_csv.py
复制代码


如下图所示数据导出 4989642:



将导出的 csv 文件上传到 s3://nytaxisdata/exportdata 文件夹下,如下图所示:


使用 Amazon Athena 实现对历史数据的查询

打开 AWS Athena 管理控制台,运行如下命令:


Bash


CREATE EXTERNAL TABLE `hbaseexport`(
`col0` string,
`col1` string,
`col2` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://nytaxisdata/hbaseexport/'
复制代码


如下图所示:



数据查询


在 SQL 脚本编写区,运行如下查询:


Bash


SELECT * FROM "nymetadatastore"."hbaseexport" limit 10;
复制代码


如下图所示:


总结

通过本篇您将了解到如何使用使用 HappyBase 库编写 Python 脚本实现将 HBase 数据库中的历史数据的随意抽取并转换成 csv 文件,利用 Athena 实现对存储在 S3 上数据文件的访问。该方案可以帮助客户减小 HBase 集群,大幅降低数据的访问成本。


作者介绍:


!



### [](https://amazonaws-china.com/cn/blogs/china/tag/%E7%8E%8B%E5%8F%8B%E5%8D%87/)
王友升拥有超过13年的IT从业经验,负责基于AWS的云计算方案架构咨询和设计,推广AWS云平台技术和各种解决方案。在加入AWS之前,王友升曾在中地数码,浪潮,惠普等公司担任软件开发工程师、DBA和解决方案架构师。他在服务器、存储、数据库优化方面拥有多年的经验,同时对大数据、Openstack及人工智能和机器学习方面也进行一定的研究和积累。
复制代码


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/using-athena-to-replace-hbase-to-query-analyze-historical-data/


2019-11-27 08:00959

评论

发布
暂无评论
发现更多内容

快手后端面试,被面试官秒挂了!

快乐非自愿限量之名

Java Python 面试 后端

什么是原生IP?

Ogcloud

IP 海外原生IP 海外IP 海外IP代理 海外静态IP

开源for Huawei,Beam适配GaussDB实践案例分享

华为云开发者联盟

Beam GaussDB Java’ #数据库 #开源

鸿蒙元服务审核上的一些思考

flfljh

JVM简介—垃圾回收器和内存分配策略

不在线第一只蜗牛

Python JVM

金融领域研发效能的特性有哪些?拓展边界是什么?

思码逸研发效能

研发效能 金融科技 研发效能度量 研发效能管理 思码逸

怎么通过API获取电竞赛事实时数据

熊猫比分大卫

体育直播网源码 电竞数据

告别传统FAQ,天润融通如何通过AI优化员工服务体验?

天润融通

和鲸科技荣获 2024 全国人工智能应用场景创新挑战赛二等奖,赋能“学科+AI”人才培养与实验室建设

ModelWhale

人工智能 大数据 AI

【双喜】矩阵起源子公司荣膺“2024上海市高成长百家”第一、 荣获上海市技术创新资金立项资助

MatrixOrigin

AI 技术创新 MatrixOrigin 矩阵起源 GenAI

阿里P8面试官重磅首发2025年Java岗春招面试总结!

程序员高级码农

Java 编程 程序员 java面试 Java面试题

【YashanDB知识库】如何排查YMP报错:”OCI版本为空或OCI的架构和本地系统的架构不符“

YashanDB

数据库 yashandb

一文了解多云原生的现代化实时数仓 SelectDB Cloud

SelectDB

云计算 数据仓库 云原生 云数据库 SelectDB

英特尔IEDM 2024大晒封装、晶体管、互连等领域技术突破

E科讯

Hume 语音模型 OCTAVE:实现情感语音合成、声音克隆和多角色对话生成;通义开源多模态说话人识别项目 3D-Speaker

声网

【YashanDB知识库】启动数据库时报错:YAS-02059 control file version 0.2.64 is incompatible with YashanDB version 0.2.65

YashanDB

数据库 yashandb

【YashanDB知识库】如何处理报错"UDT column batch insert" has not been implemented yet

YashanDB

数据库 yashandb

【YashanDB知识库】如何限制用户session连接数

YashanDB

数据库 yashandb

2024年低代码趋势洞察——企业最看重的功能有哪些

JeeLowCode低代码平台

低代码开发 低代码开发工具 低代码,

测试人生 | 手工转测试开发成功秘籍揭秘:从裁员到入职18k+,收获4个Offer,道阻且长不怯步

测吧(北京)科技有限公司

测试

什么是企业组网?企业组网的重要性解析

Ogcloud

组网 企业组网 企业网络 公司网络

矩阵起源荣膺"2024AI最佳实践案例"------多模态AI数据智能平台,让您的数据成就您的AI

MatrixOrigin

数据库 AI InfoQ 技术创新 MatrixOrigin

技术干货丨OptiStruct 非线性之前车门下沉分析

Altair RapidMiner

汽车 制造 仿真 sheji altair

京东科技基于 Apache SeaTunnel 探索复杂场景适配

白鲸开源

Clickhouse 数据同步 数据集成 Apache SeaTunnel 京东科技

Java代码覆盖率super-jacoco

EquatorCoco

Java

启用Linux防火墙日志记录和分析功能

运维有小邓

IT自动化运维 linux日志管理 防火墙日志管理

天润融通解决方案:大模型让SOP执行监管更智能

天润融通

【YashanDB知识库】如何解决共享集群部署遇到报错:YAS-05721 invalid input parameter, reason: node name invalid.

YashanDB

数据库

开发一个DApp项目:DeFi、DApp开发与公链DApp开发

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

图像识别大揭秘:从安防到自动驾驶,视觉模型如何重塑世界

测吧(北京)科技有限公司

测试

今日分享 | 新增任务交互秘籍

inBuilder低代码平台

设计 UX 交互设计

使用 Athena 替换 Hbase 实现对历史数据的查询分析_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章