Hive Transactions
在升级到Hive 3之前,需要把在事务表上Major Compaction。主要是为了合并掉增量文件。更准确地说,自上次Major Compaction以来在其上执行过任何更新/删除/合并语句的任何分区都必须进行另一次Major Compaction。在 Hive 升级到 Hive 3 之前,此分区上不会再发生更新/删除/合并。
What is ACID and why should you use it?
ACID 代表数据库事务的四个特征
- 原子性(操作要么完全成功,要么失败,不会留下部分数据)、
- 一致性(应用程序执行操作后,该操作的结果在每个后续操作中都可见)、
- 隔离性(一个用户不完整的操作不会对其他用户造成意外的副作用),
- 持久性(一旦操作完成,它将 即使面对机器或系统故障也能保留)。
直到 Hive 0.13,原子性、一致性和持久性都是在分区级别提供的。 可以通过打开可用的锁定机制之一(ZooKeeper 或在内存中)来提供隔离。 通过在 Hive 0.13 中添加事务,现在可以在行级别提供完整的 ACID 语义,以便一个应用程序可以添加行 而另一个则从同一个分区读取数据而不会互相干扰。
具有 ACID 语义的事务已添加到 Hive 中以解决以下场景:
- 读写流式数据。 许多用户拥有 Apache Flume、Apache Storm 或 Apache Kafka,他们用来将数据流式传输到 Hadoop 集群中。 虽然这些工具可以以每秒数百行或更多行的速度写入数据,但 Hive 只能每十五分钟到一小时添加一次分区。 更频繁地添加分区很快会导致表中出现大量分区。 这些工具可以将数据流式传输到现有分区中,但这会导致读取器脏读(也就是说,他们会看到在开始查询后写入的数据),并在目录中留下许多小文件,这会给 NameNode 带来压力。 有了这个新功能,将支持同时允许读者获得一致的数据视图并避免太多文件。
- 数据变化缓慢。 在典型的星型数据仓库中,维度表随着时间的推移而缓慢变化。 例如,零售商将开设新商店,需要将其添加到商店表中,或者现有商店可能会更改其面积或其他一些跟踪特征。 这些更改会导致插入单个记录或更新记录(取决于所选的策略)。 从 0.14 开始,Hive 能够支持这一点。
- 数据更新。 有时发现收集的数据不正确并需要更正。 或者,数据的第一个实例可能是近似值(90% 的服务器报告),稍后提供完整数据。 或者,业务规则可能要求由于后续交易而重述某些交易(例如,在购买后,客户可以购买会员资格,从而有权享受折扣价格,包括先前购买的折扣价格)。 或者,根据合同,用户可能需要在关系终止时删除其客户的数据。 从 Hive 0.14 开始,这些场景可以通过 INSERT、UPDATE,和 DELETE 操作。
- 使用 SQL MERGE 语句进行批量更新。
Limitations 局限性
- 不支持手动事务。尚不支持 BEGIN、COMMIT 和 ROLLBACK。 所有语言操作都是自动提交的。
- 只支持文件格式ORC。第一个版本仅支持 ORC 文件格式。 该功能的构建使得任何存储格式都可以使用事务,这些存储格式可以确定如何将更新或删除应用于基本记录(基本上,具有显式或隐式行 ID),但到目前为止,集成工作仅针对 兽人。
- 默认情况下,事务配置为关闭。 请参阅下面的配置部分,了解需要设置哪些值来配置它。
- 表必须被bucketed才能使用这些功能。 同一系统中不使用事务和ACID的表不需要分桶。 外部表无法成为 ACID 表,因为外部表上的更改超出了压缩器的控制范围 (HIVE-13175)。
- 不允许从非 ACID 会话读取/写入 ACID 表。 换句话说,Hive 事务管理器必须设置为
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
才能使用 ACID 表。 - 目前仅支持快照级别隔离。 当给定查询启动时,将为其提供一致的数据快照。 不支持脏读、已提交读、可重复读或可序列化。 引入 BEGIN 的目的是在事务期间支持快照隔离,而不仅仅是单个查询。 可以根据用户请求添加其他隔离级别。
- 现有的 ZooKeeper 和内存锁管理器与事务不兼容。 无意解决这个问题。 请参阅下面的基本设计,了解如何为事务存储锁的讨论。
- ACID 表不支持使用 ALTER TABLE 进行架构更改。 HIVE-11421 正在跟踪它。 已在 1.3.0/2.0.0 中修复。
- 使用 Oracle 作为 Metastore DB 和“datanucleus.connectionPoolingType=BONECP”可能会生成间歇性的“无此类锁…”和“无此类事务…”错误。 在这种情况下,建议设置“datanucleus.connectionPoolingType=DBCP”。
- 事务表不支持 LOAD DATA… 语句。 (直到 HIVE-16732 才正确执行此操作)
Streaming APIs
Hive提供了流式数据采集和流式数据修改的API:
- Hive HCatalog Streaming API
- Hive Streaming API (Since Hive 3)
- HCatalog Streaming Mutation API (available in Hive 2.0.0 and later)
这两个api的比较可以在StreamingMutation文档的Background部分找到。
语法的变化
从Hive 0.14版本开始支持INSERT…VALUES, UPDATE, and DELETE 语法。详情请参阅LanguageManual DML。
为了支持ACID和事务,Hive的DDL中添加了几个新命令,另外还修改了一些现有的DDL。
新增命令SHOW TRANSACTIONS,详见SHOW TRANSACTIONS。
新增命令SHOW COMPACTIONS,详见SHOW COMPACTIONS。
SHOW LOCKS命令已被修改,以提供与事务相关的新锁的信息。如果你使用的是ZooKeeper或内存锁管理器,你会发现这个命令的输出没有什么不同。详情请参见Show Locks。
ALTER TABLE中增加了一个新选项来请求压缩表或分区。一般来说,用户不需要请求压缩,因为系统将检测到对它们的需求并启动压缩。但是,如果一个表的压缩被关闭,或者用户想在系统不愿意选择的时候压缩表,可以使用ALTER table 来启动压缩。参见Alter Table/PartitionCompact了解详细信息。这将为压缩和返回请求排队。要查看压缩的进度,用户可以使用 SHOW COMPACTIONS。
增加了一个新的命令ABORT TRANSACTIONS,详情请参见ABORT TRANSACTIONS。
Basic Design
HDFS 不支持对文内容件进行更改。 面对写入器写入到用户正在读取的文件时,它也不提供读取一致性。为了在 HDFS 之上提供这些功能,我们遵循其他数据仓库工具中使用的标准方法。 表或分区的数据存储在一组基本文件中。 新记录、更新和删除都存储在增量文件中。 为每个更改表或分区的事务(或者在 Flume 或 Storm 等流代理的情况下,为每批事务)创建一组新的增量文件。 在读取时,读取器合并基本文件和增量文件,在读取时应用任何更新和删除。
Base and Delta Directories
以前,分区(或表,如果表未分区)的所有文件都位于单个目录中。 通过这些更改,使用 ACID 感知写入器写入的任何分区(或表)都将具有用于基本文件的目录和用于每组增量文件的目录。 对于未分区的表“t”,这可能是这样的:
Filesystem Layout for Table “t”
hive> dfs -ls-R /user/hive/warehouse/t;
drwxr-xr-x - ekoifman staff 02016-06-09 17:03 /user/hive/warehouse/t/base_0000022
-rw-r--r-- 1 ekoifman staff 6022016-06-09 17:03 /user/hive/warehouse/t/base_0000022/bucket_00000
drwxr-xr-x - ekoifman staff 02016-06-09 17:06 /user/hive/warehouse/t/delta_0000023_0000023_0000
-rw-r--r-- 1 ekoifman staff 6112016-06-09 17:06 /user/hive/warehouse/t/delta_0000023_0000023_0000/bucket_00000
drwxr-xr-x - ekoifman staff 02016-06-09 17:07 /user/hive/warehouse/t/delta_0000024_0000024_0000
-rw-r--r-- 1 ekoifman staff 6102016-06-09 17:07 /user/hive/warehouse/t/delta_0000024_0000024_0000/bucket_00000
Compactor
Compactor 是一组在 Metastore 内运行的后台进程,用于支持 ACID 系统。 它由
Initiator
、
Worker
、
Cleaner
、
AcidHouseKeeperService
和其他一些组件组成。
Delta File Compaction
随着操作修改表,会创建越来越多的增量文件,需要对其进行压缩以保持足够的性能。 压缩分为三种类型:minor、major 和rebalance。
- minor 采用一组现有的增量文件,并将它们重写为每个存储桶的单个增量文件。(将所有的增量文件合并压缩成每个存储桶一个增量文件)
- major 采用一个或多个增量文件和存储桶的基本文件,并将它们重写为每个存储桶的新基本文件。 主要压实成本更高,但更有效。(将基础文件和增量文件合并成新的基础文件)
- 有关重新平衡压缩的更多信息可以在这里找到:重新平衡压缩
所有压缩都是在后台完成的。minor 和major 不会阻止数据的并发读取和写入。 重新平衡压缩使用排它写锁,因此它可以防止并发写入。 压缩后,系统会等待旧文件的所有读取器完成,然后删除旧文件。
Initiator
该模块负责发现哪些表或分区需要压缩。 应使用 hive.compactor.initiator.on 在 Metastore 中启用此功能。 下面的“事务的新配置参数”表中有几个 *.threshold 形式的属性,用于控制何时创建压缩任务以及执行哪种类型的压缩。 每个压缩任务处理 1 个分区(如果表未分区,则处理整个表)。 如果给定分区的连续压缩失败次数超过
hive.compactor.initiator.failed.compacts.threshold
,则该分区的自动压缩调度将停止。 有关详细信息,请参阅配置参数表。
Worker
每个 Worker 处理一个压缩任务。 压缩是一个 MapReduce 作业,其名称采用以下形式:
<主机名>-compactor-<db>.<table>.<partition>
。 每个worker将作业提交到集群(通过 hive.compactor.job.queue 如果已定义)并等待作业完成。 hive.compactor.worker.threads 确定每个 Metastore 中的 Worker 数量。 Hive仓库中的Worker总数决定了并发compaction的最大数量。
Cleaner
清理不需要的增量文件的模块。
AcidHouseKeeperService
此过程查找在 hive.txn.timeout 时间内未检测到的事务并中止它们 。 系统假设发起事务的客户端停止心跳崩溃并且其锁定的资源应该被释放。
SHOW COMPACTIONS
此命令显示有关当前运行的压缩和最近的压缩历史记录(可配置的保留期)的信息。 此历史记录显示自 HIVE-12353 起可用。
另请参阅 LanguageManual DDL#ShowCompactions 了解有关此命令输出的更多信息和 NewConfigurationParametersforTransactions/Compaction History 了解影响此命令输出的配置属性。 系统保留每种类型的最后 N 个条目:failed、succeeded、attempted (其中 N 可以为每种类型配置)。
Transaction/Lock Manager
添加了一个名为“事务管理器”的新逻辑实体,它合并了之前的“数据库/表/分区锁管理器”概念(hive.lock.manager,默认为 org.apache.hadoop.hive.ql.lockmgr.zookeeper.ZooKeeperHiveLockManager) 。 事务管理器现在还负责管理事务锁。 默认的 DummyTxnManager 模拟旧 Hive 版本的行为:没有事务并使用 hive.lock.manager 属性为表、分区和数据库创建锁管理器。 新添加的 DbTxnManager 使用 DbLockManager 管理 Hive 元存储中的所有锁/事务(事务和锁在服务器故障时是持久的)。 这意味着启用事务后,ZooKeeper 中以前的锁定行为将不再存在。 为了避免客户端死亡并导致事务或锁悬空,锁持有者和事务发起者会定期向元存储发送心跳。 如果在配置的时间内未收到心跳,锁定或事务将被中止。
从 Hive 1.3.0 开始,DbLockManger 继续尝试获取锁的时间长度可以通过 hive.locknumretires和hive.lock.sleep.Between.retries控制 .。 当DbLockManager无法获取锁时(由于存在竞争锁),它将后退并在一段时间后重试。 为了支持短时间运行的查询并且同时不会压垮元存储,DbLockManager 将在每次重试后将等待时间加倍。 初始回退时间为 100 毫秒,并受 hive.lock.sleep. Between.retries 限制。 hive.lock.numretries 是重试给定锁定请求的总次数。 因此,获取锁的调用将阻塞的总时间(给定 100 次重试和 60 秒睡眠时间的值)为 (100ms + 200ms + 400ms + … + 51200ms + 60s + 60s + … + 60s) = 91m: 42秒:300毫秒。
有关此锁管理器使用的锁的更多详细信息。
请注意,DbTxnManager 使用的锁管理器将获取所有表上的锁,甚至是那些没有“transactional=true”属性的表。 默认情况下,对非事务表的插入操作将获取排他锁,从而阻止其他插入和读取。 虽然技术上是正确的,但这与 Hive 传统的工作方式(即没有锁管理器)不同。 为了向后兼容,提供了 [hive.txn.strict.locking.mode](http://configuration properties/#hive.txn.strict.locking.mode) (见下表),这将使该锁管理器获取共享锁 非事务表上的插入操作。 这会恢复以前的语义,同时仍然提供锁管理器的好处,例如防止表在读取时被删除。 请注意,对于事务表,insert 始终会获取共享锁,因为这些表在存储层实现了 MVCC 架构,即使存在并发修改操作也能够提供强读一致性(快照隔离)。
Configuration
必须正确设置这些配置参数才能在 Hive 中打开事务支持:
Client Side
- hive.support.concurrency – true
- hive.enforce.bucketing – true (Not required as of Hive 2.0)
- hive.exec.dynamic.partition.mode – nonstrict
- hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
Server Side (Metastore)
- hive.compactor.initiator.on – true (See table below for more details)
- hive.compactor.cleaner.on – true (See table below for more details)
- hive.compactor.worker.threads – a positive number on at least one instance of the Thrift metastore service
以下部分列出了影响 Hive 事务和压缩的所有配置参数。 另请参阅上面的限制 和表属性如下。
New Configuration Parameters for Transactions
系统中添加了许多新的配置参数以支持事务。
Configuration keyValuesLocation****Noteshive.txn.managerDefault: org.apache.hadoop.hive.ql.lockmgr.DummyTxnManagerValue required for transactions: org.apache.hadoop.hive.ql.lockmgr.DbTxnManagerClient/ HiveServer2DummyTxnManager replicates pre Hive-0.13 behavior and provides no transactions.DummyTxnManager 复制 Hive-0.13 之前的行为并且不提供事务。hive.txn.strict.locking.modeDefault: trueClient/ HiveServer2In strict mode non-ACID resources use standard R/W lock semantics, e.g. INSERT will acquire exclusive lock. In non-strict mode, for non-ACID resources, INSERT will only acquire shared lock, which allows two concurrent writes to the same partition but still lets lock manager prevent DROP TABLE etc. when the table is being written to (as of Hive 2.2.0).在严格模式下,非 ACID 资源使用标准 R/W 锁语义,例如 INSERT 将获取独占锁。 在非严格模式下,对于非 ACID 资源,INSERT 将仅获取共享锁,这允许对同一分区进行两个并发写入,但仍然允许锁管理器在写入表时阻止 DROP TABLE 等操作(从 Hive 2.2.0)。hive.txn.timeoutDefault: 300Client/ HiveServer2/Metastore如果客户端未发送心跳,则声明事务中止的时间(以秒为单位)。 至关重要的是,该属性对于所有组件/服务都具有相同的值。
5
^5
5hive.txn.heartbeat.threadpool.size*Default:* 5Client/HiveServer2The number of threads to use for heartbeating (as of Hive 1.3.0 and 2.0.0).用于检测信号的线程数(从 Hive 1.3.0 和 2.0.0 开始)。hive.timedout.txn.reaper.start*Default:* 100sMetastoreTime delay of first reaper (the process which aborts timed-out transactions) run after the metastore starts (as of Hive 1.3.0). Controls AcidHouseKeeperServcie above.第一个收割机(中止超时事务的进程)的时间延迟在 Metastore 启动后运行(从 Hive 1.3.0 开始)。 控制上面的 AcidHouseKeeperServcie。hive.timedout.txn.reaper.interval*Default:* 180sMetastoreTime interval describing how often the reaper (the process which aborts timed-out transactions) runs (as of Hive 1.3.0). Controls AcidHouseKeeperServcie above.描述收割机(中止超时事务的进程)运行频率的时间间隔(从 Hive 1.3.0 开始)。 控制上面的 AcidHouseKeeperServcie。hive.txn.max.open.batch*Default:* 1000ClientMaximum number of transactions that can be fetched in one call to open_txns().1一次调用 open_txns().
1
^1
1可以获取的最大交易数量hive.max.open.txns*Default:* 100000HiveServer2/ MetastoreMaximum number of open transactions. If current open transactions reach this limit, future open transaction requests will be rejected, until the number goes below the limit. (As of Hive 1.3.0 and 2.1.0.)未结交易的最大数量。 如果当前未结交易达到此限制,则未来的未结交易请求将被拒绝,直到数量低于该限制。 (从 Hive 1.3.0 和 2.1.0 开始。)hive.count.open.txns.interval*Default:* 1sHiveServer2/ MetastoreTime in seconds between checks to count open transactions (as of Hive 1.3.0 and 2.1.0).对打开的事务进行计数的检查之间的时间(以秒为单位)(从 Hive 1.3.0 和 2.1.0 开始)。hive.txn.retryable.sqlex.regex*Default:* “” (empty string)HiveServer2/ MetastoreComma separated list of regular expression patterns for SQL state, error code, and error message of retryable SQLExceptions, that’s suitable for the Hive metastore database (as of Hive 1.3.0 and 2.1.0).For an example, see Configuration Properties.用于 SQL 状态、错误代码和可重试 SQLException 的错误消息的逗号分隔正则表达式模式列表,适用于 Hive 元存储数据库。hive.compactor.initiator.on*Default:* false*Value required for transactions:* true (for exactly one instance of the Thrift metastore service)MetastoreWhether to run the initiator thread on this metastore instance. Prior to Hive 1.3.0 it’s critical that this is enabled on exactly one standalone metastore service instance (not enforced yet).As of Hive 1.3.0 this property may be enabled on any number of standalone metastore instances.是否在此元存储实例上运行启动器线程。 在 Hive 1.3.0 之前,必须在一个独立元存储服务实例上启用此功能(尚未强制执行)。从 Hive 1.3.0 可以在任意数量的独立元存储实例上启用此属性。hive.compactor.cleaner.on*Default:* false*Value required for transactions:* true (for exactly one instance of the Thrift metastore service)MetastoreWhether to run the cleaner thread on this metastore instance.Before **Hive 4.0.0** Cleaner thread can be started/stopped with config hive.compactor.initiator.on. This config helps to enable/disable initiator/cleaner threads independently是否在此 Metastore 实例上运行 Cleaner 线程。在 **Hive 4.0.0** 之前,可以使用配置 hive.compactor.initiator.on 启动/停止 Cleaner 线程。 此配置有助于独立启用/禁用启动器/清理器线程hive.compactor.worker.threads*Default:* 0*Value required for transactions:* > 0 on at least one instance of the Thrift metastore serviceMetastoreHow many compactor worker threads to run on this metastore instance.2在此元存储实例上运行多少个压缩器工作线程。
2
^2
2hive.compactor.worker.timeout*Default:* 86400MetastoreTime in seconds after which a compaction job will be declared failed and the compaction re-queued.以秒为单位的时间,之后压缩作业将被声明失败并重新排队。hive.compactor.cleaner.run.interval*Default*: 5000MetastoreTime in milliseconds between runs of the cleaner thread. (Hive 0.14.0 and later.)清洁器线程运行之间的时间(以毫秒为单位)。 (Hive 0.14.0 及更高版本。)hive.compactor.check.interval*Default:* 300MetastoreTime in seconds between checks to see if any tables or partitions need to be compacted.3检查是否需要压缩任何表或分区的时间间隔(以秒为单位)。
3
^3
3hive.compactor.delta.num.threshold*Default:* 10MetastoreNumber of delta directories in a table or partition that will trigger a minor compaction.表或分区中将触发次要压缩的增量目录数。hive.compactor.delta.pct.threshold*Default:* 0.1MetastorePercentage (fractional) size of the delta files relative to the base that will trigger a major compaction. 1 = 100%, so the default 0.1 = 10%.增量文件相对于将触发主要压缩的基础的百分比(分数)大小。 1 = 100%,因此默认 0.1 = 10%。hive.compactor.abortedtxn.threshold*Default:* 1000MetastoreNumber of aborted transactions involving a given table or partition that will trigger a major compaction.涉及将触发主要压缩的给定表或分区的中止事务数。hive.compactor.aborted.txn.time.threshold*Default*: 12hMetastoreAge of table/partition’s oldest aborted transaction when compaction will be triggered. Default time unit is: hours. Set to a negative number to disable.触发压缩时表/分区最旧的中止事务的年龄。 默认时间单位是:小时。 设置为负数即可禁用hive.compactor.max.num.deltaDefault: 500MetastoreMaximum number of delta files that the compactor will attempt to handle in a single job (as of Hive 1.3.0).4压缩器在单个作业中尝试处理的增量文件的最大数量(从 Hive 1.3.0 开始)。
4
^4
4hive.compactor.job.queue*Default*: “” (empty string)MetastoreUsed to specify name of Hadoop queue to which Compaction jobs will be submitted. Set to empty string to let Hadoop choose the queue (as of Hive 1.3.0).用于指定将向其提交压缩作业的 Hadoop 队列的名称。 设置为空字符串以让 Hadoop 选择队列(从 Hive 1.3.0 开始)。Compaction Historyhive.compactor.history.retention.succeeded*Default: 3*MetastoreNumber of successful compaction entries to retain in history (per partition).要保留在历史记录中的成功压缩条目数(每个分区)。hive.compactor.history.retention.failed*Default: 3*MetastoreNumber of failed compaction entries to retain in history (per partition).要保留在历史记录中的失败压缩条目数(每个分区)。hive.compactor.history.retention.attempted*Default: 2*MetastoreNumber of attempted compaction entries to retain in history (per partition).要保留在历史记录中的尝试压缩条目数(每个分区)。hive.compactor.initiator.failed.compacts.threshold*Default: 2*MetastoreNumber of of consecutive failed compactions for a given partition after which the Initiator will stop attempting to schedule compactions automatically. It is still possible to use ALTER TABLE to initiate compaction. Once a manually initiated compaction succeeds auto initiated compactions will resume. Note that this must be less than hive.compactor.history.retention.failed.给定分区连续失败的压缩次数,之后启动器将停止尝试自动安排压缩。 仍然可以使用ALTER TABLE来启动压缩。 一旦手动启动的压缩成功,自动启动的压缩将恢复。 请注意,该值必须小于 hive.compactor.history.retention.failed。hive.compactor.history.reaper.interval*Default: 2m*MetastoreControls how often the process to purge historical record of compactions runs.控制清除压缩历史记录的进程运行的频率。
1
^1
1 hive.txn.max.open.batch 控制同时打开 Flume 或 Storm 等流代理的事务数量。 然后,流代理将该数量的条目写入单个文件(每个 Flume 代理或 Storm Bolt)。 因此,增加此值会减少流代理创建的增量文件的数量。 但它也会增加 Hive 在任何给定时间必须跟踪的打开事务的数量,这可能会对读取性能产生负面影响。
2
^2
2工作线程生成 MapReduce 作业来执行压缩。 他们自己不进行压实。 一旦确定需要压缩,增加工作线程的数量将减少表或分区的压缩时间。 随着更多 MapReduce 作业在后台运行,它还会增加 Hadoop 集群的后台负载。 每次压缩一次可以处理一个分区(如果未分区,则可以处理整个表)。
3
^3
3减小该值将减少需要压缩的表或分区开始压缩所需的时间。 然而,检查是否需要压缩需要对自上次主要压缩以来已在其上完成事务的每个表或分区多次调用 NameNode。 所以减小这个值会增加NameNode的负载。
4
^4
4如果压缩器检测到非常多的增量文件,它将首先运行几个部分次要压缩(当前是顺序的),然后执行实际请求的压缩。
5
^5
5如果该值不同,则活动事务可能会被确定为“超时”并因此被中止。 这将导致诸如“没有这样的事务…”、“没有这样的锁…”之类的错误
Configuration Values to Set for INSERT, UPDATE, DELETE
除了上面列出的新参数之外,还需要设置一些现有参数以支持 INSERT … VALUES、UPDATE、 和 DELETE。
Configuration keyMust be set tohive.support.concurrencytrue (default is false)hive.enforce.bucketingtrue (default is false) (Not required as of Hive 2.0)hive.exec.dynamic.partition.modenonstrict (default is strict)
Configuration Values to Set for Compaction
如果系统中的数据不属于 Hive 用户(即 Hive 元存储运行的用户),则 Hive 将需要以拥有数据的用户身份运行才能执行压缩。 如果您已经设置 HiveServer2 来模拟用户,那么唯一需要做的额外工作就是确保 Hive 有权从运行 Hive 元存储的主机模拟用户。 这是通过将主机名添加到 Hadoop 的
core-site.xml
文件中的
hadoop.proxyuser.hive.hosts
来完成的。 如果您尚未执行此操作,则需要将 Hive 配置为充当代理用户。 这需要您为运行 Hive 元存储的用户设置密钥表,并将
hadoop.proxyuser.hive.hosts
和
hadoop.proxyuser.hive.groups
添加到 Hadoop 的
core-site.xml
文件中。 请参阅有关您的 Hadoop 版本的安全模式的 Hadoop 文档(例如,对于 Hadoop 2.5.1,它位于 Hadoop in Secure Mode)。
Compaction pooling
有关压缩池的更多信息可以在这里找到:压缩池
Table Properties
如果要在 ACID 写入(插入、更新、删除)中使用表,则必须在该表上设置表属性“
transactional=true
”,从 Hive 0.14.0。 请注意,一旦通过 TBLPROPERTIES (“transactional”=“true”) 将表定义为 ACID 表,它就无法转换回非 ACID 表,即更改 TBLPROPERTIES (“transactional”=“false”) 是 不允许。 另外,hive.txn.manager必须设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager 在 hive-site.xml 中或在运行任何查询之前的会话开始时。 如果没有这些,插入将以旧样式完成; HIVE-11716 之前将禁止更新和删除。 由于 HIVE-11716,不允许在没有 DbTxnManager 的情况下对 ACID 表进行操作。 但是,这不适用于 Hive 0.13.0。
如果表所有者不希望系统自动确定何时压缩,则可以设置表属性“NO_AUTO_COMPACTION”。 这将阻止所有自动压缩。 手动压缩仍然可以使用 Alter Table/Partition Compact 语句来完成。
创建或更改表时,使用 TBLPROPERTIES 子句设置表属性,如创建表中所述,并且 Hive 数据定义语言的更改表属性 部分。 “
transactional
”和“
NO_AUTO_COMPACTION
”表属性在 Hive 版本 0.x 和 1.0 中区分大小写,但从版本 1.1.0 开始不区分大小写 (HIVE-8308)。
从 Hive 1.3.0 和 2.1.0 开始,可以通过 TBLPROPERTIES 设置更多与压缩相关的选项。 它们可以通过 CREATE TABLE 在表级别设置,并通过请求级别设置 更改表/分区紧凑。 这些用于覆盖仓库/表范围的设置。 例如,要覆盖 MR 属性以影响压缩作业,可以在 CREATE TABLE 语句中或通过 ALTER TABLE 显式启动压缩时添加
compactor.<mr property name>=<value>
。
<mr 属性名称>=<值>
将在压缩 MR 作业的 JobConf 上设置。 类似地,“tblprops.=”可用于设置/覆盖由集群上运行的代码解释的任何表属性。 最后,
compactorthreshold.<prop name>=<value>
可用于覆盖上面以
.threshold
结尾的“事务的新配置参数”表中的属性,并控制系统何时触发压缩。 例子:
示例:在表级别的 TBLPROPERTIES 中设置压缩选项
CREATETABLE table_name (
id int,
name string
)CLUSTEREDBY(id)INTO2 BUCKETS STORED AS ORC
TBLPROPERTIES ("transactional"="true","compactor.mapreduce.map.memory.mb"="2048",-- specify compaction map job properties"compactorthreshold.hive.compactor.delta.num.threshold"="4",-- trigger minor compaction if there are more than 4 delta directories"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5"-- trigger major compaction if the ratio of size of delta files to-- size of base files is greater than 50%);
示例:在请求级别设置 TBLPROPERTIES 中的压缩选项
ALTERTABLE table_name COMPACT 'minor'WITH OVERWRITE TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="3072");-- specify compaction map job propertiesALTERTABLE table_name COMPACT 'major'WITH OVERWRITE TBLPROPERTIES ("tblprops.orc.compress.size"="8192");-- change any other Hive table properties
需要关注的
重新平衡压缩
锁相关。
版权归原作者 顧棟 所有, 如有侵权,请联系我们删除。