Hive version: 3.1.2
System: macOS Mojave 10.14.4
Run on Hadoop 2.10.0
安装准备
Java 8
https://www.jianshu.com/p/6289bd0bb69c
Hadoop 2.10.0
https://blog.csdn.net/adorechen/article/details/104589268
初始化
cp $HIVE_HOME/conf/hive-env.sh.template $HIVE_HOME/conf/hive-env.sh
vim $HIVE_HOME/conf/hive-env.sh
修改$HADOOP_HOME=你的hadoop安装路径
In addition, you must use below HDFS commands to create /tmp
and /user/hive/warehouse
(aka hive.metastore.warehouse.dir
) and set them chmod g+w
before you can create a table in Hive.
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
Running Hive CLI
To use the Hive command line interface (CLI) from the shell:
$ $HIVE_HOME/bin/hive
启动hive cli 后执行语句 select version(); 测试下, 发现报错:
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
查看hive日志位置,然后查看日志得到错误信息。
find /private -name "hive.log" 2>/dev/null
Self-test query [select "DB_ID" from "DBS"] failed; direct SQL is disabled
javax.jdo.JDODataStoreException: Error executing SQL query "select "DB_ID" from "DBS"".
metastore 没有初始化。停止hive命令,运行下面的命令初始化metastore数据库,默认使用嵌入式数据库derby。
$HIVE_HOME/bin/schematool -dbType derby -initSchema
再次测试 “select version();" 得到结果:
select version();
OK
3.1.2 r8190d2be7b7165effa62bd21b7d60ef81fb0e4af
Time taken: 1.966 seconds, Fetched: 1 row(s)
至此Hive本地可以执行命令了。
运行HiveServer2 & Beeline
HiveServer2
Hive内置了HiveServer和HiveServer2服务,两者都允许客户端使用多种编程语言进行连接,但是HiveServer不能处理多个客户端的并发请求,所以产生了HiveServer2。
HiveServer2(HS2)允许远程客户端可以使用各种编程语言向Hive提交请求并检索结果,支持多客户端并发访问和身份验证。HS2是由多个服务组成的单个进程,其包括基于Thrift的Hive服务(TCP或HTTP)和用于Web UI的Jetty Web服务器。
HiveServer2拥有自己的CLI(Beeline),Beeline是一个基于SQLLine的JDBC客户端。由于HiveServer2是Hive开发维护的重点(Hive0.15后就不再支持hiveserver),所以Hive CLI已经不推荐使用了,官方更加推荐使用Beeline。
$HIVE_HOME/bin/hiveserver2
使用beeline客户端连接服务器:
$HIVE_HOME/bin/beeline -u jdbc:hive2://localhost:10000
得到的错误信息如下:
Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: adore.chen is not allowed to impersonate anonymous (state=08S01,code=0)
错误在于user adore.chen 不允许使用anonymous访问hadoop。hadoop proxy user 细节参考:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/Superusers.html
解决办法:在$HADOOP_HOME/etc/hadoop/core-site.xml configuration中加入
<property>
<name>hadoop.proxyuser.adore.chen.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.adore.chen.users</name>
<value>*</value>
</property>
还是不能解决上面的错误信息。原因在于我的用户名"adore.chen"里有“."和配置里的分隔符"."一致,所以它不认识。
使用root用户来启动hiveserver2
sudo $HIVE_HOME/bin/hiveserver2
修改proxyuser代理配置: $HADOOP_HOME/etc/hadoop/core-site.xml
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.users</name>
<value>*</value>
</property>
设置HADOOP_USER_NAME
vim ~/.bash_profile
export HADOOP_USER_NAME=root
查看启动日志,一切正常。使用beeline连接,终于成功了。
beeline -u jdbc:hive2://localhost:10000
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive-3.1.2/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-2.10.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Connecting to jdbc:hive2://localhost:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.2 by Apache Hive
0: jdbc:hive2://localhost:10000>
总结:启动hiveServer2时自己的用户名一定不能带有点号。
使用hive-default.xml.template时碰到的问题
cp $HIVE_HOME/conf/hive-default.xml.template $HIVE_HOME/conf/hive-site.xml
然后抛出下面异常:
com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
at [row,col,system-id]: [3215,96,"file:/opt/hive-3.1.2/conf/hive-site.xml"]
at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:621)
at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:491)
解决方案:
3215行: Exclusive locks fortransactional tables.
 改字符串系统不能识别,删除。
异常:
${systemjava.io.tmpdir%7D$%7Bsystemuser.name%7D
替换下面的字段
<name>hive.exec.local.scratchdir</name>
<value>${system:java.io.tmpdir}/${system:user.name}</value>
<name>hive.downloaded.resources.dir</name>
<value>${system:java.io.tmpdir}/${hive.session.id}_resources</value>
<name>hive.querylog.location</name>
<value>${system:java.io.tmpdir}/${system:user.name}</value>
<name>hive.server2.logging.operation.log.location</name>
<value>${system:java.io.tmpdir}/${system:user.name}/operation_logs</value>
<name>hive.exec.local.scratchdir</name>
<value>/opt/hive-3.1.2/tmp/adore.chen</value>
<name>hive.downloaded.resources.dir</name>
<value>/opt/hive-3.1.2/tmp/${hive.session.id}_resources</value>
<name>hive.querylog.location</name>
<value>/opt/hive-3.1.2/tmp/adore.chen</value>
<name>hive.server2.logging.operation.log.location</name>
<value>/opt/hive-3.1.2/tmp/adore.chen/operation_logs</value>
参考文章: