hive执行命令Specified key was too long; max key length is 767 bytes 问题

原创 2015年11月19日 10:04:42
在进入Hive后可以show databases; 但create table, show tables;等命令都报错,如下:
[ihadoop@Master ~]$ cd /home/ihadoop/hadoop/hive-0.11.0
[ihadoop@Master hive-0.11.0]$ bin/hive

Logging initialized using configuration in file:/home/ihadoop/hadoop/hive-0.11.0/conf/hive-log4j.properties
Hive history file=/tmp/ihadoop/hive_job_log_ihadoop_5723@Master.Hadoop_201306251428_1159551556.txt
hive> show tables;
FAILED: Error in metadata: MetaException(message:Got exception: org.apache.hadoop.hive.metastore.api.MetaException javax.jdo.JDODataStoreException: An exception was thrown while adding/validating class(es) : 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:525)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.Util.getInstance(Util.java:386)......................................

通过网上查找,发现是数据库字符集问题。只要修改MySQL中Hive元数据库MetaStore的字符集便可。
alter database dbname character set latin1;

===========================================================================================
更改后执行建库建表语句没问题,执行load data和 alter table tablename add partition (logdate='20151107') location '/cmslogs/20151107/46_log/' 语句,依旧报错。
Specified key was too long; max key length is 767 bytes。

搜索问题找到如下帖子:

Changing the MySQL settings does not change existing tables. You may
need to convert them:

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

进入mysql。查看hive的元数据表。 
show create table PARTITIONS; 发现还是utf8编码。



更改表编码:
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,删除mysql上的hive元数据库。 
MariaDB [hive]> drop database hive;
Query OK, 30 rows affected (0.03 sec)
2,停止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

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来建表。 

更改表的编码方式:
1, ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Hive 创建表提示"Specified key was too long; max key length is 767 bytes"解决办法

Hive> CREATE TABLE dummy(value STRING); FAILED: Execution Error, return code 1 from org.apache.hado...
  • KelJony
  • KelJony
  • 2015年02月01日 15:40
  • 7498

Hive创建表时报错,Specified key was too long; max key length is 767 bytes

Hive创建表时报错,Specified key was too long; max key length is 767 bytes
  • u012965373
  • u012965373
  • 2016年05月10日 11:32
  • 1823

hive执行命令Specified key was too long; max key length is 767 bytes 问题

在进入Hive后可以show databases; 但create table, show tables;等命令都报错,如下: [ihadoop@Master ~]$ cd /home/ihadoo...
  • zlx510tsde
  • zlx510tsde
  • 2015年11月19日 10:04
  • 2449

MySQL-001-specified key was too long ; max key length is 767 bytes

我们先分析下这是个什么问题:指定的键太长了,键的最大长度是767字节。这是我在往MySQL里跑数据库脚本的时候遇到的!这是我从服务器上down下来的,服务器就是用的MySQL,为什么本地不行呢?所以脚...
  • geshicuowu
  • geshicuowu
  • 2016年09月21日 16:56
  • 664

hive中Specified key was too long; max key length is 767 bytes问题解决

当hive安装完成后,在hive中执行show table等任何命令,都会报以下错: [grid@racdb ~]$ hive Logging initialized using configura...
  • lichangzai
  • lichangzai
  • 2015年10月18日 19:30
  • 1448

MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

Hive和HBase整合
  • wind520
  • wind520
  • 2014年10月08日 11:11
  • 9754

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
  • shaochenshuo
  • shaochenshuo
  • 2016年04月05日 17:30
  • 6842

关于Django出现Specified key was too long; max key length is 767 bytes的解决办法

最近在开发Django网站,但是当我从腾讯蓝鲸上面将代码签到本地运行的时候,系统提示运行python manage.py migrate来进行数据库的同步,但是运行时一直出现OperationalEr...
  • IT_DREAM_ER
  • IT_DREAM_ER
  • 2016年08月16日 16:29
  • 4102

我从utf8改成utf8mb4 就报Specified key was too long; max key length is 767 bytes

我从utf8改成utf8mb4 就报Specified key was too long; max key length is 767 bytesCHARSET必须是utf8mb4啊?...
  • huaweitman
  • huaweitman
  • 2017年03月09日 15:10
  • 499

MySQL:Specified key was too long; max key length is 767 bytes

下面的SQL语句 CREATE TABLE subscription ( subscriptionid varchar(767) NOT NULL PRIMARY KEY, params blob, ...
  • gaotong2055
  • gaotong2055
  • 2013年11月19日 15:50
  • 8817
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hive执行命令Specified key was too long; max key length is 767 bytes 问题
举报原因:
原因补充:

(最多只允许输入30个字)