Skip to content

Commit e865f98

Browse files
committed
Update format
1 parent b2cd99f commit e865f98

3 files changed

Lines changed: 22 additions & 21 deletions

File tree

source/_posts/2013-09-06-hive-deleteme-error.markdown

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ tag: [hive]
88
published: true
99
---
1010

11-
在每天运行的Hive脚本中,偶尔会抛出以下错误:
11+
在每天运行的 Hive 脚本中,偶尔会抛出以下错误:
1212

1313
```
1414
2013-09-03 01:39:00,973 ERROR parse.SemanticAnalyzer (SemanticAnalyzer.java:getMetaData(1128)) - org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table dw_xxx_xxx
@@ -21,47 +21,48 @@ com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1
2121
...
2222
```
2323

24-
查阅了网上的资料,是DataNucleus的问题
24+
查阅了网上的资料,是 DataNucleus 的问题
2525

26-
背景1:我们知道MySQL中的库表信息是存放在information_schema库中的,Hive也有类似的机制,它会将库表信息存放在一个第三方的RDBMS中,目前我们线上配置的是本机MySQL,即:
26+
## 问题背景
27+
背景1:我们知道 MySQL 中的库表信息是存放在 `information_schema` 库中的,Hive 也有类似的机制,它会将库表信息存放在一个第三方的 RDBMS 中,目前我们线上配置的是本机 MySQL,即:
2728

29+
```bash
2830
$ mysql -uhive -ppassword hive
31+
```
2932

30-
![1.png](/images/hive-deleteme-error/1.png)
31-
33+
![使用 DBS 表存放元数据](/images/hive-deleteme-error/dbs.png)
3234

3335
<!--more-->
3436

35-
背景2:Hive使用的是DataNuclues ORM库来操作数据库的,而基本上所有的ORM框架(对象关系映射)都会提供自动建表的功能,即开发者只需编写Java对象,ORM会自动生成DDL。DataNuclues也有这一功能,而且它在初始化时会通过生成临时表的方式来获取数据库的Catalog和Schema,也就是 DELETEME表
37+
背景2:Hive 使用的是 DataNuclues ORM 库来操作数据库的,而基本上所有的 ORM 框架(对象关系映射)都会提供自动建表的功能,即开发者只需编写 Java 对象,ORM 会自动生成 DDL。DataNuclues 也有这一功能,而且它在初始化时会通过生成临时表的方式来获取数据库的 Catalog 和 Schema,也就是 `DELETEME`
3638

37-
![2.png](/images/hive-deleteme-error/2.png)
39+
![通过 DELETEME 表获取数据库信息](/images/hive-deleteme-error/deleteme.png)
3840

41+
这样就有一个问题:在并发量大的情况下,`DELETEME` 表名中的毫秒数可能相同,那在 `pt.drop(conn)` 的时候就会产生找不到表的报错。
3942

40-
这样就有一个问题:在并发量大的情况下,DELETEME表名中的毫秒数可能相同,那在pt.drop(conn)的时候就会产生找不到表的报错。
43+
## 解决办法
44+
解决办法已经可以在代码中看到了:将 `datanucleus.fixedDataStore` 选项置为 `true`,即告知 DataNuclues 该数据库的表结构是既定的,不允许执行 DDL 操作。
4145

42-
解决办法已经可以在代码中看到了:将datanucleus.fixedDataStore选项置为true,即告知DataNuclues该数据库的表结构是既定的,不允许执行DDL操作。
46+
这样配置会有什么问题?让我们回忆一下 Hive 的安装步骤:
4347

44-
这样配置会有什么问题?让我们回忆一下Hive的安装步骤:
48+
1. 解压 hive-xyz.tar.gz
49+
2. 在 conf/hive-site.xml 中配置 Hadoop 以及用于存放库表信息的第三方数据库
50+
3. 执行 `bin/hive -e` 即可使用。DataNucleus 会按需创建上述的 `DBS` 等表
4551

46-
1. 解压hive-xyz.tar.gz;
47-
2. 在conf/hive-site.xml中配置Hadoop以及用于存放库表信息的第三方数据库;
48-
3. 执行bin/hive -e "..."即可使用。DataNucleus会按需创建上述的DBS等表。
52+
这对新手来说很有用,因为不需要手动去执行建表语句,但对生产环境来说,普通帐号是没有 DDL 权限的,我们公司建表也都是提 DB-RT 给 DBA 操作。同理,线上 Hive 数据库也应该采用手工创建的方式,导入 scripts/metastore/upgrade/mysql/hive-schema-0.9.0.mysql.sql 文件即可。这样一来,就可以放心地配置 `datanucleus.fixedDataStore` 以及 `datanecleus.autoCreateSchema` 两个选项了。
4953

50-
这对新手来说很有用,因为不需要手动去执行建表语句,但对生产环境来说,普通帐号是没有DDL权限的,我们公司建表也都是提DB-RT给DBA操作。同理,线上Hive数据库也应该采用手工创建的方式,导入scripts/metastore/upgrade/mysql/hive-schema-0.9.0.mysql.sql文件即可。这样一来,就可以放心地配置datanucleus.fixedDataStore以及 datanecleus.autoCreateSchema两个选项了。
51-
52-
这里我们也明确了一个问题:设置datanucleus.fixedDataStore=true不会影响Hive建库建表,因为Hive中的库表只是DBS、TBLS表中的一条记录而已。
54+
这里我们也明确了一个问题:设置 `datanucleus.fixedDataStore=true` 不会影响 Hive 建库建表,因为 Hive 中的库表只是 `DBS``TBLS` 表中的一条记录而已。
5355

5456
建议的操作:
5557

56-
1. 在线上导入hive-schema-0.9.0.mysql.sql,将尚未创建的表创建好(比如我们没有用过Hive的权限管理,所以DataNucleus没有自动创建DB_PRIVS表);
57-
2. 在hive-site.xml中配置 datanucleus.fixedDataStore=truedatanecleus.autoCreateSchema=false
58+
1. 在线上导入 hive-schema-0.9.0.mysql.sql,将尚未创建的表创建好(比如我们没有用过 Hive 的权限管理,所以 DataNucleus 没有自动创建 `DB_PRIVS` 表)
59+
2. 在 hive-site.xml 中配置 `datanucleus.fixedDataStore=true``datanecleus.autoCreateSchema=false`
5860

5961
这样就可以彻底解决这个异常了。
6062

61-
为什么HWI没有遇到类似问题?因为它是常驻内存的,DELETEME表只会在启动的时候创建,后续的查询不会创建。而我们这里每次调用hive命令行都会去创建,所以才有这样的问题。
62-
63-
参考链接:
63+
为什么 HWI(Hive Web Interface) 没有遇到类似问题?因为它是常驻内存的,`DELETEME` 表只会在启动的时候创建,后续的查询不会创建。而我们这里每次调用 `hive` 命令行都会去创建,所以才有这样的问题。
6464

65+
## 参考链接
6566
* http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608633.html
6667
* https://github.com/dianping/cosmos-hive/issues/10
6768
* https://issues.apache.org/jira/browse/HIVE-1841
File renamed without changes.

0 commit comments

Comments
 (0)