这是CDH/HDP/Apache Hadoop迁移到CDP系列的第二篇博客,如对迁移感兴趣,请关注该系列之前博客《使用 Replication Manager 迁移到CDP 私有云基础》、《将数据迁移到CDP 私有云基础的数据迁移用例》。
使用Replication Manager 将 Hive 数据迁移到 CDP 后,您可能需要执行其他任务。您需要了解 Hive 3.x 和更早版本之间的语义差异。其中一些差异要求您更改 Hive 脚本或工作流程。此外,您需要将使用 CDP 不支持的 Hive CLI 的脚本转换为 Beeline。
您需要知道您的表所在的位置以及升级过程所做的属性更改。在使用 Hive 表之前,您需要执行一些迁移后任务。了解 Apache Hive 3 的主要设计特性,例如默认的 ACID 事务处理,可以帮助您使用 Hive 来满足企业数据仓库系统不断增长的需求。有关更多信息,请参阅 Apache Hive 3 架构更改和 Apache Hive 主要功能。
处理语法更改
升级到 CDP 后,您需要修改受 Hive 语法更改影响的查询。Hive 更改了与 `db.table` 引用相关的语法,例如CREATE TABLE `mydb.mytable` … . 其他语法更改涉及 CREATE TABLE 中的 LOCATION 子句。CDP 中的 Hive 支持对添加 MANAGEDLOCATION 子句的 CREATE TABLE 的增强。
处理表引用语法
为了符合 ANSI SQL,Hive 3.x 拒绝 SQL 查询中的 `db.table`,如 Hive-16907 错误修复所述。表名中不允许使用点 (.)。作为数据工程师,您需要在将表迁移到 CDP 之前确保 Hive 表不包含这些引用,更改脚本以符合 SQL 标准引用,并且用户意识到这个要求。
要更改使用此类 `db.table` 引用的查询,从而防止 Hive 将整个 db.table 字符串错误地解释为表名称,请将数据库名称和表名称括在反引号中,如下所示:
表名中不允许使用点 (.)。
- 查找具有问题表参考的表。
例如,math.students 出现在 CREATE TABLE 语句中。
- 用反引号将数据库名称和表名称括起来。
CREATE TABLE `math`.`students` (name VARCHAR(64), age INT, gpa DECIMAL(3,2));
向表引用添加反引号
CDP 包括 Hive-16907 错误修复,它拒绝 SQL 查询中的 `db.table`。表名中不允许使用点 (.)。您需要更改使用此类引用的查询,以防止 Hive 将整个 db.table 字符串解释为表名。
- 查找具有问题表参考的表。
math.students
出现在 CREATE TABLE 语句中。
- 用反引号将数据库名称和表名称括起来。
CREATE TABLE `math`.`students` (name VARCHAR(64), age INT, gpa DECIMAL(3,2));
LOCATION 和 MANAGEDLOCATION 子句
在升级之前,您的 Hive 版本可能支持在查询中使用 LOCATION 子句来创建托管或外部表或为托管和外部表创建数据库。升级后,Hive 将托管表和外部表存储在不同的 HDFS 位置。CREATE TABLE 限制了 LOCATION 子句的使用,因此需要对您的查询进行更改。CDP 中的 Hive 还支持新的与位置相关的子句。
创建表位置的外部表限制
Hive 将仓库中的默认位置分配给托管表。在CDP中,Hive也 不会允许在查询中使用LOCATION子句来创建一个管理表。使用此子句,您只能在创建外部表时指定位置。例如:
代码语言:javascript复制CREATE EXTERNAL TABLE my_external_table (a string, b string)
ROW FORMAT SERDE 'com.mytables.MySerDe'
WITH SERDEPROPERTIES ( "input.regex" = "*.csv")
LOCATION '/warehouse/tablespace/external/hive/marketing';
表 MANAGEDLOCATION 子句
在 CDP 中,Hive 已得到增强以包含一个 MANAGEDLOCATION 子句,如以下语法所示:
代码语言:javascript复制CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION external_table_path]
[MANAGEDLOCATION managed_table_directory_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
在 MANAGEDLOCATION 子句中,您可以在创建 Hive 数据库时为托管表指定顶级目录。不要设置LOCATION和MANAGEDLOCATION为相同的HDFS路径。
识别语义变化和解决方法
作为 SQL 开发人员、分析师或其他 Hive 用户,您需要了解由于语义更改而导致的查询潜在问题。某些更改的操作并未得到广泛使用,因此您可能不会遇到与更改相关的任何问题。
多年来,Apache Hive 提交者在 CDH 和 HDP 的旧版本中支持 Hive 的增强版本,并考虑到用户。更改旨在保持与 Hive 应用程序的兼容性。因此,多年来几乎没有发生语法变化。然而,本节中描述的一些语义变化确实发生了。描述了这些语义更改的变通方法。
转换时间戳
将数字转换为时间戳的应用程序的结果与 Hive 2 到 Hive 3 不同。Apache Hive 更改了 CAST 的行为以符合 SQL 标准,该标准不将时区与 TIMESTAMP 类型相关联。
升级到 CDP 之前
将数字类型值转换为时间戳可用于生成反映集群时区的结果。例如,1597217764557 是 2020-08-12 00:36:04 PDT。运行以下查询将数字转换为 PDT 中的时间戳:
代码语言:javascript复制> SELECT CAST(1597217764557 AS TIMESTAMP);
| 2020-08-12 00:36:04 |
升级到 CDP 后
将数字类型值转换为时间戳会产生反映 UTC 而不是集群时区的结果。运行以下查询会将数字转换为 UTC 中的时间戳。
代码语言:javascript复制> SELECT CAST(1597217764557 AS TIMESTAMP);
| 2020-08-12 07:36:04.557 |
需要采取的行动
更改应用程序。不要通过数字转换来获取本地时区。内置函数from_utc_timestamp, to_utc_timestamp可用于模拟升级前的行为。
转换无效日期
CDH 5 中的 Hive 1的无效日期的转换不同于 CDP 中的 Hive 3。Hive 3 使用与 Hive 1 中使用的不同的解析器格式化程序,这会影响语义。Hive 1 认为 00 对日期字段无效。Hive 3 认为 00 对日期字段有效。Hive 1 和 Hive 3 都不能正确处理无效日期,Hive-25056 解决了这个问题。
升级到 CDP 之前
无效日期的转换(日期、月份、年份 3 个字段中的一个或多个为零值)将返回 NULL 值:
代码语言:javascript复制> SELECT CAST ('0000-00-00' as date) , CAST ('000-00-00 00:00:00' AS TIMESTAMP) ;
...
------------
_c0_c1
------------
NULLNULL
------------
1 row selected (0.154 seconds)
升级到 CDP 后
转换无效日期会返回结果。
代码语言:javascript复制> SELECT CAST ('0000-00-00' as date) , CAST ('000-00-00 00:00:00' AS TIMESTAMP) ;
...
-----------------------------------
_c0_c1
-----------------------------------
00002-11-30 00:00:00.0
-----------------------------------
1 row selected (5.291 seconds)
需要采取的行动
不要在 Hive 3 中转换无效日期。
更改不兼容的字段类型
默认配置更改可能会导致更改列类型的应用程序失败。
升级到 CDP 之前
在 HDP 2.x 和 CDH 5.x 中,hive.metastore.disallow.incompatible.col.type.changes 默认值为 false ,以允许更改为不兼容的列类型。例如,您可以将 STRING 列更改为不兼容类型的列,例如 MAP<STRING, STRING>,这不会发生错误。
升级到 CDP 后
在 CDP 中,hive.metastore.disallow.incompatible.col.type.changes默认为 true。Hive 可防止更改不兼容的列类型。不会阻止兼容的列类型更改,例如 INT、STRING、BIGINT。
需要采取的行动
更改应用程序以禁止不兼容的列类型更改,以防止可能的数据损坏。检查 ALTER TABLE 语句并更改那些由于不兼容的列类型而失败的语句。
创建表
为了提高可用性和功能,Hive 3 显着改变了表的创建。
Hive 通过以下方式改变了表的创建:
- 创建符合 ACID 的表,这是 CDP 中的默认值
- 支持简单的写入和插入
- 写入多个分区
- 在单个 SELECT 语句中插入多个数据更新
- 无需分桶。
如果您有在 Hive 中创建表的 ETL 管道,则这些表将创建为 ACID。Hive 现在严格控制访问并定期对表执行压缩。从 Spark 和其他客户端访问托管 Hive 表的方式发生了变化。在 CDP 中,访问外部表需要您设置安全访问权限。
升级到 CDP 之前
在 CDH 和 HDP 2.6.5 中,默认情况下 CREATE TABLE 创建了一个非 ACID 表。
升级到 CDP 后
在 CDP 中,默认情况下 CREATE TABLE 以 ORC 格式创建完整的 ACID 事务表。
需要采取的行动
执行以下一项或多项操作:
- 配置旧的 CREATE TABLE 行为(参见下一节)以默认创建外部表。
- 要从 Spark 读取 Hive ACID 表,请使用 Hive Warehouse Connector (HWC) 或 HWC Spark Direct Reader 连接到 Hive。要将 ACID 表从 Spark 写入 Hive,您可以使用 HWC 和 HWC API。当您不使用 HWC API 时,Spark 会创建一个具有清除属性的外部表。有关更多信息,请参阅 HWC Spark 直接读取器和 Hive 仓库连接器。
- 为表设置 Ranger 策略和 HDFS ACL。有关更多信息,请参阅 HDFS ACL 和 HDFS ACL 权限。
处理关键字APPLICATION
如果在查询中使用关键字 APPLICATION,则可能需要修改查询以防止失败。
为防止使用关键字的查询失败,请将查询括在反引号中。
升级到 CDP 之前
在 CDH 版本(例如 CDH 5.13)中,在查询中使用单词 APPLICATION 的查询会成功执行。例如,您可以使用这个词作为表名。
代码语言:javascript复制> select f1, f2 from application
升级到 CDP 后
使用关键字 APPLICATION 的查询失败。
需要采取的行动
更改应用程序。将查询括在反引号中。
代码语言:javascript复制SELECT field1, field2 FROM `application`;
禁用分区类型检查
Hive 3 中的增强功能检查分区的类型。可以通过设置属性来禁用此功能。有关更多信息,请参阅 ASF Apache Hive 语言手册。
升级到 CDP 之前
在 CDH 5.x 中,不会对分区值进行类型检查。
升级到 CDP 后
如果该属性hive.typecheck.on.insert设置为true(默认),则分区规范中指定的分区值将进行类型检查、转换和规范化以符合它们的列类型 。值可以是数字。
需要采取的行动
如果分区的类型检查导致问题,请禁用该功能。要禁用分区类型检查,请设置hive.typecheck.on.insert为false。例如:
代码语言:javascript复制SET hive.typecheck.on.insert=false;
删除分区
用于删除分区的 CASCADE 子句中的 OFFLINE 和 NO_DROP 关键字会导致性能问题并且不再受支持。
升级到 CDP 之前
您可以在 DROP CASCADE 子句中使用 OFFLINE 和 NO_DROP 关键字来防止读取或删除分区。
升级到 CDP 后
DROP CASCADE 子句不支持 OFFLINE 和 NO_DROP。
需要采取的行动
更改应用程序以从 DROP CASCADE 子句中删除 OFFLINE 和 NO_DROP。使用授权方案(例如 Ranger)来防止分区被删除或读取。
处理最大函数和最小函数的输出
要计算列中的最大(或最小)值,您需要解决当列具有 NULL 值时出现的问题。
升级到 CDP 之前
最大函数返回值列表中的最大值。最少函数返回值列表中的最小值。
升级到 CDP 后
当一个或多个参数为 NULL 时返回 NULL。
需要采取的行动
在用作最大或最小函数的参数的列上使用 NULL 过滤器或 nvl 函数。
代码语言:javascript复制SELECT greatest(nvl(col1,default value incase of NULL),nvl(col2,default value incase of NULL));
重命名表
为了强化系统,Hive 数据可以存储在 HDFS 加密区域中。RENAME 已更改以防止将表移动到同一加密区域之外或移动到非加密区域中。
升级到 CDP 之前
在 CDH 和 HDP 中,重命名托管表会移动其 HDFS 位置。
升级到 CDP 后
仅当创建的表没有 LOCATION 子句并且位于其数据库目录下时,重命名托管表才会移动其位置。
需要采取的行动
不需要任何行动
外部表上的 TRUNCATE TABLE
如果您从支持外部表上的 TRUNCATE TABLE 的 Hive 版本升级,则需要以这种方式更改使用该命令的应用程序。截断外部表会导致错误。
升级到 CDP 之前
一些旧版本的 Hive 支持外部表上的 TRUNCATE TABLE。
升级到 CDP 后
TRUNCATE TABLE 仅在托管表上受支持。尝试截断外部表会导致以下错误:
代码语言:javascript复制Error: org.apache.spark.sql.AnalysisException: Operation not allowed: TRUNCATE TABLE on external tables
需要采取的行动
更改应用程序。不要尝试在外部表上运行 TRUNCATE TABLE。
Hive 配置属性更改
您需要了解升级过程所做的属性值更改,因为该更改可能会影响您的工作。您可能需要考虑重新配置升级更改的属性值默认值。
Hive 配置属性值
升级过程会更改某些 Hive 配置属性的默认值并添加新属性。下面的列表描述了从 CDH 或 HDP 升级到 CDP 后发生的那些变化。
datanucleus.connectionPool.maxPoolSize
升级前:30
升级后:10
datanucleus.connectionPoolingType
升级前:BONECP
升级后:HikariCP
hive.auto.convert.join.noconditionaltask.size
升级前:20971520
升级后:52428800
例外:如果旧的默认值被覆盖,则保留升级前的值;否则,使用新的默认值。
hive.auto.convert.sortmerge.join
升级前:FALSE在旧CDH中;TRUE在旧的 HDP 中。
升级后:TRUE
hive.auto.convert.sortmerge.join.to.mapjoin
升级前:FALSE
升级后:TRUE
hive.cbo.enable
升级前:FALSE
升级后:TRUE
hive.cbo.show.warnings
升级前:FALSE
升级后:TRUE
hive.compactor.worker.threads
升级前: 0
升级后:5
hive.compute.query.using.stats
升级前:FALSE
升级后:TRUE
hive.conf.hidden.list
升级前:
javax.jdo.option.ConnectionPassword,hive.server2.keystore.password,hive.metastore.dbaccess.ssl.truststore.password,fs.s3.awsAccessKeyId,fs.s3.awsSecretAccessKey,fs.s3n.awsAccessKeyId,fs.s3n.awsSecretAccessKey,fs.s3a.access.key,fs.s3a.secret.key,fs.s3a.proxy.password,dfs.adls.oauth2.credential,fs.adl.oauth2.credential,fs.azure.account.oauth2.client.secret
升级后:
javax.jdo.option.ConnectionPassword,hive.server2.keystore.password,hive.druid.metadata.password,hive.driver.parallel.compilation.global.limit
hive.conf.restricted.list
升级前:
hive.security.authenticator.manager,hive.security.authorization.manager,hive.users.in.admin.role,hive.server2.xsrf.filter.enabled,hive.spark.client.connect.timeout,hive.spark.client.server.connect.timeout,hive.spark.client.channel.log.level,hive.spark.client.rpc.max.size,hive.spark.client.rpc.threads,hive.spark.client.secret.bits,hive.spark.client.rpc.server.address,hive.spark.client.rpc.server.port,hive.spark.client.rpc.sasl.mechanisms,hadoop.bin.path,yarn.bin.path,spark.home,bonecp.,hikaricp.,hive.driver.parallel.compilation.global.limit,_hive.local.session.path,_hive.hdfs.session.path,_hive.tmp_table_space,_hive.local.session.path,_hive.hdfs.session.path,_hive.tmp_table_space
升级后:
hive.security.authenticator.manager,hive.security.authorization.manager,hive.security.metastore.authorization.manager,hive.security.metastore.authenticator.manager,hive.users.in.admin.role,hive.server2.xsrf.filter.enabled,hive.security.authorization.enabled,hive.distcp.privileged.doAs,hive.server2.authentication.ldap.baseDN,hive.server2.authentication.ldap.url,hive.server2.authentication.ldap.Domain,hive.server2.authentication.ldap.groupDNPattern,hive.server2.authentication.ldap.groupFilter,hive.server2.authentication.ldap.userDNPattern,hive.server2.authentication.ldap.userFilter,hive.server2.authentication.ldap.groupMembershipKey,hive.server2.authentication.ldap.userMembershipKey,hive.server2.authentication.ldap.groupClassKey,hive.server2.authentication.ldap.customLDAPQuery,hive.privilege.synchronizer.interval,hive.spark.client.connect.timeout,hive.spark.client.server.connect.timeout,hive.spark.client.channel.log.level,hive.spark.client.rpc.max.size,hive.spark.client.rpc.threads,hive.spark.client.secret.bits,hive.spark.client.rpc.server.address,hive.spark.client.rpc.server.port,hive.spark.client.rpc.sasl.mechanisms,bonecp.,hive.druid.broker.address.default,hive.druid.coordinator.address.default,hikaricp.,hadoop.bin.path,yarn.bin.path,spark.home,hive.driver.parallel.compilation.global.limit,_hive.local.session.path,_hive.hdfs.session.path,_hive.tmp_table_space,_hive.local.session.path,_hive.hdfs.session.path,_hive.tmp_table_space
hive.default.fileformat.managed
升级前:None
升级后:ORC
hive.default.rcfile.serde
升级前:org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe
升级后:org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe
Impala 不支持。Impala 无法读取 Hive 创建的 RC 表。
hive.driver.parallel.compilation
升级前:FALSE
升级后:TRUE
hive.exec.dynamic.partition.mode
升级前:严格
升级后:非严格
在CDP Private Cloud Base 中,默认情况下不会防止意外使用动态分区功能。
hive.exec.max.dynamic.partitions
升级前:1000
升级后:5000
在 CDP Private Cloud Base 中,动态分区的限制比升级前的 CDH 或 HDP 集群少。
hive.exec.max.dynamic.partitions.pernode
升级前:100
升级后:2000
在 CDP Private Cloud Base 中,动态分区的限制比升级前的 CDH 或 HDP 集群少。
hive.exec.post.hooks
升级前:
com.cloudera.navigator.audit.hive.HiveExecHookContext,org.apache.hadoop.hive.ql.hooks.LineageLogger
升级后:org.apache.hadoop.hive.ql.hooks.HiveProtoLoggingHook
建议使用质数。
hive.exec.reducers.max
升级前:1099
升级后:1009
例外:如果旧的默认值被覆盖,则保留升级前的值;否则,使用新的默认值
hive.execution.engine
升级前:mr
升级后:tez
Tez 现在是唯一受支持的执行引擎,例如,在会话中将执行模式更改为 Spark 或 MapReduce 的现有查询失败。
hive.fetch.task.conversion
升级前:minimal
升级后:more
hive.fetch.task.conversion.threshold
升级前:256MB
升级后:1GB
例外:如果旧的默认值被覆盖,则保留升级前的值;否则,使用新的默认值。
hive.hashtable.key.count.adjustment
升级前:1
升级后: 0.99
例外:如果旧的默认值被覆盖,则保留升级前的值;否则,使用新的默认值。
hive.limit.optimize.enable
升级前:FALSE
升级后:TRUE
hive.limit.pushdown.memory.usage
升级前: 0.1
升级后: 0.04
例外:如果旧的默认值被覆盖,则保留升级前的值;否则,使用新的默认值。
hive.mapjoin.hybridgrace.hashtable
升级前:TRUE
升级后:FALSE
hive.mapred.reduce.tasks.speculative.execution
升级前:TRUE
升级后:FALSE
hive.metastore.aggregate.stats.cache.enabled
升级前:TRUE
升级后:FALSE
hive.metastore.disallow.incompatible.col.type.changes
升级前:FALSE
升级后:TRUE
为了避免数据损坏,CDP Private Cloud Base 中的模式演变比 CDH 中的限制更多。如果新旧类型不兼容,新的默认值不允许更改列类型。
hive.metastore.dml.events
升级前:FALSE
升级后:TRUE
hive.metastore.event.message.factory
升级前:org.apache.hadoop.hive.metastore.messaging.json.ExtendedJSONMessageFactory
升级后:org.apache.hadoop.hive.metastore.messaging.json.gzip.GzipJSONMessageEncoder
hive.metastore.uri.selection
升级前:SEQUENTIAL
升级后:RANDOM
hive.metastore.warehouse.dir
从 CDH 升级之前: /user/hive/warehouse
从 HDP 升级之前: /apps/hive/warehouse
从 CDH 升级后: /warehouse/tablespace/managed/hive
从 HDP 升级后: /warehouse/tablespace/managed/hive
有关升级后创建的旧表和新表的位置的信息,请参阅对 CDH Hive 表的更改或对 HDP Hive 表的更改。
hive.optimize.metadataonly
升级前:FALSE
升级后:TRUE
hive.optimize.point.lookup.min
升级前:31
升级后:2
hive.prewarm.numcontainers
升级前:10
升级后:3
hive.script.operator.env.blacklist
升级前:hive.txn.valid.txns,hive.script.operator.env.blacklist
升级后:hive.txn.valid.txns,hive.txn.tables.valid.writeids,hive.txn.valid.writeids,hive.script.operator.env.blacklist
hive.security.authorization.sqlstd.confwhitelist
升级前:
hive.auto..*hive.cbo..*hive.convert..*hive.exec.dynamic.partition.*hive.exec..*.dynamic.partitions..*hive.exec.compress..*hive.exec.infer..*hive.exec.mode.local..*hive.exec.orc..*hive.exec.parallel.*hive.explain..*hive.fetch.task..*hive.groupby..*hive.hbase..*hive.index..*hive.index..*hive.intermediate..*hive.join..*hive.limit..*hive.log..*hive.mapjoin..*hive.merge..*hive.optimize..*hive.orc..*hive.outerjoin..*hive.parquet..*hive.ppd..*hive.prewarm..*hive.server2.proxy.userhive.skewjoin..*hive.smbjoin..*hive.stats..*hive.strict..*hive.tez..*hive.vectorized..*mapred.map..*mapred.reduce..*mapred.output.compression.codecmapred.job.queuenamemapred.output.compression.typemapred.min.split.sizemapreduce.job.reduce.slowstart.completedmapsmapreduce.job.queuenamemapreduce.job.tagsmapreduce.input.fileinputformat.split.minsizemapreduce.map..*mapreduce.reduce..*mapreduce.output.fileoutputformat.compress.codecmapreduce.output.fileoutputformat.compress.typeoozie..*tez.am..*tez.task..*tez.runtime..*tez.queue.namehive.transpose.aggr.joinhive.exec.reducers.bytes.per.reducerhive.client.stats.countershive.exec.default.partition.namehive.exec.drop.ignorenonexistenthive.counters.group.namehive.default.fileformat.managedhive.enforce.bucketmapjoinhive.enforce.sortmergebucketmapjoinhive.cache.expr.evaluationhive.query.result.fileformathive.hashtable.loadfactorhive.hashtable.initialCapacityhive.ignore.mapjoin.hinthive.limit.row.max.sizehive.mapred.modehive.map.aggrhive.compute.query.using.statshive.exec.rowoffsethive.variable.substitutehive.variable.substitute.depthhive.autogen.columnalias.prefix.includefuncnamehive.autogen.columnalias.prefix.labelhive.exec.check.crossproductshive.cli.tez.session.asynchive.compathive.exec.concatenate.check.indexhive.display.partition.cols.separatelyhive.error.on.empty.partitionhive.execution.enginehive.exec.copyfile.maxsizehive.exim.uri.scheme.whitelisthive.file.max.footerhive.insert.into.multilevel.dirshive.localize.resource.num.wait.attemptshive.multi.insert.move.tasks.share.dependencieshive.support.quoted.identifiershive.resultset.use.unique.column.nameshive.analyze.stmt.collect.partlevel.statshive.exec.schema.evolutionhive.server2.logging.operation.levelhive.server2.thrift.resultset.serialize.in.taskshive.support.special.characters.tablenamehive.exec.job.debug.capture.stacktraceshive.exec.job.debug.timeouthive.llap.io.enabledhive.llap.io.use.fileid.pathhive.llap.daemon.service.hostshive.llap.execution.modehive.llap.auto.allow.uberhive.llap.auto.enforce.treehive.llap.auto.enforce.vectorizedhive.llap.auto.enforce.statshive.llap.auto.max.input.sizehive.llap.auto.max.output.sizehive.llap.skip.compile.udf.checkhive.llap.client.consistent.splitshive.llap.enable.grace.join.in.llaphive.llap.allow.permanent.fnshive.exec.max.created.fileshive.exec.reducers.maxhive.reorder.nway.joinshive.output.file.extensionhive.exec.show.job.failure.debug.infohive.exec.tasklog.debug.timeouthive.query.id
升级后:
hive.auto..*hive.cbo..*hive.convert..*hive.druid..*hive.exec.dynamic.partition.*hive.exec.max.dynamic.partitions.*hive.exec.compress..*hive.exec.infer..*hive.exec.mode.local..*hive.exec.orc..*hive.exec.parallel.*hive.exec.query.redactor..*hive.explain..*hive.fetch.task..*hive.groupby..*hive.hbase..*hive.index..*hive.index..*hive.intermediate..*hive.jdbc..*hive.join..*hive.limit..*hive.log..*hive.mapjoin..*hive.merge..*hive.optimize..*hive.materializedview..*hive.orc..*hive.outerjoin..*hive.parquet..*hive.ppd..*hive.prewarm..*hive.query.redaction..*hive.server2.thrift.resultset.default.fetch.sizehive.server2.proxy.userhive.skewjoin..*hive.smbjoin..*hive.stats..*hive.strict..*hive.tez..*hive.vectorized..*hive.query.reexecution..*reexec.overlay..*fs.defaultFSssl.client.truststore.locationdistcp.atomicdistcp.ignore.failuresdistcp.保留.statusdistcp.保留.rawxattrsdistcp.sync.foldersdistcp.delete.missing.sourcedistcp.keystore.resourcedistcp.liststatus.threadsdistcp.max.mapsdistcp.copy.strategydistcp.skip.crcdistcp.copy.overwritedistcp.copy.appenddistcp.map.bandwidth.mbdistcp.dynamic..*distcp.meta.folderdistcp.copy.listing.classdistcp.filters.classdistcp.options.skipcrccheckdistcp.options.mdistcp.options.numListstatusThreadsdistcp.options.mapredSslConfdistcp.options.bandwidthdistcp.options.overwritedistcp.options.strategydistcp.options.idistcp.options.p.*distcp.options.updatedistcp.options.deletemapred.map..*mapred.reduce..*mapred.output.compression.codecmapred.job.queue.namemapred.output.compression.typemapred.min.split.sizemapreduce.job.reduce.slowstart.completedmapsmapreduce.job.queuenamemapreduce.job.tagsmapreduce.input.fileinputformat.split.minsizemapreduce.map..*mapreduce.reduce..*mapreduce.output.fileoutputformat.compress.codecmapreduce.output.fileoutputformat.compress.typeoozie..*tez.am..*tez.task..*tez.runtime..*tez.queue.namehive.transpose.aggr.joinhive.exec.reducers.bytes.per.reducerhive.client.stats.countershive.exec.default.partition.namehive.exec.drop.ignorenonexistenthive.counters.group.namehive.default.fileformat.managedhive.enforce.bucketmapjoinhive.enforce.sortmergebucketmapjoinhive.cache.expr.evaluationhive.query.result.fileformathive.hashtable.loadfactorhive.hashtable.initialCapacityhive.ignore.mapjoin.hinthive.limit.row.max.sizehive.mapred.modehive.map.aggrhive.compute.query.using.statshive.exec.rowoffsethive.variable.substitutehive.variable.substitute.depthhive.autogen.columnalias.prefix.includefuncnamehive.autogen.columnalias.prefix.labelhive.exec.check.crossproductshive.cli.tez.session.asynchive.compathive.display.partition.cols.separatelyhive.error.on.empty.partitionhive.execution.enginehive.exec.copyfile.maxsizehive.exim.uri.scheme.whitelisthive.file.max.footerhive.insert.into.multilevel.dirshive.localize.resource.num.wait.attemptshive.multi.insert.move.tasks.share.dependencieshive.query.results.cache.enabledhive.query.results.cache.wait.for.pending.resultshive.support.quoted.identifiershive.resultset.use.unique.column.nameshive.analyze.stmt.collect.partlevel.statshive.exec.schema.evolutionhive.server2.logging.operation.levelhive.server2.thrift.resultset.serialize.in.taskshive.support.special.characters.tablenamehive.exec.job.debug.capture.stacktraceshive.exec.job.debug.timeouthive.llap.io.enabledhive.llap.io.use.fileid.pathhive.llap.daemon.service.hostshive.llap.execution.modehive.llap.auto.allow.uberhive.llap.auto.enforce.treehive.llap.auto.enforce.vectorizedhive.llap.auto.enforce.statshive.llap.auto.max.input.sizehive.llap.auto.max.output.sizehive.llap.skip.compile.udf.checkhive.llap.client.consistent.splitshive.llap.enable.grace.join.in.llaphive.llap.allow.permanent.fnshive.exec.max.created.fileshive.exec.reducers.maxhive.reorder.nway.joinshive.output.file.extensionhive.exec.show.job.failure.debug.infohive.exec.tasklog.debug.timeouthive.query.idhive.query.tag
hive.security.command.whitelist
升级前:set,reset,dfs,add,list,delete,reload,compile
升级后:set,reset,dfs,add,list,delete,reload,compile,llap
hive.server2.enable.doAs
升级前:(TRUE仅在不安全集群的情况下)
升级后:(FALSE在所有情况下)
通过关闭模拟仅影响不安全的集群。预计受影响的集群会出现权限问题。
hive.server2.idle.session.timeout
升级前:12 hours
升级后:24 hours
例外:如果旧的默认值被覆盖,则保留升级前的值;否则,使用新的默认值。
hive.server2.max.start.attempts
升级前:30
升级后:5
hive.server2.parallel.ops.in.session
升级前:TRUE
升级后:FALSE
Tez 限制需要禁用此属性;否则,在单个 JDBC 连接上并发提交的查询将失败或执行速度较慢。
hive.server2.support.dynamic.service.discovery
升级前:FALSE
升级后:TRUE
hive.server2.tez.initialize.default.sessions
升级前:FALSE
升级后:TRUE
hive.server2.thrift.max.worker.threads
升级前:100
升级后:500
例外:如果旧的默认值被覆盖,则保留升级前的值;否则,使用新的默认值。
hive.server2.thrift.resultset.max.fetch.size
升级前:1000
升级后:10000
hive.service.metrics.file.location
升级前:/var/log/hive/metrics-hiveserver2/metrics.log
升级后: /var/log/hive/metrics-hiveserver2-hiveontez/metrics.log
此位置更改是由于服务名称更改所致。
hive.stats.column.autogather
升级前:FALSE
升级后:TRUE
hive.stats.deserialization.factor
升级前:1
升级后:10
hive.support.special.characters.tablename
升级前:FALSE
升级后:TRUE
hive.tez.auto.reducer.parallelism
升级前:FALSE
升级后:TRUE
hive.tez.bucket.pruning
升级前:FALSE
升级后:TRUE
hive.tez.container.size
升级前: -1
升级后:4096
hive.tez.exec.print.summary
升级前:FALSE
升级后:TRUE
hive.txn.manager
升级前:org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager
升级后:org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
hive.vectorized.execution.mapjoin.minmax.enabled
升级前:FALSE
升级后:TRUE
hive.vectorized.execution.mapjoin.native.fast.hashtable.enabled
升级前:FALSE
升级后:TRUE
hive.vectorized.use.row.serde.deserialize
升级前:FALSE
升级后:TRUE
客户化关键的 Hive 配置
作为管理员,您需要属性配置指南。您需要知道升级后需要重新配置哪些属性。您必须了解从旧集群到新集群的升级过程。
CDP 升级过程会尝试保留您的 Hive 配置属性覆盖。这些覆盖是您为在旧 CDH 或 HDP 集群中配置 Hive 而设置的自定义值。升级过程并没有持之以恒的所有覆盖。例如,您设置的自定义值将 hive.exec.max.dynamic.partitions.pernode被保留。在其他属性的情况下,例如hive.cbo.enable,升级会忽略任何覆盖并仅设置 CDP 推荐值。
升级过程并没有保留覆盖下面的属性,你可能需要重新配置,以满足您的需求的配置值:
- hive.conf.hidden.list
- hive.conf.restricted.list
- hive.exec.post.hooks
- hive.script.operator.env.blacklist
- hive.security.authorization.sqlstd.confwhitelist
- hive.security.command.whitelist
Apache Hive Wiki 描述了这些属性。这些属性的值是列表。
升级过程会忽略旧列表并设置新的通用列表。例如,该 hive.security.command.whitelist值是您认为值得信赖并希望保留的安全命令列表。您在旧集群中设置的此列表的任何覆盖都不会保留。新的默认值可能比您在旧集群中使用的原始默认值更短(更严格)。您需要自定义此 CDP 以满足您的需求。
升级后检查并更改上面列出的每个属性,如下一主题中所述。
考虑重新配置比上面列出的六个属性值更多的属性值。即使您没有覆盖旧集群中的默认值,CDP 默认值也可能会以影响您工作的方式发生变化。
设置 Hive 配置覆盖
您需要知道如何配置升级过程不会从旧的 Hive 集群中保留的关键自定义。参考有关旧配置的记录,您按照步骤设置至少六个关键属性值。
按照设计,您需要自定义的六个关键属性在 Cloudera Manager 中是不可见的,您可以从Visible in CM列中看到Configurations Requirements and Recommendations。您使用安全阀将这些属性添加到 hive-site.xml,如本任务所示。
- 在Cloudera Manager > Clusters 中选择 Hive on Tez 服务。单击 Configuration,然后搜索 hive-site.xml。
- 在 hive-site.xml 的 Hive 服务高级配置片段(安全阀)中,单击 。
- 在名称中,添加hive.conf.hidden.list属性。
- 在值中,添加您的自定义列表。
- 自定义其他关键属性:hive.conf.restricted.list、 hive.exec.post.hooks、 hive.script.operator.env.blacklist、 hive.security.authorization.sqlstd.confwhitelist、 hive.security.command.whitelist。
- 保存更改并重新启动 Hive 服务。
- 查看配置要求和建议以了解保留或不保留哪些覆盖。
Hive 配置要求和建议
升级后需要设置某些 Hive 和 HiveServer (HS2) 配置属性。您可以查看针对您的需求设置CDP 私有云基础的建议,并了解哪些配置在升级后保持不变、哪些会影响性能以及默认值。
要求和建议
下表包括升级过程更改的 Hive 服务和 HiveServer 属性。其他属性值(未显示)不变地从 CDH 或 HDP 转移到 CDP
- Set After Upgrade列:升级到 CDP 后需要手动配置的属性。升级后不会保留预先存在的自定义值。
- 默认推荐列:升级过程更改为新值的属性,强烈建议您使用。
- Impacts Performance列:由您设置以调整性能的升级过程更改的属性。
- 安全值覆盖列:升级过程如何处理安全阀覆盖。
- 忽略:升级过程会从新的 CDP 配置中删除任何旧的 CDH 安全阀配置片段。
- 保留意味着升级过程将任何旧的 CDH 片段转移到新的 CDP 配置。
- 不适用意味着保留旧参数的值。
- 在 CM列中可见:升级后属性在 Cloudera Manager 中可见。
如果某个属性不可见,而您想要对其进行配置,请使用 Cloudera Manager 安全阀将参数安全地添加到正确的文件中,例如添加到集群范围的 hive-site.xml 文件中。
属性 | 升级后设置 | 默认推荐值 | 影响性能 | 新功能 | 安全阀覆盖 | Visible in CM |
---|---|---|---|---|---|---|
datanucleus.connectionPool.maxPoolSize | ✓ | 保留 | ||||
datanucleus.connectionPoolingType | ✓ | 忽略 | ||||
hive.async.log.enabled | 忽略 | ✓ | ||||
hive.auto.convert.join.noconditionaltask.size | 不适用 | ✓ | ||||
hive.auto.convert.sortmerge.join | 保留 | |||||
hive.auto.convert.sortmerge.join.to.mapjoin | 保留 | |||||
hive.cbo.enable | 忽略 | ✓ | ||||
hive.cbo.show.warnings | 忽略 | |||||
hive.compactor.worker.threads | ✓ | 忽略 | ✓ | |||
hive.compute.query.using.stats | ✓ | 忽略 | ✓ | |||
hive.conf.hidden.list | ✓ | 忽略 | ||||
hive.conf.restricted.list | ✓ | 忽略 | ||||
hive.default.fileformat.managed | 忽略 | ✓ | ||||
hive.default.rcfile.serde | ✓ | 保留 | ||||
hive.driver.parallel.compilation | 忽略 | ✓ | ||||
hive.exec.dynamic.partition.mode | 忽略 | |||||
hive.exec.max.dynamic.partitions | 保留 | |||||
hive.exec.max.dynamic.partitions.pernode | 保留 | |||||
hive.exec.post.hooks | ✓ | 忽略 | ||||
hive.exec.reducers.max | ✓ 或其他数字 | 不适用 | ✓ | |||
hive.execution.engine | 忽略 | |||||
hive.fetch.task.conversion | ✓ | 不适用 | ✓ | |||
hive.fetch.task.conversion.threshold | ✓ | 不适用 | ✓ | |||
hive.hashtable.key.count.adjustment | ✓ | 保留 | ||||
hive.limit.optimize.enable | ✓ | 忽略 | ||||
hive.limit.pushdown.memory.usage | ✓ | 不适用 | ✓ | |||
hive.mapjoin.hybridgrace.hashtable | ✓ | ✓ | 忽略 | |||
hive.mapred.reduce.tasks.speculative.execution | ✓ | 忽略 | ||||
hive.metastore.aggregate.stats.cache.enabled | ✓ | ✓ | 忽略 | |||
hive.metastore.disallow.incompatible.col.type.changes | 忽略 | |||||
hive.metastore.dml.events | 忽略 | ✓ | ||||
hive.metastore.event.message.factory | ✓ | 忽略 | ||||
hive.metastore.uri.selection | ✓ | 忽略 | ||||
hive.metastore.warehouse.dir | 保留 | ✓ | ||||
hive.optimize.metadataonly | ✓ | 忽略 | ||||
hive.optimize.point.lookup.min | 忽略 | |||||
hive.prewarm.numcontainers | 忽略 | |||||
hive.script.operator.env.blacklist | ✓ | 忽略 | ||||
hive.security.authorization.sqlstd.confwhitelist | ✓ | 忽略 | ||||
hive.security.command.whitelist | ✓ | 忽略 | ||||
hive.server2.enable.doAs | 忽略 | ✓ | ||||
hive.server2.idle.session.timeout | 不适用 | ✓ | ||||
hive.server2.max.start.attempts | 保留 | |||||
hive.server2.parallel.ops.in.session | 保留 | |||||
hive.server2.support.dynamic.service.discovery | ✓ | 忽略 | ✓ | |||
hive.server2.tez.initialize.default.sessions | ✓ | 忽略 | ||||
hive.server2.thrift.max.worker.threads | 不适用 | ✓ | ||||
hive.server2.thrift.resultset.max.fetch.size | 保留 | |||||
hive.service.metrics.file.location | 忽略 | ✓ | ||||
hive.stats.column.autogather | ✓ | 忽略 | ||||
hive.stats.deserialization.factor | ✓ | 忽略 | ||||
hive.support.special.characters.tablename | ✓ | 忽略 | ||||
hive.tez.auto.reducer.parallelism | ✓ | 忽略 | ✓ | |||
hive.tez.bucket.pruning | ✓ | 忽略 | ✓ | |||
hive.tez.container.size | ✓ | 忽略 | ✓ | |||
hive.tez.exec.print.summary | ✓ | 忽略 | ✓ | |||
hive.txn.manager | ✓ | 忽略 | ✓ | |||
hive.vectorized.execution.mapjoin.minmax.enabled | ✓ | 忽略 | ||||
hive.vectorized.execution.mapjoin.native.fast.hashtable.enabled | ✓ | 忽略 | ||||
hive.vectorized.use.row.serde.deserialize | ✓ | 忽略 |
使用 YARN 队列为 ETL 配置 HiveServer
作为管理员或数据工程师,您升级并希望运行 ETL 作业。您需要检查,如果没有找到,添加几个配置属性以允许将 Hive 工作负载放置在 Yarn 队列管理器上。
- 在 Cloudera Manager 中,单击集群> Hive >配置。
- 搜索hive-site.xml设置的Hive 服务高级配置片段(安全阀)。
- 在hive-site.xml设置的Hive 服务高级配置片段(安全阀)中,单击 。
- 在名称中输入属性 hive.server2.tez.initialize.default.sessions并在值中输入false。
- 在名称中输入属性 hive.server2.tez.queue.access.check并在值中输入 true。
- 在名称中输入属性 hive.server2.tez.sessions.custom.queue.allowed并在值中输入true。
移除Hive on Spark配置
您的脚本或查询包含不再受支持的 Hive on Spark 配置,您必须知道如何识别和删除这些配置。
在 CDP 中,没有 Hive-Spark 依赖项。Spark 站点和库不在类路径中。此执行引擎已被 Apache Tez 取代。
升级到 CDP 之前
CDH 支持 Hive on Spark 和以下配置以启用 Hive on Spark:set hive.execution.engine=spark
升级到 CDP 后
CDP 不支持 Hive on Spark。在 Spark 上启用 Hive 的脚本不起作用。
需要采取的行动
从您的脚本中删除set hive.execution.engine=spark。
配置对表的授权
虽然升级过程不会改变外部表的位置,但您需要在 HDFS 中设置对外部表的访问。如果选择推荐的 Ranger 安全模型进行授权,则需要设置策略并配置 Hive Metastore (HMS)。
使用以下方法之一设置对 HDFS 中外部表的访问。
- 在 Ranger 中设置 Hive HDFS 策略(推荐)以包含外部表数据的路径。
- 放置一个 HDFS ACL。将外部文本文件(例如逗号分隔值 (CSV) 文件)存储在 HDFS 中,该文件将用作外部表的数据源。
如果您想使用 Ranger 来授权对您的表的访问,除了设置 Ranger 策略之外,您还必须配置一些 HMS 属性以进行授权。如果没有配置 HMS,尝试使用 Spark SQL、Beeline 或 Hue 创建表会导致以下错误:
代码语言:javascript复制org.apache.hadoop.hive.ql.ddl.DDLTask. MetaException(message:No privilege 'Create' found for outputs { database:DATABASE_NAME, table:TABLE_NAME})
使 Ranger 的 Hive 插件可见
从 HDP 或 CDH 集群升级到 CDP 后,Hive Metastore 和 HiveServer 的 Hive 插件会出现在 Ranger Admin UI 中,除非存在升级导致的配置属性问题。您可以删除不正确的属性来解决问题。
如果 Hive 插件没有出现在 Ranger Admin UI 中,您需要使用安全阀从 hive-site.xml 中删除以下属性设置:
- hive.security.authorization.enabled
- hive.security.authorization.manager
- hive.security.metastore.authorization.manager
您还需要为 HMS API-Ranger 集成设置属性。
- 单击Clusters > Ranger > Ranger Admin Web UI > Audit > Plugin Status检查 Hive 插件是否可见。
hiveMetastore 和 hiveServer2 应用程序的 Hadoop SQL 服务类型应该会出现。如果是,请跳过下一步。你的配置没问题。
- 使用 Cloudera Manager 安全阀,为 HMS API-Ranger 集成设置以下属性和值:
- hive.metastore.pre.event.listeners
值:org.apache.hadoop.hive.ql.security.authorization.plugin.metastore.HiveMetaStoreAuthorizer
-
- hive.security.authenticator.manager
值:org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator
- 如果 Hive 和 Hive Metastore 的 Hadoop SQL 服务类型和相应应用程序未出现,请从 hive-site.xml 中删除上面列出的 Hive 和 Hive on Tez 服务的属性。
例如,在 Cloudera Manager 中,单击Clusters > Hive > Configurations,然后搜索每个属性。从hive-site.xml 的安全阀中删除属性名称和值。
设置访问控制列表
有关设置 HDFS ACLS 的几个信息源以及简要的 Ranger 概述和指向 Ranger 信息的指针,为您设置 Hive 授权做好准备。
在CDP Private Cloud Base 中,HDFS 支持 POSIX ACL(访问控制列表)来为用户和组分配权限。代替 Ranger 策略,您可以使用 HDFS ACL 检查并在 HDFS 权限更改中进行任何必要的更改。有关更多信息,请参阅 HDFS ACL、Apache Software Foundation HDFS 权限指南和 HDFS ACL 权限。
在 Ranger 中,您可以根据您的用例为多个组和用户授予特定权限。您将权限应用于目录树,而不是处理单个文件。有关更多信息,请参阅授权 Apache Hive 访问。
如果可能,您应该通过 HDFS ACL 使用 Ranger 策略来控制 HDFS 访问。通过 Ranger 控制 HDFS 访问提供了一个统一的界面,用于理解和管理您的整体治理框架和策略设计。如果您需要模拟 Hive 和 Impala 表的旧 Sentry HDFS ACL 同步行为,请考虑使用 Ranger RMS。
配置加密区域的安全
在某些情况下,您作为管理员需要执行与安全相关的任务,以允许用户访问存储在加密区域中的表。您将了解如何防止对这些表的访问问题。
在某些情况下,Hive on Tez 无法对存储在加密区域中的表运行某些查询。当 Hadoop 密钥管理服务器 (KMS) 连接是 SSL 加密的时,请执行以下过程。
- 执行以下任一操作:
- 将自签名 SSL 证书安装到所有主机上的 cacerts 文件中,然后跳过以下步骤。
- 建议:执行以下步骤。
- 将 ssl-client.xml 复制到所有主机上都可用的目录。
- 在 Cloudera Manager 中,单击集群> Hive on Tez>配置。集群 > Hive on Tez> 配置。
- 搜索hive-site.xml设置的Hive 服务高级配置片段(安全阀)。
- 在hive-site.xml设置的Hive 服务高级配置片段(安全阀)中,单击 。
- 在名称中输入属性tez.aux.uris并在值中输入 path-to-ssl-client.xml。
将 HWC/Spark Direct Reader 用于 Spark 应用程序/ETL
您需要对 Hive Warehouse Connector (HWC) 以及如何查找更多信息有所了解,因为要从 Spark 访问 Hive,您需要隐式或显式使用 HWC。
HWC 是与 Spark 应用程序一起启动的 Spark 库/插件。将 Spark Direct Reader 和 HWC 用于 ETL。
Hive 仓库连接器旨在从 Spark 访问托管的 ACID v2 Hive 表。Apache Ranger 和 HiveWarehouseConnector 库提供对数据的行列细粒度访问。HWC 支持 spark-submit 和 pyspark。不支持 spark thrift 服务器。
配置 HiveServer HTTP 模式
如果您使用 Knox,您可能需要更改 HTTP 模式配置。如果您在CDP 私有云基础上安装了 Knox,并且想用 Knox 代理 HiveServer,您需要更改默认的 HiveServer 传输模式(hive.server2.transport.mode)。
- 单击Cloudera Manager >集群> HIVE_ON_TEZ >配置
- 在搜索中,键入transport。
- 在 HiveServer2 传输模式中,选择 http。
- 在 Tez 上保存并重新启动 Hive。
配置 HMS 以实现高可用性
要在主实例出现故障时提供到辅助 Hive Metastore 的故障转移,您需要知道如何在 Cloudera Manager 中添加 Metastore 角色并配置属性。
多个 HMS 实例以主动/主动模式运行。不发生负载平衡。HMS 客户端总是到达第一个实例,除非它关闭。在这种情况下,客户端会扫描hive.metastore.uris列出 HMS 实例的属性以查找替换 HMS。如果hive.metastore.uri.selection设置为 SEQUENTIAL(推荐和默认),则第二个 HMS 是指定替换 ;否则,如果hive.metastore.uri.selection设置为 RANDOM,则从列表中随机选择替换 。
最低要求角色: 配置者(也由集群管理员、完全管理员提供)
- 在 Cloudera Manager 中,单击集群> Hive >配置。
- 采取以下措施之一:
- 如果您有一个由 Kerberos 保护的集群,请搜索 Hive Delegation Token Store
- ,它指定 Kerberos 令牌的存储,如下所述。
- 如果您有一个不安全的集群,请跳过下一步。
- 选择org.apache.hadoop.hive.thrift.DBTokenStore,然后保存更改。
Kerberos 委托令牌的存储由 hive.cluster.delegation.token.store.class属性定义。可用的选择是 Zookeeper、Metastore 和内存。Cloudera 建议通过设置 org.apache.hadoop.hive.thrift.DBTokenStore 属性来使用数据库。
- 单击实例>操作>添加角色实例
- 在分配角色中,在 Metastore 服务器中,单击选择主机。
- 在 Hosts Selected 中,滚动并选择要用作备份 Metastore 的主机,然后单击 OK。
- 单击继续,直到退出向导。
- 从“操作”菜单启动主机上的 Metastore 角色。
该hive.metastore.uris属性会自动更新。
- 要检查或更改hive.metastore.uri.selection 属性,请转到Clusters > Hive > Configurations,然后搜索 Hive Service Advanced Configuration Snippet (Safety Valve) for hive-site.xml。
- 添加属性和值(SEQUENTIAL 或 RANDOM)。
修正统计数据
从 Hive 1 或 Hive 2 升级到 Hive 3 可能会导致统计信息丢失。在 Hive 3 中,当基于成本的优化器 (CBO) 检测到这些缺失的统计数据时,可能会导致数据集被忽略。作为数据工程师,您需要在升级后修复这些统计信息。
- 运行 DESCRIBE FORMATTED <table>,并检查 numrows的值。
如果值为 0,则必须修复统计信息。
- 对表和列运行 ANALYZE 以修复统计信息。
ANALYZE TABLE credit_card_01.cc_acct COMPUTE STATISTICS[FOR COLUMNS];
不支持的接口和功能
您需要了解 CDP 不再支持的 HDP 或 CDH 平台中可用的接口。您可能使用过的某些功能也不受支持。
不支持的接口
- Druid
- Hcat CLI
- Hive CLI(由 Beeline 替换)
- HiveView
- LLAP(仅在 CDP 公共云中可用)
- MapReduce 执行引擎(替换为 Tez)
- Pig
- S3 用于存储表(仅在 CDP 公共云中可用)
- Spark 执行引擎(由 Tez 替代)
- Spark Thrift server
Spark 和 Hive 表使用 Hive 仓库连接器进行互操作。
- SQL 标准授权
- 基于存储的授权 (SBA)
- Tez视图
- WebHCat
您可以使用 Hue 代替 Hive View。
基于存储的授权
CDP 不再支持基于存储的授权 (SBA)。Ranger 与 Hive Metastore 的集成提供了在 HiveServer (HS2) 中启用的 Ranger 授权的一致性。SBA 没有为没有关联文件/目录的元数据提供授权支持。基于 Ranger 的授权没有这样的限制。
不支持的功能
CDP 不支持 HDP 和 CDH 平台中可用的以下功能:
- 指定托管表位置的 CREATE TABLE
不要使用 LOCATION 子句来创建托管表。Hive 将仓库中的默认位置分配给托管表。该默认位置是使用在 Hive 中配置的 hive.metastore.warehouse.dir 配置属性,但可以通过设置 CREATE DATABASE MANAGEDLOCATION 参数为数据库覆盖。
- CREATE INDEX 和相关的索引命令在 Hive 3 中被删除,因此在 CDP 中不受支持。
在 CDP 中,您使用 Hive 3 默认的 ORC 列式文件格式来实现索引的性能优势。具有自动查询重写功能的物化视图也提高了性能。迁移到 CDP 的索引会被保留,但会使用不可删除的索引呈现任何 Hive 表。要删除索引,请搜索 CDPD-23041 的已知问题。
- CDH 中的 Hive Metastore (HMS) 高可用性 (HA) 负载平衡
您需要按照文档中的说明设置 HMS HA。
不支持的连接器使用
CDP 不支持使用Teradata文档的Hadoop jar命令(Java API)的 Sqoop 导出。
CDH Hive 表的更改
作为数据科学家、架构师、分析师或其他 Hive 用户,您需要在升级后找到并使用 Apache Hive 3 表。您还需要了解升级过程中发生的变化。CDH 到 CDP 升级后现有表的位置不会改变。将 CDH 升级到CDP 私有云基础会将 Hive 托管表转换为 Hive 3 中的外部表。
升级过程将托管表转换为外部表时,会将表属性设置 external.table.purge为 true。该表相当于旧 CDH 集群中已将purge设置为 true 的托管表。
升级前在/user/hive/warehouse 中HDFS 上的托管表在 转换为外部后仍保留在那里。升级前位于外部的表不会重新定位。您需要设置 HDFS 策略以访问 Ranger 中的外部表,或设置 HDFS ACL。
升级过程将hive.metastore.warehouse.dir属性设置为 /warehouse/tablespace/managed/hive,将其指定为托管表的 Hive 仓库位置。您在 CDP 中创建的新托管表存储在 Hive 仓库中。新的外部表存储在 Hive 外部仓库中 /warehouse/tablespace/external/hive。
要更改 Hive 仓库的位置,请导航到以下第一步中的以下菜单项之一。
- Hive > Action Menu > Create Hive Warehouse Directory
- Hive > Action Menu > Create Hive Warehouse External Directory
- 从 Cloudera Manager Actions 为 Hive 仓库目录和 Hive 仓库外部目录设置目录。
- 在 Cloudera Manager 中,单击Clusters > Hive(Hive Metastore 服务)> Configuration,并将 hive.metastore.warehouse.dir 属性值更改为您为新 Hive 仓库目录指定的路径。
- 将 hive.metastore.warehouse.external.dir 属性值更改为您为 Hive 仓库外部目录指定的路径。
- 配置 Ranger 策略或设置 ACL 权限以访问目录。
对 HDP Hive 表的更改
作为数据科学家、架构师、分析师或其他 Hive 用户,您需要在升级后找到并使用 Apache Hive 3 表。您还需要了解升级过程中发生的变化。
不归hive用户所有的托管 ACID 表在升级后仍为托管表,但hive成为所有者。
升级后,Hive 表的格式与升级前相同。例如,原生或非原生表分别保持原生或非原生。
升级后,在以下任何一种情况下,托管表或分区的位置不会发生变化:
- 旧表或分区目录/apps/hive/warehouse在升级前不在其默认位置 。
- 旧表或分区与新仓库目录位于不同的文件系统中。
- 旧表或分区目录与新仓库目录位于不同的加密区域。
否则,从 HDP 到 CDP 的升级过程会将托管文件移动到 Hive 仓库 /warehouse/tablespace/managed/hive。升级过程将外部文件传送到 CDP,位置不变。默认情况下,Hive 会将您创建的任何新外部表放置在/warehouse/tablespace/external/hive. 升级过程将hive.metastore.warehouse.dir属性设置为此位置,将其指定为 Hive 仓库位置。
修改表的引用使用点表示法
升级到 CDP 包括 Hive-16907 错误修复,它拒绝 SQL 查询中的 `db.table`。表名中不允许使用点 (.)。要在表名中引用数据库和表,两者都必须用反引号括起来,如下所示:`db`.`table`.
对 ACID 属性的更改
CDP Private Cloud Base 中的Hive 3.x支持事务和非事务表。事务表具有原子性、一致性、隔离性和持久性 (ACID) 属性。在 Hive 2.x 中,ACID 事务处理的初始版本是 ACID v1。在 Hive 3.x 中,ACID 的成熟版本是 ACID v2,这是CDP Private Cloud Base 中的默认表类型。
原生和非原生的存储格式
存储格式是表类型升级更改的一个因素。Hive 2.x 和 3.x 支持以下原生和非原生存储格式:
- 原生:在 Hive 中具有内置支持的表,例如以下文件格式的表:
- 文本
- 序列文件
- RC文件
- AVRO 文件
- ORC
- Parquet文件
- 非原生:使用存储处理程序的表,例如 DruidStorageHandler 或 HBaseStorageHandler
CDP 升级对 HDP 表类型的更改
下表比较了从 HDP 2.x 升级之前和升级到 CDP 之后的 Hive 表类型和 ACID 操作。Hive 表文件的所有权是决定升级后表类型和 ACID 操作的一个因素。
表 1. HDP 2.x 和 CDP 表类型比较
HDP 2.x | CDP | ||||
---|---|---|---|---|---|
表类型 | ACID v1 | 格式 | Hive 表文件的所有者(用户) | 表类型 | ACID v2 |
外部表 | 不 | 原生或非原生 | Hive或非Hive | 外部表 | 不 |
受管表 | 是的 | ORC | Hive或非Hive | 托管表,可更新 | 是 |
受管表 | 不 | ORC | Hive | 托管表,可更新 | 是 |
非Hive | 外部表,带数据删除 | 不 | |||
受管表 | 不 | 原生(但非 ORC) | Hive | 托管表,仅插入 | 是 |
非Hive | 外部表,带数据删除 | 不 | |||
受管表 | 不 | 非原生 | Hive或非Hive | 外部表,带数据删除 | 不 |
原文链接:https://docs.cloudera.com/cdp-private-cloud-upgrade/latest/data-migration/topics/cdp-data-migration-hive-overview.html