【问题标题】:How can I load data into HIVE table avoiding lock problem while some queries are running on the same table当某些查询在同一个表上运行时,如何将数据加载到 HIVE 表中以避免锁定问题
【发布时间】:2023-03-24 04:39:01
【问题描述】:

我是 HIVE 的新手。现在我有一个 .csv 文件,其中包含要附加到 HIVE 数据库中的表的数据。但是当我运行命令:load data inpath /path/to/file into table T1 并等待很长时间时,抛出异常:“获取锁时出错:无法获取底层对象的锁。一段时间后重试”。这些 SQL 查询都需要很长的时间(可能 1~2 小时)才能返回结果。

我通过show locks T1 extended检查了这个表T1中的锁,我发现一些查询在同一个表上运行:

T1: SHARED
LOCK_QUERYID:hive_20211203..... (omitted)
LOCK_TIME:1638512103766
LOCK_MODE:IMPLICIT
LOCK_QUERYSTRING: ... (a SQL query involved in table T1)

... (other queries like above)

我查看了HIVE的配置:

SELECT VERSION()    ->    2.1.1-cdh6.2.1 r0a45... (omitted)
SET hive.lock.numretries    ->    100
SET hive.unlock.numretries    ->    10
SET hive.lock.sleep.between.retries     ->    60s
SET hive.txn.manager     ->    org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager
SET hive.support.concurrency     ->    true

该表是内部表 (MANAGED_TABLE),而不是分区表。

我的问题是,当查询在同一个表上运行时,如何成功地将数据加载到表中。

【问题讨论】:

    标签: hive


    【解决方案1】:

    如果表不处于事务模式,您可以使用hdfs dfs -put 命令将文件放入表位置:

    hdfs dfs -put localfilepath/* /your/table/location/
    

    它可能会影响正在运行的查询,因此请自行承担风险。

    【讨论】:

    • 感谢您的回答。为了保持HIVE数据库的稳定性,我认为直接改变表和事务管理器的事务模式是不安全/不恰当的。为了减少向表追加数据时出现锁定问题的可能性,我可以调高 hive.lock.numretries 和 hive.lock.sleep.between.retries 吗?这些变化背后有什么风险吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2015-12-05
    • 2012-03-30
    • 2018-11-18
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多