当前位置: 首页 > 知识库问答 >
问题:

AWS Glue Crawler更新现有目录表的速度(非常慢)

益兴生
2023-03-14

我不断地接收并存储多个未压缩JSON对象的提要,这些提要每天都被分区到Amazon S3 bucket(配置单元样式:S3://bucket/object)的不同位置=

  • 爬虫将更新手动创建的粘合表,每个对象提要一个,用于模式和分区(新文件)更新
  • 然后,Glue ETL作业作业书签将根据对象馈送将所有新分区批处理并映射到拼花地板位置

此设计模式

我有一个爬虫配置为:

{
  "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\"}}"
}

每个表都是“手动”初始化的,如下所示:

{
  "Name": "some-partitionned-json-in-s3-1",
  "DatabaseName": "my-json-db",
  "StorageDescriptor": {
    "Columns": [] # i'd like the crawler to figure this out on his first crawl,
    "Location": "s3://bucket/object=some-partitionned-json-in-s3-1/",
    "PartitionKeys": [
      {
        "Name": "year",
        "Type": "string"
      },
      {
        "Name": "month",
        "Type": "string"
      },
      {
        "Name": "day",
        "Type": "string"
      }
    ],
    "TableType": "EXTERNAL_TABLE"
  }
}

正如预期的那样,爬虫的第一次运行大约一个小时,但它成功地找出了表模式和现有分区。然而,从那时起,重新运行爬虫所需的时间与第一次抓取完全相同,如果不是更长的话;这让我相信爬虫不仅在抓取新文件/分区,而且每次都在重新抓取所有整个S3位置。

请注意,两次爬网之间的新文件增量非常小(每次预期的新文件很少)。

AWS文档建议运行多个爬虫程序,但从长远来看,我不相信这会解决我的问题。我还考虑在每次运行后更新爬虫排除模式,但是我认为使用爬虫比通过Lambda boto3魔术手动更新表分区的优势太少了。

我错过什么了吗?对于爬虫程序更新现有数据目录而不是直接对数据存储进行爬网,我可能会误解一个选项?

有什么改进我的数据编目的建议吗?考虑到在Glue表中索引这些JSON文件对我来说只是必要的,因为我希望我的Glue作业使用书签。

谢谢


共有1个答案

呼延珂
2023-03-14

在我的这个未回答的问题上仍然有一些点击率,所以我想分享一个我当时认为足够的解决方案:我最终没有使用爬虫,根本没有增量更新我的Glue表。

通过CloudTrail/S3 Eventbridge通知(选择一个)使用S3事件/S3 Api调用,最终编写了一个lambda,在Athena上弹出一个ALTER TABLE ADD PARTITION DDL查询,根据S3键前缀用新创建的分区更新现有的粘合表。在我看来,这是一种非常直接和低代码的方法来维护粘合表;唯一的缺点是处理服务节流(Lambda和Athena),以及查询失败,以避免过程中的任何数据丢失。

不过,此解决方案可以很好地扩展,因为每个帐户的并行DDL查询是一个软限制配额,可以随着您更新越来越多表的需求增加而增加;并且非常适合非时间关键型工作流。

如果通过批处理数据(例如使用Kinesis DeliveryStream),将S3写入到Glue tables S3分区(在这个特定的实现中,每个Glue table分区一个文件是理想的),效果会更好。

 类似资料:
  • 问题内容: 我正在尝试通过使用JAP和HIBERNATE向SQL Server 2008 R2插入一些数据。一切都“正常”,除了它非常慢。要插入20000行,大约需要45秒,而C#脚本大约需要不到1秒。 这个领域的任何资深人士都可以提供帮助吗?我会很感激。 更新:从下面的答案中得到了一些很好的建议,但仍然无法按预期工作。速度是一样的。 这是更新的persistence.xml: 这是更新的代码部分

  • 问题内容: 我正在尝试通过使用JAP和HIBERNATE向SQL Server 2008 R2插入一些数据。一切都“正常”,除了它非常慢。要插入20000行,大约需要45秒,而C#脚本大约需要不到1秒。 这个领域的任何资深人士都可以提供帮助吗?我会很感激。 更新:从下面的答案中得到了一些很好的建议,但仍然无法按预期工作。速度是一样的。 这是更新的persistence.xml: 这是更新的代码部分

  • 问题内容: 我正在查询有关的信息。 我正在迭代一个数组,并查询列表中的每个值。 不幸的是 ,在调试器下, 单个查询大约需要3-4秒,而 在禁用调试器的情况下, 查询时间要 短一些。 任何想法为什么这么慢?我使用进行测试。 这是我的代码: 更新资料 当我离开时,评估很快就完成了,但是我没有得到。它返回一个空字符串… 问题答案: 感谢@nvrmnd我尝试了一下,发现了一种更好的解析器: VTD-XML

  • 问题内容: 我面临一个非常奇怪的问题:使用Redis时,我的写入速度非常糟糕(在理想情况下,写入速度应该接近RAM上的写入速度)。 这是我的基准: 是生成随机字符串的类(arg是字符串长度) 以下是几个结果: [写入] nb:100000 |时间:4.408319378 |速度:0.713905907055318 MB / s [写入] nb:100000 |时间:4.4139469070553

  • 问题内容: 也许我弄错了,但是我虽然JPA能够更新现有表(更改了添加列的模型),但在我的情况下却无法正常工作。 我可以在日志中看到eclipselink尝试创建它,但是由于它已经存在而失败。它不会尝试更新以添加该列,而是继续进行。 这是带有更改的表(添加了在线列) 此后,继续进行以下操作。 我是在做错什么还是错误? 问题答案: 从EclipseLink 2.4开始,您可以在持久性单元的规范中使用它

  • 问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。