在升级到Hive 3之前,需要把在事务表上Major Compaction。主要是为了合并掉增量文件。更准确地说,自上次Major Compaction以来在其上执行过任何更新/删除/合并语句的任何分区都必须进行另一次Major Compaction。在 Hive 升级到 Hive 3 之前,此分区上不会再发生更新/删除/合并。
ACID 代表数据库事务的四个特征
直到 Hive 0.13,原子性、一致性和持久性都是在分区级别提供的。 可以通过打开可用的锁定机制之一(ZooKeeper 或在内存中)来提供隔离。 通过在 Hive 0.13 中添加事务,现在可以在行级别提供完整的 ACID 语义,以便一个应用程序可以添加行 而另一个则从同一个分区读取数据而不会互相干扰。
具有 ACID 语义的事务已添加到 Hive 中以解决以下场景:
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
才能使用 ACID 表。Hive提供了流式数据采集和流式数据修改的API:
这两个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。
HDFS 不支持对文内容件进行更改。 面对写入器写入到用户正在读取的文件时,它也不提供读取一致性。为了在 HDFS 之上提供这些功能,我们遵循其他数据仓库工具中使用的标准方法。 表或分区的数据存储在一组基本文件中。 新记录、更新和删除都存储在增量文件中。 为每个更改表或分区的事务(或者在 Flume 或 Storm 等流代理的情况下,为每批事务)创建一组新的增量文件。 在读取时,读取器合并基本文件和增量文件,在读取时应用任何更新和删除。
以前,分区(或表,如果表未分区)的所有文件都位于单个目录中。 通过这些更改,使用 ACID 感知写入器写入的任何分区(或表)都将具有用于基本文件的目录和用于每组增量文件的目录。 对于未分区的表“t”,这可能是这样的:
Filesystem Layout for Table “t”
hive> dfs -ls -R /user/hive/warehouse/t;
drwxr-xr-x - ekoifman staff 0 2016-06-09 17:03 /user/hive/warehouse/t/base_0000022
-rw-r--r-- 1 ekoifman staff 602 2016-06-09 17:03 /user/hive/warehouse/t/base_0000022/bucket_00000
drwxr-xr-x - ekoifman staff 0 2016-06-09 17:06 /user/hive/warehouse/t/delta_0000023_0000023_0000
-rw-r--r-- 1 ekoifman staff 611 2016-06-09 17:06 /user/hive/warehouse/t/delta_0000023_0000023_0000/bucket_00000
drwxr-xr-x - ekoifman staff 0 2016-06-09 17:07 /user/hive/warehouse/t/delta_0000024_0000024_0000
-rw-r--r-- 1 ekoifman staff 610 2016-06-09 17:07 /user/hive/warehouse/t/delta_0000024_0000024_0000/bucket_00000
Compactor 是一组在 Metastore 内运行的后台进程,用于支持 ACID 系统。 它由 Initiator
、Worker
、Cleaner
、AcidHouseKeeperService
和其他一些组件组成。
随着操作修改表,会创建越来越多的增量文件,需要对其进行压缩以保持足够的性能。 压缩分为三种类型:minor、major 和rebalance。
所有压缩都是在后台完成的。minor 和major 不会阻止数据的并发读取和写入。 重新平衡压缩使用排它写锁,因此它可以防止并发写入。 压缩后,系统会等待旧文件的所有读取器完成,然后删除旧文件。
该模块负责发现哪些表或分区需要压缩。 应使用 hive.compactor.initiator.on 在 Metastore 中启用此功能。 下面的“事务的新配置参数”表中有几个 *.threshold 形式的属性,用于控制何时创建压缩任务以及执行哪种类型的压缩。 每个压缩任务处理 1 个分区(如果表未分区,则处理整个表)。 如果给定分区的连续压缩失败次数超过 hive.compactor.initiator.failed.compacts.threshold
,则该分区的自动压缩调度将停止。 有关详细信息,请参阅配置参数表。
每个 Worker 处理一个压缩任务。 压缩是一个 MapReduce 作业,其名称采用以下形式: 清理不需要的增量文件的模块。 此过程查找在 hive.txn.timeout 时间内未检测到的事务并中止它们 。 系统假设发起事务的客户端停止心跳崩溃并且其锁定的资源应该被释放。 此命令显示有关当前运行的压缩和最近的压缩历史记录(可配置的保留期)的信息。 此历史记录显示自 HIVE-12353 起可用。 另请参阅 LanguageManual DDL#ShowCompactions 了解有关此命令输出的更多信息和 NewConfigurationParametersforTransactions/Compaction History 了解影响此命令输出的配置属性。 系统保留每种类型的最后 N 个条目:failed、succeeded、attempted (其中 N 可以为每种类型配置)。 添加了一个名为“事务管理器”的新逻辑实体,它合并了之前的“数据库/表/分区锁管理器”概念(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 架构,即使存在并发修改操作也能够提供强读一致性(快照隔离)。 必须正确设置这些配置参数才能在 Hive 中打开事务支持: Client Side Server Side (Metastore) 以下部分列出了影响 Hive 事务和压缩的所有配置参数。 另请参阅上面的限制 和表属性如下。 系统中添加了许多新的配置参数以支持事务。 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如果该值不同,则活动事务可能会被确定为“超时”并因此被中止。 这将导致诸如“没有这样的事务…”、“没有这样的锁…”之类的错误 除了上面列出的新参数之外,还需要设置一些现有参数以支持 INSERT … VALUES、UPDATE、 和 DELETE。 如果系统中的数据不属于 Hive 用户(即 Hive 元存储运行的用户),则 Hive 将需要以拥有数据的用户身份运行才能执行压缩。 如果您已经设置 HiveServer2 来模拟用户,那么唯一需要做的额外工作就是确保 Hive 有权从运行 Hive 元存储的主机模拟用户。 这是通过将主机名添加到 Hadoop 的 有关压缩池的更多信息可以在这里找到:压缩池 如果要在 ACID 写入(插入、更新、删除)中使用表,则必须在该表上设置表属性“ 如果表所有者不希望系统自动确定何时压缩,则可以设置表属性“NO_AUTO_COMPACTION”。 这将阻止所有自动压缩。 手动压缩仍然可以使用 Alter Table/Partition Compact 语句来完成。 创建或更改表时,使用 TBLPROPERTIES 子句设置表属性,如创建表中所述,并且 Hive 数据定义语言的更改表属性 部分。 “ 从 Hive 1.3.0 和 2.1.0 开始,可以通过 TBLPROPERTIES 设置更多与压缩相关的选项。 它们可以通过 CREATE TABLE 在表级别设置,并通过请求级别设置 更改表/分区紧凑。 这些用于覆盖仓库/表范围的设置。 例如,要覆盖 MR 属性以影响压缩作业,可以在 CREATE TABLE 语句中或通过 ALTER TABLE 显式启动压缩时添加 示例:在表级别的 TBLPROPERTIES 中设置压缩选项 示例:在请求级别设置 TBLPROPERTIES 中的压缩选项 需要关注的 锁相关。<主机名>-compactor-
.
Cleaner
AcidHouseKeeperService
SHOW COMPACTIONS
Transaction/Lock Manager
Configuration
New Configuration Parameters for Transactions
Configuration key
Values
Location
Notes
hive.txn.manager
Default: org.apache.hadoop.hive.ql.lockmgr.DummyTxnManagerValue required for transactions: org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
Client/ HiveServer2
DummyTxnManager replicates pre Hive-0.13 behavior and provides no transactions.DummyTxnManager 复制 Hive-0.13 之前的行为并且不提供事务。
hive.txn.strict.locking.mode
Default: true
Client/ HiveServer2
In 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.timeout
Default: 300
Client/ HiveServer2/Metastore
如果客户端未发送心跳,则声明事务中止的时间(以秒为单位)。 至关重要的是,该属性对于所有组件/服务都具有相同的值。 5 ^5 5
hive.txn.heartbeat.threadpool.size
Default: 5
Client/HiveServer2
The 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: 100s
Metastore
Time 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: 180s
Metastore
Time 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: 1000
Client
Maximum number of transactions that can be fetched in one call to open_txns().1一次调用 open_txns(). 1 ^1 1可以获取的最大交易数量
hive.max.open.txns
Default: 100000
HiveServer2/ Metastore
Maximum 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: 1s
HiveServer2/ Metastore
Time 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/ Metastore
Comma 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: falseValue required for transactions: true (for exactly one instance of the Thrift metastore service)
Metastore
Whether 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: falseValue required for transactions: true (for exactly one instance of the Thrift metastore service)
Metastore
Whether 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: 0Value required for transactions: > 0 on at least one instance of the Thrift metastore service
Metastore
How many compactor worker threads to run on this metastore instance.2在此元存储实例上运行多少个压缩器工作线程。 2 ^2 2
hive.compactor.worker.timeout
Default: 86400
Metastore
Time in seconds after which a compaction job will be declared failed and the compaction re-queued.以秒为单位的时间,之后压缩作业将被声明失败并重新排队。
hive.compactor.cleaner.run.interval
Default: 5000
Metastore
Time in milliseconds between runs of the cleaner thread. (Hive 0.14.0 and later.)清洁器线程运行之间的时间(以毫秒为单位)。 (Hive 0.14.0 及更高版本。)
hive.compactor.check.interval
Default: 300
Metastore
Time in seconds between checks to see if any tables or partitions need to be compacted.3检查是否需要压缩任何表或分区的时间间隔(以秒为单位)。 3 ^3 3
hive.compactor.delta.num.threshold
Default: 10
Metastore
Number of delta directories in a table or partition that will trigger a minor compaction.表或分区中将触发次要压缩的增量目录数。
hive.compactor.delta.pct.threshold
Default: 0.1
Metastore
Percentage (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: 1000
Metastore
Number of aborted transactions involving a given table or partition that will trigger a major compaction.涉及将触发主要压缩的给定表或分区的中止事务数。
hive.compactor.aborted.txn.time.threshold
Default: 12h
Metastore
Age 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.delta
Default: 500
Metastore
Maximum 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 4
hive.compactor.job.queue
Default: “” (empty string)
Metastore
Used 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 History
hive.compactor.history.retention.succeeded
Default: 3
Metastore
Number of successful compaction entries to retain in history (per partition).要保留在历史记录中的成功压缩条目数(每个分区)。
hive.compactor.history.retention.failed
Default: 3
Metastore
Number of failed compaction entries to retain in history (per partition).要保留在历史记录中的失败压缩条目数(每个分区)。
hive.compactor.history.retention.attempted
Default: 2
Metastore
Number of attempted compaction entries to retain in history (per partition).要保留在历史记录中的尝试压缩条目数(每个分区)。
hive.compactor.initiator.failed.compacts.threshold
Default: 2
Metastore
Number 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
Metastore
Controls how often the process to purge historical record of compactions runs.控制清除压缩历史记录的进程运行的频率。
Configuration Values to Set for INSERT, UPDATE, DELETE
Configuration key
Must be set to
hive.support.concurrency
true (default is false)
hive.enforce.bucketing
true (default is false) (Not required as of Hive 2.0)
hive.exec.dynamic.partition.mode
nonstrict (default is strict)
Configuration Values to Set for Compaction
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
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。transactional
”和“NO_AUTO_COMPACTION
”表属性在 Hive 版本 0.x 和 1.0 中区分大小写,但从版本 1.1.0 开始不区分大小写 (HIVE-8308)。compactor.
。
将在压缩 MR 作业的 JobConf 上设置。 类似地,“tblprops.=”可用于设置/覆盖由集群上运行的代码解释的任何表属性。 最后,compactorthreshold.
可用于覆盖上面以.threshold
结尾的“事务的新配置参数”表中的属性,并控制系统何时触发压缩。 例子:CREATE TABLE table_name (
id int,
name string
)
CLUSTERED BY (id) INTO 2 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%
);
ALTER TABLE table_name COMPACT 'minor'
WITH OVERWRITE TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="3072"); -- specify compaction map job properties
ALTER TABLE table_name COMPACT 'major'
WITH OVERWRITE TBLPROPERTIES ("tblprops.orc.compress.size"="8192"); -- change any other Hive table properties
重新平衡压缩你可能感兴趣的:(hive,hadoop,数据仓库)