Hive 的编译
Hive用Java开发的,编译可以通过Maven来编译。 编译过程如下:
mvn clean package -Pdist -DskipTests 这里的dist是Profile的名字。如果从apache下载的hive,那么这么写问题不大。如果是从cloudera下载的源码,就要写成-Phadoop-2。 如果是在没有外网的情况下编译,则需要建有内部repo。 如果要使用内部repo,则需要修改.m2/settings.xml文件。* central-mirror http://10.129.40.91:8081/artifactory/all central-cache
编译结束之后要做几件事:
-
创建hive-site.xml,只要保证以下和metastore相关的元素在,hive就能正常工作 。
javax.jdo.option.ConnectionDriverName org.apache.derby.jdbc.EmbeddedDriver Driver class name for a JDBC metastore javax.jdo.option.ConnectionURL jdbc:derby:;databaseName=metastore_db;create=true javax.jdo.option.ConnectionUserName APP Username to use against metastore database javax.jdo.option.ConnectionPassword mine password to use against metastore database hive.exec.compress.output false 对应的hadoop core-site.xml也要做相应的调整,否则无法使用hadoop用户去访问数据。
hadoop.proxyuser.hadoop.groups hadoop Allow the superuser oozie to impersonate any members of the group group1 and group2 hadoop.proxyuser.hadoop.hosts * The superuser can connect only from host1 and host2 to impersonate a user -
接下来要初始化metastore。用schematool就可以,就是创建一些表。指定数据库类型,和操作类型 。
-
最后就是启动hadoop服务,让hive能够读写hdfs
和终端有关的一些问题
在测试验证hive对中文表名支持的过程中,遇到一个问题,就是通过终端输入的中文,不是utf-8编码。这个问题通常是使用 locale来解决 ,但是具体如何使用,还是有点技巧的 。
#首先查看有哪些locale$ locale -aCen_AGen_AG.utf8...POSIX#如果你需要的不在列表中例如 ,zh_CN.UTF-8,那么就要生成它 。$sudo locale-gen zh_CN.UTF-8Generating locales... zh_CN.UTF-8... doneGeneration complete.The following file contains a list of all available locales: /usr/share/i18n/SUPPORTED #还可以将你需要的locale设为默认值#方法一: 修改/etc/default/locale $ cat /etc/default/locale LANG=zh_CN.UTF-8#方法二:运行下列命令# update-locale LANG=zh_CN.UTF-8
全部设置好之后,通过putty连上。Putty这端,注意采用utf-8字符集去连接即可。
如何让Hive支持中文表名?
对于Hive而言,目前仅支持英文表名,但是这并不代表它不能够使用中文表名,从开发的角度来说,中文和英文,并没有本质上的区别。
对于Hive SQL来说,表名,字段名统一称为Identifier,而Identifier到底能不能用英文名,只是一个习惯问题,而不是一个技术问题。
基于以上背景,实际上就应该知道,让Hive SQL支持中文表名,字段名,并不是什么大不了的事情。
跟踪Hive执行SQL代码的流程,能够比较清楚的看到,首先Hive会在CreateTable环节,检查表名是否规范。如果不规范,就直接拒绝了。
其次,就算通过了建表,在执行sql代码前,还有一个词法和语法分析的环节。在这里,Hive仍然会检查中文的表名、字段名是否符合词法分析的的规则。
把这两个环节打通,那么中文表名、字段名、视图名就不在话下了。
#file: metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java#修改 validateName函数 //String allowedCharacters = "\\w_"; String allowedCharacters = "\\x{4e00}-\\x{9fa5}\\w_";#file: ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g#增加这么一段// LITERALSfragmentCNChar :'\u4E00'..'\u9FA5' | '\uF900'..'\uFA2D' ;
重新编译,打包。然后将打包好的lib文件中的hive*.jar覆盖原来的jar,就完成了对中文表名、视图名、字段名的支持。就这么简单。
如果觉得我的文章对您有帮助,欢迎打赏!