在AWS Glue作业中,我们可以编写一些脚本并通过作业执行脚本。
在 AWS Lambda 中,我们也可以编写相同的脚本并执行上述作业中提供的相同逻辑。
因此,我的疑问不是 AWS Glue Job 与 AWS Lambda 之间有什么区别,而是我试图了解 AWS Glue 作业何时应优先于 AWS Lambda,特别是当两者执行相同的作业时?如果两者执行相同的工作,那么理想情况下我会盲目地更喜欢使用 AWS Lambda 本身,对吧?
请尝试理解我的查询..
根据此AWS论坛主题,是否有人知道如何使用AWS Glue创建AWS Athena表,其分区包含不同的模式(在这种情况下,表模式中的列的不同子集)?
目前,当我对此数据运行爬虫并在Athena中进行查询时,我收到错误 'HIVE_PARTITION_SCHEMA_MISMATCH'
我的用例是:
如果我要手动编写模式,我可以做到这一点,因为只有一个表模式,JSON文件中缺少的键将被视为Null.
提前致谢!
以下是关于我如何设置的一些要点:
通过重新运行作业,我在redshift中获得重复的行(正如预期的那样).但是,有没有办法在插入新数据之前替换或删除行,使用密钥或胶水中的分区设置?
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.dynamicframe import DynamicFrame
from awsglue.transforms import SelectFields
from pyspark.sql.functions import lit
## @params: [TempDir, JOB_NAME]
args = getResolvedOptions(sys.argv, ['TempDir','JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
columnMapping = [
("id", "int", "id", "int"),
("name", "string", "name", "string"),
]
datasource1 = glueContext.create_dynamic_frame.from_catalog(database = "db01", table_name = …Run Code Online (Sandbox Code Playgroud) 当从 Glue 2.0 切换到 3.0 时,这意味着也从 Spark 2.4 切换到 3.1.1,我的作业在处理 1900 年之前的时间戳时开始失败,并出现以下错误:
An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob.
You may get a different result due to the upgrading of Spark 3.0: reading dates before 1582-10-15 or timestamps before 1900-01-01T00:00:00Z from Parquet INT96 files can be ambiguous,
as the files may be written by Spark 2.x or legacy versions of Hive, which uses a legacy hybrid calendar that is different from Spark 3.0+s Proleptic Gregorian calendar.
See more details in SPARK-31404. …Run Code Online (Sandbox Code Playgroud) 我有一个我在AWS Glue中创建的爬虫,它在成功完成后不会在数据目录中创建表.
爬网程序运行大约需要20秒,日志显示已成功完成.CloudWatch日志显示:
我不知道为什么没有创建数据目录中的表.AWS Docs对调试没有多大帮助.
在阅读了亚马逊文档之后,我的理解是运行/测试Glue脚本的唯一方法是将其部署到开发端点并在必要时远程调试.同时,如果(Python)代码由多个文件和包组成,则除了主脚本之外的所有代码都需要压缩.所有这些让我觉得Glue不适合任何复杂的ETL任务,因为开发和测试很麻烦.我可以在本地测试我的Spark代码,而无需每次都将代码上传到S3,并在CI服务器上验证测试,而无需支付开发Glue端点.
我有一个用 python 编写的 ETL 作业,它由具有以下目录结构的多个脚本组成;
\n\nmy_etl_job\n |\n |--services\n | |\n | |-- __init__.py\n | |-- dynamoDB_service.py\n |\n |-- __init__.py\n |-- main.py\n |-- logger.py\nRun Code Online (Sandbox Code Playgroud)\n\nmain.py是从上述目录导入其他脚本的入口点脚本。上面的代码上传到由 dev 端点创建的 ETL 集群后,在 dev-endpoint 上运行得非常好。既然现在我想在生产中运行它,我想为它创建一个合适的粘合作业。my_etl_job但是当我以format压缩整个目录时.zip,将其上传到 artifacts s3 存储桶中,并将 .zip 文件位置指定到脚本位置,如下所示
s3://<bucket_name>/etl_jobs/my_etl_job.zip\nRun Code Online (Sandbox Code Playgroud)\n\n这是我在胶水作业 UI 仪表板上看到的代码;
\n\nPK\n \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdP__init__.pyUX\xef\xbf\xbd\'\xef\xbf\xbd^"\xef\xbf\xbd^A\xef\xbf\xbd\xef\xbf\xbd)PK#7\xef\xbf\xbdP logger.pyUX\xef\xbf\xbd\xef\xbf\xbd^1\xef\xbf\xbd\xef\xbf\xbd^A\xef\xbf\xbd\xef\xbf\xbd)]\xef\xbf\xbdMk\xef\xbf\xbd0\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbda\xef\xbf\xbd&v+\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdA\xef\xbf\xbdB\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd`x\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdq\xef\xbf\xbd\xef\xbf\xbd} ...AND ALLOT MORE...\nRun Code Online (Sandbox Code Playgroud)\n\n似乎胶水作业不接受 .zip 格式?如果是,那么我应该使用什么压缩格式?
\n\n更新: \n我检查了粘合作业可以选择接受额外的文件,Referenced files path其中我提供了上述文件的所有路径的逗号分隔列表,并将 script_location 更改为仅引用main.py文件路径。但这也没有奏效。粘合作业抛出错误 no module found logger (我在 logger.py 文件中定义了这个模块)
我有这个 CSV 文件:
reference,address
V7T452F4H9,"12410 W 62TH ST, AA D"
Run Code Online (Sandbox Code Playgroud)
表定义中使用了以下选项
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'quoteChar'='\"',
'separatorChar'=',')
Run Code Online (Sandbox Code Playgroud)
但它仍然无法识别数据中的双引号,并且双引号字段中的逗号弄乱了数据。当我运行 Athena 查询时,结果如下所示
reference address
V7T452F4H9 "12410 W 62TH ST
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
最近,AWS 发布了 Amazon EMR Serverless(预览版)https://aws.amazon.com/blogs/big-data/announcing-amazon-emr-serverless-preview-run-big-data-applications-without-managing-servers/ - 非常有前途的新服务。
根据我的理解 - AWS Glue 是 Apache Spark 之上的托管服务(用于转换层)。AWS EMR 也主要用于 Apache Spark。因此,EMR Serverless(适用于 Apache Spark)看起来与 AWS Glue 非常相似。
现在我脑子里有一个问题 - 与 AWS Glue 的核心区别是什么以及何时选择 EMR Serverless 而不是 Glue?
潜在的 EMR Serverless,甚至可能成为 AWS Glue 转换层生态系统的一部分?也许 AWS 将用 EMR Serverless 取代 AWS Glue 中的转换层,这样就有意义了。AWS Glue 将扮演 ETL Overlay、Metastore 的角色,并以 EMR Serverless 作为处理层。
我正在努力建立公司的新数据湖,并试图找到最好的和最近的选择在这里工作.因此,我找到了一个非常好的解决方案来使用EMR + S3 + Athena + Glue.
我做的过程是:
1 - 运行Apache Spark脚本,在Orc存储的S3中按日期分区生成3000万行.
2 - 运行Athena查询以创建外部表.
3 - 检查与胶水数据目录相关的EMR表,它运行良好.Spark和Hive都可以访问.
4 - 在按日期分区的其他文件夹中生成另外3000万行.在Orc格式
5 - 运行识别新表的Glue Crawler.添加到数据目录,Athena能够进行查询.但Spark和Hive无法做到这一点.请参阅以下例外:
火花
Caused by: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.ql.io.orc.OrcStruct
蜂巢
Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating audit_id (state=,code=0)
我正在检查是否有任何序列化问题,我发现了这个:
输入格式 org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
输出格式为 org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
Serde序列化lib org.apache.hadoop.hive.ql.io.orc.OrcSerde
orc.compress SNAPPY
输入格式 org.apache.hadoop.mapred.TextInputFormat
输出格式 org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Serde序列化lib org.apache.hadoop.hive.ql.io.orc.OrcSerde
因此,这不适用于从Hive或Spark读取.它适用于雅典娜.我已经更改了配置,但对Hive或Spark没有任何影响.
有人遇到过这个问题?
amazon-s3 amazon-web-services amazon-emr apache-spark aws-glue
aws-glue ×10
amazon-s3 ×3
amazon-emr ×2
apache-spark ×2
pyspark ×2
python ×2
aws-lambda ×1
hadoop ×1
hive ×1
jdbc ×1
presto ×1