hadoop 配置单元:如何移动数据库并重新创建表以最小化停机时间?

q3qa4bjr  于 2022-11-01  发布在  Hadoop
关注(0)|答案(1)|浏览(245)

Hive数据库的接收速度非常慢。为了减少接收时间,我将其接收到临时数据库,然后执行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位置。
有没有更好的方法来做?也许我可以只重命名DB并为表设置一个新位置。

2ic8powd

2ic8powd1#

这里没有答案,所以这是我的解决方案。
我在上面设计的解决方案运行良好。使用它,甚至我在数据更新期间启动的查询也运行良好。Yarn可以处理任何问题。
下面是我在导入新版本的/path/mydb时使用的命令。
1.将新数据导入到mydb_landing。使用以下pyspark命令创建表:df.write.option("path", table_data_path).format("orc").mode("overwrite").saveAsTable(".".join(['mydb_landing', table_name]))
1.我已经有了所有的表名,所以我得到了所有的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))
1.因为它只有外部表,我现在从hdfs中删除数据:hdfs dfs -rm -r -f -skipTrash "/path/mydb"
1.从mydb_landing移动到mydb。这是一个非常快速的操作,基本上是一个重命名:“/路径/我的数据库登陆”“/路径/我的数据库登陆”“
1.现在,我必须重新创建指向“新”位置的数据库和表:CREATE DATABASE mydb LOCATION '/path/mydb'
1.重新创建表。这保证了我可以获得任何架构更新:

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 blog post有一些使用配置单元视图的好主意。

相关问题