我有 pyspark 脚本,可以在 AWS GLUE 中运行。但每次我从 UI 创建作业并将代码复制到作业时,我是否可以自动从 s3 存储桶中的文件创建作业。(我拥有运行时将使用的所有库和粘合上下文)
amazon-ec2 amazon-web-services pyspark aws-glue aws-glue-data-catalog
任何人都知道如何(Athena w Glue)返回我知道其表名的表的完整 s3:// 地址。就像是:
SELECT location FOR TABLE xyz;
Run Code Online (Sandbox Code Playgroud)
看起来很简单,但我找不到
我想运行粘合作业来对从 s3 到 Postgres DB 的许多 csv 文件执行 ETL 过程。每天都有新文件写入 s3 源存储桶。当我为这些文件运行爬网程序以生成具有架构的表时,我得到的不仅仅是胶水数据目录中的一张表,这意味着爬网程序无法将这些文件的架构识别为相同的。可能是因为有很多文件只有标题而没有内容。
因此,当我使用向导创建粘合作业时,当被询问要使用哪个表时,我仅从粘合数据目录(基于最大的 csv 文件创建)中选择一个表。因此,在数据库中,我仅拥有来自最大文件的数据,而不是来自所有 csv 文件的数据。我想这是因为爬虫在glue数据目录中创建这些表时,还保存了与该表相对应的文件列表,我在s3上找到了这些文件:/aws-glue-temporary-000xxxxx-us-east-2 /admin/partitionlisting/script_name/xxxxx/ 对于每个粘合作业,都有datasource0.input-files.json文件,其内容如下{"path":"s3://bucket1/customer/dt=2020-02-03/","files":["s3://bucket1/customer/dt=2020-02-03/file1.csv"]}]
当我检查当我尝试在胶水数据目录中手动创建架构表并将其分配给胶水作业脚本时,希望处理 s3 路径中的所有文件,它不会读取任何文件,并且在日志中我看到
- Skipping Partition {}
as no new files detected @ s3://bucket1/customer/ / or path does not exist
Run Code Online (Sandbox Code Playgroud)
当我检查相应的 datasource0.input-files.json 时,它没有任何文件:[{"path":"s3://bucket1/customer/","files":[]}]
我究竟做错了什么?如何使用手动创建的模式表使粘合作业脚本读取所选 s3 路径中的所有文件?或者是否可以仅使用包含所有文件的许多自动创建的模式表之一(而不仅仅是基于一个模式)?
我在 S3 中有数据,该数据按YYYY/MM/DD/HH/
结构分区(不是year=YYYY/month=MM/day=DD/hour=HH
)
我为此设置了一个 Glue 爬虫,它在 Athena 中创建了一张表,但是当我在 Athena 中查询数据时,它会给出一个错误,因为一个字段具有重复的名称( 和 ,URL
SerDeurl
将其转换为小写,导致名称冲突)。
为了解决这个问题,我手动创建另一个表(使用上面的表定义 SHOW CREATE TABLE),添加'case.insensitive'= FALSE
到 SERDEPROPERTIES
WITH SERDEPROPERTIES ('paths'='deviceType,emailId,inactiveDuration,pageData,platform,timeStamp,totalTime,userId','case.insensitive'= FALSE)
Run Code Online (Sandbox Code Playgroud)
我将 s3 目录结构更改为与 hive 兼容的命名year=/month=/day=/hour=
,然后使用 创建表'case.insensitive'= FALSE
,然后运行MSCK REPAIR TABLE
新表的命令,该命令会加载所有分区。
(完成创建表查询)
但查询时,我只能找到 1 个数据列 ( platform
) 和分区列,其余所有列均未解析。但我实际上已经复制了 Glue 生成的 CREATE TABLE 查询以及条件case_insensitive=false
。
我怎样才能解决这个问题?
由于我们的方案是不变的,因此我们使用spark.read(),这比当数据存储在 s3 中时从选项创建动态框架要快得多
所以现在想使用动态框架从glue目录中读取数据需要花费很多时间所以想使用spark read api Dataframe.read.format("").option("url","").option("dtable", schema.表名).load()
在格式和网址选项中输入什么以及需要其他什么?
amazon-web-services apache-spark aws-glue aws-glue-data-catalog aws-glue-spark
我将 AWS 与(基本支持计划)一起使用。我想知道 AWS 粘合作业中使用了哪个版本的 Spark 和 Hadoop (HDFS)。这样我就可以在本地机器上设置相同的环境进行开发。
或者,如果我了解 Spark 的版本,则对应 AWS 粘合作业使用的 Hadoop 版本,反之亦然。
因为我正在使用基本支持计划。所以,我不能向支持中心提出案例。知道在哪里可以检查 AWS 胶水作业... Spark 和 Hadoop 版本吗?
任何形式的帮助和建议表示赞赏。谢谢!
hadoop amazon-web-services apache-spark aws-glue aws-glue-data-catalog
我有一个 Athena 表,每天都有一个分区,其中实际文件按小时位于“子目录”中,如下所示:
s3://my-bucket/data/2019/06/27/00/00001.json
s3://my-bucket/data/2019/06/27/00/00002.json
s3://my-bucket/data/2019/06/27/01/00001.json
s3://my-bucket/data/2019/06/27/01/00002.json
Run Code Online (Sandbox Code Playgroud)
Athena 能够毫无问题地查询此表并找到我的数据,但在使用 AWS Glue 时,它似乎无法找到此数据。
ALTER TABLE mytable ADD
PARTITION (year=2019, month=06, day=27) LOCATION 's3://my-bucket/data/2019/06/27/01';
select day, count(*)
from mytable
group by day;
day . count
27 . 145431
Run Code Online (Sandbox Code Playgroud)
我已经尝试将分区的位置更改为以斜杠 ( s3://my-bucket/data/2019/06/27/01/
)结尾,但这没有帮助。
以下是 Glue 中的分区属性。我希望 storedAsSubDirectories 设置会告诉它迭代子目录,但情况似乎并非如此:
{
"StorageDescriptor": {
"cols": {
"FieldSchema": [
{
"name": "userid",
"type": "string",
"comment": ""
},
{
"name": "labels",
"type": "array<string>",
"comment": ""
}
]
},
"location": "s3://my-bucket/data/2019/06/27/01/",
"inputFormat": "org.apache.hadoop.mapred.TextInputFormat",
"outputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
"compressed": "false",
"numBuckets": "0", …
Run Code Online (Sandbox Code Playgroud) 我在 AWS Glue 中设置了到 RDS 数据库的 JDBC 连接。当我从 AWS 控制台测试连接时,出现错误:找不到子网 ID xxxx 的 S3 端点或 NAT 网关。为什么 AWS Glue 连接到 RDS 需要 S3 VPC 端点?
RDS实例有一个对所有IP地址完全开放的安全组。
我一直在使用 AWS Glue 工作流程来编排批处理作业。我们需要传递下推谓词以限制批处理作业的处理。当我们单独运行 Glue 作业时,我们可以在运行时将下推谓词作为命令行参数传递(即 awsgluestart-job-run --job-name foo.scala --arguments --arg1-text ${arg1} ..)。但是当我们使用glue工作流程来执行Glue作业时,就有点不清楚了。
当我们使用 AWS Glue 工作流程编排 Batch 作业时,我们可以在创建工作流程时添加运行属性。
我试过:
awsgluestart-workflow-run --name 工作流程名称 | jq -r '.RunId'
awsglue put-workflow-run-properties --name 工作流名称 --run-id "ID" --run-properties --pushdownpredicate="some value"
我可以使用 put-workflow-run-property 查看已传递的运行属性
awsglue put-workflow-run-properties --name 工作流程名称 --run-id "ID"
但我无法在我的胶水作业中检测到“pushdownpredicate”。知道如何在胶水作业中访问工作流的运行属性吗?
我有一个 Glue ETL 作业,它从目录中读取数据并写入 s3。完成此操作后,需要触发爬虫来更新 Athena 中的数据。
因此,我使用glue_client.start_crawler(Name='crawler_name')方法来启动爬虫。但是每当我尝试从 ETL Glue 作业启动爬虫时,它都会失败并出现以下错误
ConnectTimeoutError: Connect timeout on endpoint URL: "https://glue.eu-central-1.amazonaws.com/"
Run Code Online (Sandbox Code Playgroud) aws-glue ×9
apache-spark ×2
amazon-ec2 ×1
amazon-s3 ×1
aws-cli ×1
hadoop ×1
hive ×1
pyspark ×1