文档章节

hive环境搭建Specified key was too long

 张欢19933
发布于 2017/03/20 20:12
字数 1018
阅读 104
收藏 0

错误

2017-03-20 17:43:55,108 ERROR [main]: DataNucleus.Datastore (Log4JLogger.java:error(115)) - Error thrown executing CREATE TABLE `SD_PARAMS`
(
    `SD_ID` BIGINT NOT NULL,
    `PARAM_KEY` VARCHAR(256) BINARY NOT NULL,
    `PARAM_VALUE` VARCHAR(4000) BINARY NULL,
    CONSTRAINT `SD_PARAMS_PK` PRIMARY KEY (`SD_ID`,`PARAM_KEY`)
) ENGINE=INNODB : Specified key was too long; max key length is 767 bytes
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
	at com.mysql.jdbc.Util.getInstance(Util.java:383)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1062)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4208)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4140)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2597)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2758)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2820)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2769)
	at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:907)
	at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:791)
	at com.jolbox.bonecp.StatementHandle.execute(StatementHandle.java:254)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:760)
	at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:711)
	at org.datanucleus.store.rdbms.table.AbstractTable.create(AbstractTable.java:425)
	at org.datanucleus.store.rdbms.table.AbstractTable.exists(AbstractTable.java:488)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:3380)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:3190)
	at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2841)
	at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:122)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:1605)
	at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:954)
	at org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:679)
	at org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:408)
	at org.datanucleus.store.rdbms.query.JDOQLQuery.compileQueryFull(JDOQLQuery.java:947)
	at org.datanucleus.store.rdbms.query.JDOQLQuery.compileInternal(JDOQLQuery.java:370)
	at org.datanucleus.store.query.Query.executeQuery(Query.java:1744)
	at org.datanucleus.store.query.Query.executeWithArray(Query.java:1672)
	at org.datanucleus.store.query.Query.execute(Query.java:1654)
	at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:221)
	at org.apache.hadoop.hive.metastore.MetaStoreDirectSql.ensureDbInit(MetaStoreDirectSql.java:184)
	at org.apache.hadoop.hive.metastore.MetaStoreDirectSql.<init>(MetaStoreDirectSql.java:137)
	at org.apache.hadoop.hive.metastore.ObjectStore.initialize(ObjectStore.java:295)
	at org.apache.hadoop.hive.metastore.ObjectStore.setConf(ObjectStore.java:258)
	at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:76)
	at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:136)
	at org.apache.hadoop.hive.metastore.RawStoreProxy.<init>(RawStoreProxy.java:57)
	at org.apache.hadoop.hive.metastore.RawStoreProxy.getProxy(RawStoreProxy.java:66)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.newRawStore(HiveMetaStore.java:593)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMetaStore.java:571)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.java:620)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.java:461)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:66)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:72)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:5756)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:5751)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:5984)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:5909)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

原因

数据库编码问题

解决办法

修改数据库编码

执行以下命令: alter database hive character set latin1;

额外问题1

更改后执行建库建表语句没问题,执行load data和 alter table tablename add partition (logdate='20151107') location '/cmslogs/20151107/46_log/' 语句,依旧报错。

An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes

改变mysql设置,不能改变已经存在的表。你需要转换表的编码。

更改表编码:
MariaDB [hive]> alter table PARTITIONS convert to character set latin1;
Query OK, 0 rows affected (0.01 sec)              
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hive]> alter table PARTITION_KEYS convert to character set latin1;
Query OK, 1 row affected (0.00 sec)               
Records: 1  Duplicates: 0  Warnings: 0

再次在hive命令行执行
hive> alter table originallogs add partition (logdate='20151107') location '/cmslogs/20151107/46_log/';
OK
Time taken: 0.249 seconds
已经解决。 
由此得出两个结论: 1,改变数据库编码,不会改变已经存在的表的编码。
2,如果先建库,然后改变数据库编码,然后再启动hive元数据服务,是否能让表的编码变成latin1?

