HIVE 第八章 schema

本文深入探讨了 Hive 数据仓库的优化策略,包括分区设计、唯一键和规范化、多数据源操作优化、每张表分区考量、桶化表数据存储、新增列到表以及压缩策略等关键点。通过案例分析,阐述了如何通过合理设计和实施这些策略来提升数据处理效率和性能。

 

 

schema设计

hive pattern && hive anti-pattern

 

1.Table by day 按照天分割数据,在relation中,这个参数不推荐,在hive中使用

create table supply(id int,part string,quantity int) partitioned by (int day)

alter table supply add partition (day=20120102)

partition的负面影响:

1.namenode limition

但是partition产生的子目录,子文件都会保存在hdfs中,namenode会存在内存中,所以这得负面效果是namenode的filesystem的容量上限(hadoop has this upper limit on the total number of file,mapr and amazon s3 don't have this limitation)

2.一个job分解成几个task,每个task是一个jvm实例,每一个file对应一个独立的task,每个task是jvm中独立的一个实例(进程),过多的实例会给jvm压力(start up and tear down),这使得计算速度降低

因此不能有太多partition,每个文件要尽可能的大

一个好的table by day的设计,是设计出相似大小的数据在不同的时间间断,时间间断可以适当增大。同时保证每个file大于filesystem block size。目的是让partition足够的大。另一种方法,是用多维度的partition分解数据。

 

2.unique keys and normalization 主键,格式化数据

关系数据库最爱用地策略,但是在hive中没有这种概念。因为hive可以存储denormalized data非格式化的数据,如array,map,struct。这样可以避免one-to-many的关联关系,加快了io速度。但是也pay the penalty of denormalization,比如数据复制,数据不一致的概率

 

3.making multiple passes over the same data 同数据源的操作优化

insert overwrite table sales

select * from history where action='purchased';

insert overwrite table credits

select * from history where action='returned';

 

from history

insert overwrite sales select * where action='purchased'

insert overwrite credits select * where action = 'returned'

 

 

4.the case for partitioning every table

为了避免job fail而使得数据被删除,在insert数据的时候可以使用table pardae table1 partition(day=20120102).但是需要删除这个中间换转者partition

 

5.bucketing table data storage

当table没有明显的partition特征时,或是减轻filesystem的负担,可以使用bucketing,他的优点是不会随着增加数据使得文件个数变动,而且对于取样sample是很容易的,对于一些joins操作也比较便利。

create table weblog(user_id int,url string,source_ip string) partition by (dt string) clustered by (user_id) into 96 buckets;

为了生成正确个数的reducer对应hash出得bucket

在查询的时候设置 set hive.enforce.bucketing=true;

from raw_logs或是设置reduce数直接等于bucket数set mapred.reduce.tasks=96

insert overwrite table weblog partition(dt='2009-02-25') select user_id,url,source_ip where dt='2009-02-25'

 

6.adding colums to a table

hive是没有格式化的数据仓库,随着数据需求可以增加一列,数据少于期待列数,则填补null,数据多于,则舍弃。

create table weblogs(version long,url string) partitioned by (hit_data int) row format delimited fields terminated by '\t'

加载数据,可以用int补上缺少的数据

load data local inpath 'log1.txt' int weblogs partition(20110101)

 

7.(almost)always use compression

 

 

<think>我们正在解决HiveMetastore初始化失败的问题,错误信息是"SchemainitializationFAILED!Metastorestatewouldbeinconsistent!!Underlyingcause:java.io.IOException:Schemascriptfailed,errorcode2"。根据引用[2]的解释,该错误通常发生在已经初始化过Metastore的情况下,当我们更改了Hive或元数据库(例如MySQL)的配置后,再次尝试初始化时出现。错误代码2通常表示脚本执行失败。解决方案思路:1.检查是否已经初始化过:如果之前已经初始化过,那么不应该再次运行初始化命令。错误提示表明当前状态已经存在,重复初始化会导致不一致。2.检查配置变更:如果更改了配置,特别是元数据库的连接信息,可能需要修复配置或清理旧的状态。3.检查初始化脚本执行的详细错误:通常初始化脚本会输出更详细的错误信息,我们可以查看日志来确定具体原因。具体步骤:步骤1:确认Metastore是否已经初始化查看Hive的元数据库(如果是使用MySQL,检查MySQL中是否已存在Hive的元数据库,比如名为`hive`的数据库)或者Derby数据库(如果使用Derby,查看是否有`metastore_db`目录存在)。如果存在,说明已经初始化过。步骤2:检查Hive配置文件检查Hive的配置文件(hive-site.xml)中关于元数据库的连接配置是否正确,包括:-javax.jdo.option.ConnectionURL-javax.jdo.option.ConnectionDriverName-javax.jdo.option.ConnectionUserName-javax.jdo.option.ConnectionPassword步骤3:检查错误日志查看初始化时生成的日志文件(通常在/tmp/<用户名>/hive.log或$HIVE_HOME/logs目录下),寻找具体的错误原因。步骤4:解决初始化失败的问题根据引用[2]的建议,如果是因为重复初始化,则不需要再次初始化。如果是因为配置更改导致无法连接元数据库,那么需要修复配置。如果修复配置后仍然无法工作,可能需要将旧的元数据库清除,然后重新初始化。注意:重新初始化会丢失之前的元数据(如表结构等),所以生产环境请谨慎。在开发环境中,可以尝试以下步骤:a.停止Hive服务和Metastore服务。b.清除元数据库(如果是MySQL,则删除对应的数据库;如果是Derby,删除metastore_db目录以及derby.log文件)。c.重新运行初始化命令:`schematool-dbType<type>-initSchema`,其中`<type>`是你的数据库类型,如mysql或derby。步骤5:重新初始化执行初始化命令,例如:```bashschematool-dbTypemysql-initSchema```如果初始化成功,则可以启动Hive。步骤6:如果步骤4中重新初始化仍然失败,则根据日志具体错误进行处理。常见问题包括:-数据库驱动包未放置到$HIVE_HOME/lib目录下(对于MySQL,需要将MySQL的JDBC驱动jar包复制到该目录)。-数据库连接配置错误(比如用户名密码错误、数据库地址错误)。-数据库服务未启动。下面将按照上述步骤详细说明:###1.检查是否已经初始化查看MySQL中是否有Hive的元数据库(假设配置的数据库名是hive):```sqlSHOWDATABASESLIKE'hive';```或者检查Derby的`metastore_db`目录是否存在。如果存在,则不需要初始化。如果配置有变更,应当直接启动Metastore服务。###2.检查配置查看hive-site.xml中元数据库的配置是否正确。特别留意ConnectionURL中的主机地址、端口、数据库名称是否正确。###3.查看日志日志文件的位置通常由配置文件中的`hive.log.dir`和`hive.log.file`设置。默认在/tmp/<用户名>/目录下,或者$HIVE_HOME/logs。使用以下命令查看日志:```bashtail-n100$HIVE_HOME/logs/hive.log```###4.清除旧元数据并重新初始化(开发环境)如果确定要重新初始化:-对于Derby:```bashrm-rfmetastore_dbrmderby.log```-对于MySQL:登录MySQL后执行:```sqlDROPDATABASEIFEXISTShive;CREATEDATABASEhiveCHARACTERSETlatin1;--注意:Hive默认使用latin1字符集,但也可以根据需求修改为utf8```注意:删除数据库会丢失所有元数据。然后运行初始化:```bashschematool-dbTypemysql-initSchema```###5.常见错误处理**错误:数据库驱动类未找到(ClassNotFoundException)**解决方案:将JDBC驱动包(如mysql-connector-java-5.1.49.jar)复制到$HIVE_HOME/lib目录。**错误:数据库连接失败(如Accessdenied)**解决方案:检查用户名密码,以及远程访问权限(如果使用远程MySQL)。在MySQL中确保用户有权限访问该数据库。**错误:初始化脚本语法错误(例如MySQL版本问题)**解决方案:使用更高版本的连接驱动,或者调整Hive的初始化脚本(但一般不推荐)。根据引用[1][2]和实际经验,该错误通常是由于重复初始化或配置错误导致。重点在于确认配置和清理旧状态。下面是一个示例的重新初始化流程(以MySQL为例):1.停止Hive服务和Metastore服务(如果有运行)。2.在MySQL中删除并重建元数据库。3.确保hive-site.xml中的数据库连接信息正确。4.确保$HIVE_HOME/lib目录中有正确的MySQLJDBC驱动。5.运行初始化命令。如果上述步骤不能解决,请根据具体错误日志进行分析。§§相关问题§§1.如何检查HiveMetastore是否正常运行?2.Hive使用MySQL作为元数据库时如何设置权限?3.如何修改Hive元数据库的字符集?4.Hive初始化脚本失败errorcode2以外的错误代码代表什么?</think> ### 解决Hive Metastore Schema初始化FAILED问题(errorcode 2) #### 📌 核心原因分析 当出现`Schema initialization FAILED! Metastore state would be inconsistent`和`errorcode 2`时,**根本原因是Hive Metastore检测到元数据库已存在冲突数据**[^2],通常发生于: 1. **重复初始化**:已有元数据结构的情况下再次运行`schematoo init` 2. **配置变更**:修改`hive-site.xml`中的数据库连接参数后未清理旧元数据 3. **元数据残留**:MySQL/Derby中有残留表结构或数据 #### 🔧 解决步骤(按优先级排序) ##### ✅ 第一步:清理Metastore残留数据 ```bash # 停止所有Hive服务 hive --service metastore stop hive --service hiveserver2 stop # 删除MySQL中的元数据库(示例) mysql -u root -p -e "DROP DATABASE IF EXISTS hive_metastore; CREATE DATABASE hive_metastore;" # 或删除Derby元数据(默认位置) rm -rf $HIVE_HOME/metastore_db/ rm -rf /tmp/derby.log ``` ##### ✅ 第二步:强制重建元数据 ```bash # 使用-force参数强制执行初始化 schematool -dbType mysql -initSchema -verbose -force # 如使用Derby schematool -dbType derby -initSchema -force ``` ##### ✅ 第三步:检查关键配置(hive-site.xml) ```xml <!-- 确保连接参数与实际数据库一致 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> ``` ##### ✅ 第四步:验证初始化结果 ```bash # 检查初始化日志 tail -n 100 /tmp/hive/hive.log # 验证元数据表是否生成 mysql -u root -p -e "USE hive_metastore; SHOW TABLES;" ``` #### ⚠️ 特殊场景处理 **当数据库版本不兼容时:** ```bash # 升级元数据结构到当前Hive版本 schematool -dbType mysql -upgradeSchema ``` #### 📊 错误处理速查表 | 错误现象 | 解决方案 | |--------------------------|----------------------------------| | `Table 'XXX' already exists` | 执行`-force`强制重建元数据 | | `Access denied for user` | 检查MySQL权限及hive-site.xml配置 | | `Unknown database` | 添加`?createDatabaseIfNotExist=true`参数 | | 驱动类找不到 | 将JDBC驱动放入`$HIVE_HOME/lib`目录 | #### 🚨 操作须知 1. **生产环境**:操作前备份元数据库,避免数据丢失 ```sql mysqldump -u root -p hive_metastore > metastore_backup.sql ``` 2. **权限问题**:确保MySQL用户有`CREATE/DROP`权限 3. **文件锁残留**:检查并删除`metastore_db/dbex.lck` 通过以上步骤,99%的Schema初始化错误可解决。如仍报错,需检查`/tmp/hive.log`中的**详细堆栈信息**,通常包含JDBC操作的具体失败语句[^1]。 ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值