Hive:如何移动数据库并重新创建表以最大程度地减少停机时间?
Hive: how to move a database and recreate tables to minimize downtime?
Hive 数据库的摄取非常慢。为了减少摄取时间,我将它摄取到临时数据库,然后我执行 hdfs dfs -rmdir /path/to/original_db
和 hdfs dfs -mv /path/of/temp_db /path/to/original_db
。现在我需要重新创建 tables.
我打算做一个 DROP DATABASE temp_db CASCADE
并重新创建由 spark 创建的新 tables 并更改由 SHOW CREATE TABLE temp_db.one_table
生成的命令。我需要对每个 table 执行此操作,并将 temp_db 位置替换为新的原始位置。
有更好的方法吗?也许我可以重命名数据库并为 table 设置一个新位置。
这里没有答案,所以这是我的解决方案。
我上面设计的解决方案运行良好。使用它,即使是我在数据更新期间开始的查询也能正常工作。纱线解决任何问题。
这是我在导入新版本 /path/mydb
时使用的命令。我正在使用外部 Hive tables
- 将新数据导入
mydb_landing
。 tables 是使用此 pyspark 命令创建的:df.write.option("path", table_data_path).format("orc").mode("overwrite").saveAsTable(".".join(['mydb_landing', table_name]))
- 我已经有了所有 table 个名字,所以我得到了所有的创建语句:
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
]
- 在 Hive 中删除目标数据库:
spark.sql('DROP DATABASE IF EXISTS {} CASCADE'.format(base_dest))
- 因为它只有外部 tables,我现在从 hdfs 中删除数据:
hdfs dfs -rm -r -f -skipTrash "/path/mydb"
- 从
mydb_landing
移动到 mydb
。这是一个非常快速的操作,基本上是重命名:`hdfs dfs -mv '/path/mydb_landing' '/path/mydb``
- 现在我必须重新创建数据库和 tables 指向“新”位置:
CREATE DATABASE mydb LOCATION '/path/mydb'
- 重新创建 table。这保证我得到任何模式更新:
for stmt in create_stmts:
create_stmt = stmt.replace('_landing', '')
spark.sql(create_stmt)
- 从 Hive 中删除登录数据库:
spark.sql('DROP DATABASE IF EXISTS mydb_landing CASCADE)
这个 Impala blog post 使用 Hive 视图有一些不错的想法。
Hive 数据库的摄取非常慢。为了减少摄取时间,我将它摄取到临时数据库,然后我执行 hdfs dfs -rmdir /path/to/original_db
和 hdfs dfs -mv /path/of/temp_db /path/to/original_db
。现在我需要重新创建 tables.
我打算做一个 DROP DATABASE temp_db CASCADE
并重新创建由 spark 创建的新 tables 并更改由 SHOW CREATE TABLE temp_db.one_table
生成的命令。我需要对每个 table 执行此操作,并将 temp_db 位置替换为新的原始位置。
有更好的方法吗?也许我可以重命名数据库并为 table 设置一个新位置。
这里没有答案,所以这是我的解决方案。
我上面设计的解决方案运行良好。使用它,即使是我在数据更新期间开始的查询也能正常工作。纱线解决任何问题。
这是我在导入新版本 /path/mydb
时使用的命令。我正在使用外部 Hive tables
- 将新数据导入
mydb_landing
。 tables 是使用此 pyspark 命令创建的:df.write.option("path", table_data_path).format("orc").mode("overwrite").saveAsTable(".".join(['mydb_landing', table_name]))
- 我已经有了所有 table 个名字,所以我得到了所有的创建语句:
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
]
- 在 Hive 中删除目标数据库:
spark.sql('DROP DATABASE IF EXISTS {} CASCADE'.format(base_dest))
- 因为它只有外部 tables,我现在从 hdfs 中删除数据:
hdfs dfs -rm -r -f -skipTrash "/path/mydb"
- 从
mydb_landing
移动到mydb
。这是一个非常快速的操作,基本上是重命名:`hdfs dfs -mv '/path/mydb_landing' '/path/mydb`` - 现在我必须重新创建数据库和 tables 指向“新”位置:
CREATE DATABASE mydb LOCATION '/path/mydb'
- 重新创建 table。这保证我得到任何模式更新:
for stmt in create_stmts:
create_stmt = stmt.replace('_landing', '')
spark.sql(create_stmt)
- 从 Hive 中删除登录数据库:
spark.sql('DROP DATABASE IF EXISTS mydb_landing CASCADE)
这个 Impala blog post 使用 Hive 视图有一些不错的想法。