Hive安装过程中初始化matestore时字段编码问题:
背景,
因为mysql的配置文件中/etc/my.cnf中设置了默认的编码为utf8,而在该MySQL中创建hive元数据库时,如果不指定默认是使用latin1 ,所以在初始化Hive的matestore之后,会报错:
FAILED: Error in metadata: 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:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:842)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:681)
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)
且因为该MySQL中已经有正在使用的数据库,即已经有其他的业务在使用该MySQL中的其他的库,也就是无法修改mysql的配置文件,否则mysql中的所有库都将会被修改,从而影响其他的业务。因此只能试图修改hive单个库的编码格式。
解决方法;
重新在Mysql中建一个Hive的库create database hive_tmp,
注意创建库之后先不要同步数据库,因为一旦同步数据库之后,Hive库中将会有数据,此时将无法修改Hive库的编码了。因此在创建Hive库之后,首先修改hive库的编码为latin1 :
alter database hive default character setlatin1;
之后在同步数据库,便可以解决该问题,