我对应该如何使用terraform将Athena连接到我的Glue Catalog数据库感到困惑。
我用
resource "aws_glue_catalog_database" "catalog_database" {
name = "${var.glue_db_name}"
}
resource "aws_glue_crawler" "datalake_crawler" {
database_name = "${var.glue_db_name}"
name = "${var.crawler_name}"
role = "${aws_iam_role.crawler_iam_role.name}"
description = "${var.crawler_description}"
table_prefix = "${var.table_prefix}"
schedule = "${var.schedule}"
s3_target {
path = "s3://${var.data_bucket_name[0]}"
}
s3_target {
path = "s3://${var.data_bucket_name[1]}"
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个Glue数据库,然后使用搜寻器来爬行s3存储桶(这里只有两个),但是我不知道如何将Athena查询服务链接到Glue DB。在的terraform文档中Athena
,似乎没有一种方法可以将Athena连接到Glue目录,而只能连接到S3存储桶。但是,显然,雅典娜可以与Glue集成在一起。
如何构建Athena数据库以使用我的Glue目录作为数据源而不是S3存储桶?
amazon-web-services terraform aws-glue terraform-provider-aws aws-glue-data-catalog
我阅读了 Glue 目录表,将其转换为数据帧并使用下面的内容打印模式(使用 Python 的 Spark)
dyf = glueContext.create_dynamic_frame.from_catalog(database='database_name',
table_name='table_name',
redshift_tmp_dir=args['TempDir'])
df = dyf.toDF()
df.printschema()
Run Code Online (Sandbox Code Playgroud)
当表有数据时它工作正常。
但是,如果表为空,它不会打印架构(它无法获取空表的架构)。结果,未来的连接失败。
有没有办法克服这个问题,并使动态框架从目录中获取表模式,即使对于空表或任何其他替代方案也是如此?
我使用如下所示的视觉选项卡创建了一个粘合作业。首先,我连接到一个 mysql 表作为数据源,该表已经在我的数据目录中。然后在转换节点中,我编写了一个自定义 SQL 查询以仅从源表中选择一列。通过数据预览功能进行验证,转换节点工作正常。现在我想将数据写入只有一列“字符串”数据类型的现有数据库表。粘合作业成功,但我没有看到表中的数据。
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue import DynamicFrame
def sparkSqlQuery(glueContext, query, mapping, transformation_ctx) -> DynamicFrame:
for alias, frame in mapping.items():
frame.toDF().createOrReplaceTempView(alias)
result = spark.sql(query)
return DynamicFrame.fromDF(result, glueContext, transformation_ctx)
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args["JOB_NAME"], args)
# Script generated for node MySQL …
Run Code Online (Sandbox Code Playgroud) mysql amazon-web-services amazon-aurora aws-glue aws-glue-data-catalog
我正在使用Spark将文件以ORC格式写入S3。还使用Athena查询此数据。
我正在使用以下分区键:
s3://bucket/company=1123/date=20190207
Run Code Online (Sandbox Code Playgroud)
一旦我执行了Glue搜寻器以在存储桶上运行,除分区键的类型外,其他所有东西都按预期工作。
爬网程序在目录中将它们配置为String
类型而不是int
是否有配置来定义分区键的默认类型?
我知道以后可以手动对其进行更改,并将“抓取工具”配置设置为 Add new columns only.
我有一个 S3 位置s3://bucket-name/folder-name/
,其中包含一个子文件夹,其名称是动态生成的,其中包含短语_Top10InvoiceIds
。.csv
该子文件夹由和文件组成.csv.metadata
。我正在使用胶水爬行器仅爬行 csv 文件并在 Athena 中查看它们。但我无法排除这些.csv.metadata
文件。我已经尝试了所有可能的正则表达式模式作为 glob 值。
我的一些尝试是:
*_Top10InvoiceIds/ *.metadata
*_Top10InvoiceIds/ * .* metadata
*_Top10InvoiceIds/ *. *.metadata
*_Top10InvoiceIds/ * .csv.metadata
** .metadata
* .metadata
* .csv.metadata
* /*.metadata
如果有人可以帮助我找出该模式或建议另一种方法来完成相同的任务,那就太好了。
我有一些关于 AWS Glue 的问题,希望有人能为我解答。
因此,场景是我们在 us-east-1 区域设置了一个 AWS 账户,并且使用 AWS EMR 和 Glue 作为 hive 元存储(通过 emr 配置)。在过去的一年左右的时间里,它一直运行良好,没有出现任何问题,Glue Catalog 有一堆数据库和一堆表。现在我们要做的是将整个项目迁移到另一个区域(同一帐户,不同区域,例如 us-west-1)。所以我已经把其他所有东西都移过来了,ec2 实例、sg 等。问题是我在 us-west-1 中看不到 us-east-1 粘合元存储中的表。现在回答我的问题。
1.) AWS Glue Catalogs 是否特定于区域?意思是,如果我在一个区域中用胶水创建一个数据库/表,它是否保留在该区域中,或者我可以做些什么来跨所有区域访问它?通过控制台和编程方式。
2.) 如果能够跨区域共享单个粘合元存储,那么这如何与 EMR 一起使用,我是否必须在 EMR 配置页面中指定区域属性以及其他粘合设置?
3.) 如果#2可行,跨区域访问glue目录是否需要付费(跨区域访问)
3.) 否则,如果#2 不可能,我是否必须手动从一个区域复制数据库/表并将它们导入到另一区域的粘合数据目录中?这是这样做的正确方法吗?
I\xe2\x80\x99m 尝试从我的 aws 数据目录中的数据库获取表的列表。I\xe2\x80\x99m 尝试使用 boto3。我\xe2\x80\x99m 在 aws 上的 sagemaker 笔记本中运行下面的代码。它会永远运行(比如超过 30 分钟)并且不会返回任何结果。test_db 中只有 4 个表。我的目标是运行类似的代码作为 awsglueetl 作业的一部分,我将在编辑后的 awsetl 作业脚本中运行该代码。有谁知道问题可能是什么或建议如何做到这一点?
\n\n代码:
\n\nimport boto3\nfrom pprint import pprint\n\nglue = boto3.client('glue', region_name='us-east-2')\n\nresponse = glue.get_tables(\n DatabaseName=\xe2\x80\x98test_db\xe2\x80\x99\n)\n\nprint(pprint(response['TableList']))\n
Run Code Online (Sandbox Code Playgroud)\n 我是胶水新手,我正在尝试让爬虫功能从一些日志文件中提取数据库表。问题是文件的第一行不同。我定义了一个自定义 Grok 分类器,只要删除第一行,它就可以正常工作,但是当我使用原始日志文件时,它会停止工作并使用默认的粘合分类器(这显然对我不起作用)。我尝试将 'skip.header.line.count'=1 添加到表属性(并将爬网程序设置为不更新架构),但这也不起作用。有没有办法在 grok 模式中写“跳过第一行”?
amazon-web-services logstash-grok aws-glue aws-glue-data-catalog
我不断接收和存储未压缩JSON 对象的多个源,按天分区到 Amazon S3 存储桶的不同位置(配置单元样式:)s3://bucket/object=<object>/year=<year>/month=<month>/day=<day>/object_001.json
,并计划使用 AWS 增量批处理这些数据并将其加载到 Parquet 数据湖胶水:
这种设计模式和架构似乎是一种相当安全的方法,因为它得到了许多 AWS博客的支持。
我有一个爬虫配置如下:
{
"Name": "my-json-crawler",
"Targets": {
"CatalogTargets": [
{
"DatabaseName": "my-json-db",
"Tables": [
"some-partitionned-json-in-s3-1",
"some-partitionned-json-in-s3-2",
...
]
}
]
},
"SchemaChangePolicy": {
"UpdateBehavior": "UPDATE_IN_DATABASE",
"DeleteBehavior": "LOG"
},
"Configuration": "{\"Version\":1.0,\"Grouping\":{\"TableGroupingPolicy\":\"CombineCompatibleSchemas\"}}"
}
Run Code Online (Sandbox Code Playgroud)
每个表都是“手动”初始化的,如下所示:
{
"Name": "some-partitionned-json-in-s3-1",
"DatabaseName": "my-json-db",
"StorageDescriptor": {
"Columns": [] # i'd like the crawler to figure this out …
Run Code Online (Sandbox Code Playgroud) 我正在 EKS 上运行 Spark 作业,这些作业是从 Jupyter 笔记本提交的。
我们将所有表都放在 S3 存储桶中,它们的元数据位于 Glue 数据目录中。
我想使用 Glue 数据目录作为这些 Spark 作业的 Hive 元存储。我发现当 Spark 在 EMR 中运行时可以这样做:https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html
但是 Spark 可以在 EKS 上运行吗?
我已经看到 aws 发布的代码: https: //github.com/awslabs/aws-glue-data-catalog-client-for-apache-hive-metastore 但我不明白是否需要修补 Hive jar为了我想做的事。另外,我需要 hive-site.xml 文件来将 Spark 连接到元存储,如何从 Glue 数据目录获取此文件?
amazon-web-services apache-spark aws-glue aws-glue-data-catalog
aws-glue ×10
amazon-s3 ×2
apache-spark ×1
aws-sdk ×1
boto3 ×1
mysql ×1
pyspark ×1
python-3.x ×1
terraform ×1