Yan*_*hao 21 hive amazon-s3 amazon-web-services amazon-quicksight amazon-athena
我有一个火花批处理作业,每小时执行一次.每次运行都S3使用目录命名模式生成并存储新数据DATA/YEAR=?/MONTH=?/DATE=?/datafile.
上传数据后S3,我想使用它来调查它们Athena.更多,我想QuickSight通过连接到Athena作为数据源来将它们可视化.
问题是,每次运行我的Spark批处理后,S3Athena都不会发现存储的新生成的数据,除非我手动运行查询MSCK REPARI TABLE.
有没有办法让Athena自动更新数据,以便我可以创建一个全自动的数据可视化管道?
Zer*_*odf 14
有许多方法可以安排此任务.您如何安排工作流程?您是使用Airflow,Luigi,Azkaban,cron等系统还是使用AWS Data管道?
从中的任何一个,您应该能够启动以下CLI命令.
$ aws athena start-query-execution --query-string "MSCK REPAIR TABLE some_database.some_table" --result-configuration "OutputLocation=s3://SOMEPLACE"
另一种选择是AWS Lambda.你可以有一个函数来MSCK REPAIR TABLE some_database.some_table响应新的上传到S3.
示例Lambda函数可以这样编写:
import boto3
def lambda_handler(event, context):
bucket_name = 'some_bucket'
client = boto3.client('athena')
config = {
'OutputLocation': 's3://' + bucket_name + '/',
'EncryptionConfiguration': {'EncryptionOption': 'SSE_S3'}
}
# Query Execution Parameters
sql = 'MSCK REPAIR TABLE some_database.some_table'
context = {'Database': 'some_database'}
client.start_query_execution(QueryString = sql,
QueryExecutionContext = context,
ResultConfiguration = config)
Run Code Online (Sandbox Code Playgroud)
然后,当DATA/您在存储桶中的前缀下添加新数据时,您将配置触发器以执行Lambda函数.
最终,在使用作业调度程序运行Spark作业后显式重建分区具有自我记录的优势.另一方面,AWS Lambda可以方便地完成此类工作.
有多种方法可以解决问题并更新表:
称呼MSCK REPAIR TABLE。这将扫描所有数据。由于每个文件都被完整读取(至少由 AWS 全额收费),因此成本高昂。而且它的速度也慢得令人痛苦。简而言之:不要这样做!
通过调用 自行创建分区ALTER TABLE ADD PARTITION abc ...。从某种意义上说,这很好,无需扫描数据并且成本较低。而且查询速度很快,所以这里没有问题。如果您的文件结构非常混乱,没有任何通用模式(这似乎不是您的情况,因为它是组织良好的 S3 密钥模式),那么这也是一个不错的选择。这种方法也有缺点: A) 很难维护 B) 所有分区都将存储在 GLUE 目录中。当您有很多分区时,这可能会成为一个问题,因为它们需要被读出并传递到 Athena 和 EMR Hadoop 基础设施。
使用分区投影。您可能想要评估两种不同的风格。下面是在查询时为 Hadoop 创建分区的变体。这意味着没有通过网络发送 GLUE 目录条目,因此可以更快地处理大量分区。缺点是您可能会“击中”一些可能不存在的分区。这些当然会被忽略,但在内部将会生成所有可以与您的查询匹配的分区 - 无论它们是否位于 S3 上(因此请始终向您的查询添加分区过滤器!)。如果操作正确,此选项是一种“一劳永逸”的方法,因为不需要更新。
CREATE EXTERNAL TABLE `mydb`.`mytable`
(
...
)
PARTITIONED BY (
`YEAR` int,
`MONTH` int,
`DATE` int)
...
LOCATION
's3://DATA/'
TBLPROPERTIES(
"projection.enabled" = "true",
"projection.account.type" = "integer",
"projection.account.range" = "1,50",
"projection.YEAR.type" = "integer",
"projection.YEAR.range" = "2020,2025",
"projection.MONTH.type" = "integer",
"projection.MONTH.range" = "1,12",
"projection.DATE.type" = "integer",
"projection.DATE.range" = "1,31",
"storage.location.template" = "s3://DATA/YEAR=${YEAR}/MONTH=${MONTH}/DATE=${DATE}/"
);
Run Code Online (Sandbox Code Playgroud)
https://docs.aws.amazon.com/athena/latest/ug/partition-projection.html
只是列出所有选项:您也可以使用GLUE crawlers. 但这似乎不是一个有利的方法,因为它不像宣传的那么灵活。
您可以直接使用 GLUE 获得更多控制,如果您有大量自动化脚本来完成设置表的准备工作,这可能是方法#2 的Glue Data Catalog API替代方法。
简而言之:
小智 6
你应该运行ADD PARTITION:
aws athena start-query-execution --query-string "ALTER TABLE ADD PARTITION..."
Run Code Online (Sandbox Code Playgroud)
从您的S3位置添加新创建的分区Athena 利用 Hive 对数据进行分区。要创建带分区的表,您必须在CREATE TABLE语句期间定义它。使用PARTITIONED BY来定义要分区数据的密钥。
| 归档时间: |
|
| 查看次数: |
8598 次 |
| 最近记录: |