Hive 的编译
Hive用Java开发的,编译可以通过Maven来编译。 编译过程如下:
mvn clean package -Pdist -DskipTests
这里的dist是Profile的名字。如果从apache下载的hive,那么这么写问题不大。如果是从cloudera下载的源码,就要写成-Phadoop-2。
如果是在没有外网的情况下编译,则需要建有内部repo。
如果要使用内部repo,则需要修改.m2/settings.xml文件。
<mirrors>
<mirror>
<mirrorOf>*</mirrorOf>
<name>central-mirror</name>
<url>http://10.129.40.91:8081/artifactory/all</url>
<id>central-cache</id>
</mirror>
</mirrors>
编译结束之后要做几件事:
-
创建hive-site.xml,只要保证以下和metastore相关的元素在,hive就能正常工作 。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> <description/> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>APP</value> <description>Username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>mine</value> <description>password to use against metastore database</description> </property> <property> <name>hive.exec.compress.output</name> <value>false</value> <description/> </property> </configuration>
对应的hadoop core-site.xml也要做相应的调整,否则无法使用hadoop用户去访问数据。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>hadoop</value> <description>Allow the superuser oozie to impersonate any members of the group group1 and group2</description> </property> <property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> <description>The superuser can connect only from host1 and host2 to impersonate a user</description> </property>
-
接下来要初始化metastore。用schematool就可以,就是创建一些表。指定数据库类型,和操作类型 。
-
最后就是启动hadoop服务,让hive能够读写hdfs
和终端有关的一些问题
在测试验证hive对中文表名支持的过程中,遇到一个问题,就是通过终端输入的中文,不是utf-8编码。这个问题通常是使用 locale来解决 ,但是具体如何使用,还是有点技巧的 。
#首先查看有哪些locale
$ locale -a
C
en_AG
en_AG.utf8
...
POSIX
#如果你需要的不在列表中例如 ,zh_CN.UTF-8,那么就要生成它 。
$sudo locale-gen zh_CN.UTF-8
Generating locales...
zh_CN.UTF-8... done
Generation 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
#增加这么一段
// LITERALS
fragment
CNChar
:'\u4E00'..'\u9FA5' | '\uF900'..'\uFA2D'
;
重新编译,打包。然后将打包好的lib文件中的hive*.jar覆盖原来的jar,就完成了对中文表名、视图名、字段名的支持。就这么简单。
如果觉得我的文章对您有帮助,欢迎打赏!