验证: 
1,停止hive的元数据进程。 
[careland@master bin]$ ps -ef |grep hive;
careland 17600 17025  0 09:46 pts/2    00:00:00 grep --color=auto hive
careland 22999     1  0 11月18 ?      00:00:56 /home/careland/hadoop/jdk1.7.0_79/bin/java -Xmx256m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/home/careland/hadoop/hadoop-2.6.0/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/home/careland/hadoop/hadoop-2.6.0 -Dhadoop.id.str=careland -Dhadoop.root.logger=INFO,console -Djava.library.path=/home/careland/hadoop/hadoop-2.6.0/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xmx512m -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.util.RunJar /home/careland/hadoop/apache-hive-1.2.1-bin//lib/hive-service-1.2.1.jar org.apache.hadoop.hive.metastore.HiveMetaStore
[careland@master bin]$ kill -9 22999

2,删除mysql上的hive元数据库。 
MariaDB [hive]> drop database hive;
Query OK, 30 rows affected (0.03 sec)

3,在mysql上建立hive元数据。 
MariaDB [(none)]> create database hive;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use hive;
Database changed
MariaDB [hive]> show tables;
Empty set (0.01 sec)
4,改变该库的编码 。
MariaDB [hive]> alter database hive character set latin1;
Query OK, 1 row affected (0.01 sec)
5,启动hive元数据服务。

[careland@master bin]$ pwd
/home/careland/hadoop/apache-hive-1.2.1-bin/bin
[careland@master bin]$ nohup ./hive --service metastore &
[1] 17690
[careland@master bin]$ nohup: 忽略输入并把输出追加到"nohup.out"

[careland@master bin]$

6,查看mysql中的hive元数据表的编码。
MariaDB [hive]> use hive;
Database changed
MariaDB [hive]> show tables;
MariaDB [hive]> show create table PARTITIONS;

已经改为latin1编码 。

验证结论2正确。

综述: hive命令出现Specified key was too long; max key length is 767 bytes 错误。是由于元数据的编码导致。
需要更改元数据库编码。如果元数据库中已经有了数据,不能删除。那么就更改对应的表的编码。如果元数据库为空。那么就删除元数据库。再重新建立数据库,并更改编码,然后再让hive来建表。

额外问题2

在hive中,show tables,create 等命令能正常执行,删除表drop table x时,会出现卡住的现象 也是编码问题造成的。

本文转载自:http://blog.csdn.net/zlx510tsde/article/details/49923651

粉丝 47
博文 533
码字总数 244932
作品 0
海淀
私信 提问
Centos7安装hive

所需软件及下载地址1、mysql或mariadbmysql下载地址https://dev.mysql.com/downloads/mysql/5.5.html#downloads或用mariadb也可以,直接yum安装yum -y install mariadb-server2、hivehttp://......

天涯有梦
2017/12/11
0
0
hive中show table Specified key was too long

当在hive中show table 时如果报以下错时 FAILED: Error in metadata: javax.jdo.JDODataStoreException: Error(s) were found while auto-creating/validating the datastore for classes. ......

cookqq
2014/01/04
83
0
HIVE启动失败错误汇总

1.hiveserver2启动后,beeline不能连接的涉及的问题: 原因:权限问题解决: /history (如果配置了jobserver 那么/history也需要调整)这三个目录,hive在运行时要读取写入目录里的内容,所以...

o0无忧亦无怖
2015/10/08
171
0
【解决】Hive 使用 mysql 作为 metastore 元数据库时UTF-8编码的问题

在最最初配置 MySQL 数据库的时候,就设置成 UTF-8 的编码 2. 然后在 metastore 库生成后,如果直接用 hive 创建库或表就会报错,Specified key was too long; max key length is 767 bytes...

自东土大唐而来
2018/01/16
120
0
CDH5.11.2安装启动hive 启动失败解决办法

1,通过Cloudera Manager添加Hive服务,在启动Hive的时候遇到错误: .org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver 这种情况,猜测是缺少jdbc驱动,于是添加j...

小黑放大
2018/05/25
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
10
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
6
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部