配置单元:如何移动数据库并重新创建表以最大限度地减少停机时间



配置单元数据库的接收速度非常慢。为了减少摄取时间,我将它摄取到一个临时数据库中,然后执行hdfs dfs -rmdir /path/to/original_dbhdfs dfs -mv /path/of/temp_db /path/to/original_db。现在我需要重新创建这些表。

我计划做一个DROP DATABASE temp_db CASCADE,重新创建spark创建的新表,并更改SHOW CREATE TABLE temp_db.one_table生成的命令。我需要对每个表执行此操作,并将temp_db位置替换为新的原始位置。

有更好的方法吗?也许我可以重命名数据库并为表设置一个新的位置。

这里没有答案,所以这是我的解决方案。

我上面设计的解决方案运行良好。使用它,即使是在数据更新期间开始的查询也能正常工作。纱线可以解决任何问题。

以下是我在导入新版本的/path/mydb时使用的命令。我正在使用外部配置单元表

  1. 将新数据导入mydb_landing。使用以下pyspark命令创建表:df.write.option("path", table_data_path).format("orc").mode("overwrite").saveAsTable(".".join(['mydb_landing', table_name]))
  2. 我已经有了所有的表名,所以我得到了所有的create语句:
create_stmts = [
spark.sql(
'show create table {schema}.{table_name}'.format(schema=base_dest_landing, table_name=table_name)
).first().createtab_stmt 
for table_name in tables
]
  1. 在配置单元中删除目标数据库:spark.sql('DROP DATABASE IF EXISTS {} CASCADE'.format(base_dest))
  2. 由于它只有外部表,我现在从hdfs:hdfs dfs -rm -r -f -skipTrash "/path/mydb"中删除数据
  3. mydb_landing移动到mydb。这是一个非常快速的操作,基本上是一个重命名:`hdfs-dfs-mv'/path/mydb_landing''/path/meydb``
  4. 现在我必须重新创建数据库和指向";新的";位置:CREATE DATABASE mydb LOCATION '/path/mydb'
  5. 重新创建表。这保证了我可以获得任何架构更新:
for stmt in create_stmts:
create_stmt = stmt.replace('_landing', '')
spark.sql(create_stmt)
  1. 从配置单元中删除着陆数据库:spark.sql('DROP DATABASE IF EXISTS mydb_landing CASCADE)

这篇Impala博客文章使用Hive视图有一些不错的想法。

最新更新