Hive 是在 Hadoop 上增加的一层,可以将 SQL 翻译成 MapReduce 去 Hadoop 上执行,这样就可以很方便的使用 SQL 来完成一些工作,而不必写 MapReduce 程序。
Hive 默认将元数据保存在本地的 Derby 数据库中,不支持多连接。也可以指定其它数据库,比如 MySQL。
CentOS 7.3
hadoop-3.0.0-beta1
wget http://mirror.vorboss.net/apache/hive/hive-2.3.0/apache-hive-2.3.0-bin.tar.gz
tar xvf apache-hive-2.3.0-bin.tar.gz
cd apache-hive-2.3.0-bin/
启动 HDFS 和 YARN 服务(过程略),然后:
hdfs dfs -mkdir /tmp
hdfs dfs -mkdir warehouse
hdfs dfs -chmod g+w /tmp
hdfs dfs -chmod g+w warehouse
准备 conf/
下的配置文件:
cp hive-default.xml.template hive-site.xml
cp hive-env.sh.template hive-env.sh
修改 conf/hive-env.sh
,然后用 source
加载:
export HIVE_HOME=/home/hdfs/apache-hive-2.3.0-bin # your path
export PATH=$HIVE_HOME/bin:$PATH
export HADOOP_HOME=/home/hdfs/hadoop-3.0.0-beta1 # your path
export PATH=$HADOOP_HOME/bin:$PATH
export HIVE_CONF_DIR=/home/hdfs/apache-hive-2.3.0-bin/conf # your path
export HIVE_AUX_JARS_PATH=/home/hdfs/apache-hive-2.3.0-bin/lib # your path
修改 hive-site.xml
:
<name>hive.metastore.warehouse.dir</name>
<value>/user/hdfs/warehouse</value> <!-- your username -->
<!-- 下面的不用改,是重要且相关的默认配置 -->
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
<name>hive.server2.authentication</name>
<value>NONE</value>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
<!-- end -->
然后:
schematool -dbType derby -initSchema # 生成 ./metastore_db/
beeline -u jdbc:hive2:// # 生成 ./derby.log
安装依赖:
yum install mysql-connector-java
cp /usr/share/java/mysql-connector-java.jar $HIVE_HOME/lib
修改 hive-site.xml
:
<!-- 放在所有配置的前面 -->
<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>
<!-- end -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<name>hive.server2.enable.doAs</name>
<value>false</value>
<!-- 初始化SQL脚本的版本是否必须与系统的版本一致 -->
<name>hive.metastore.schema.verification</name>
<value>false</value>
然后:
schematool -dbType mysql -initSchema # MySQL 将新建数据库 metastore
beeline -u jdbc:hive2://
用 SET
命令可以设置或查看 Hive 和 Hadoop 的配置变量。
beeline> SET -v; # 查看所有
beeline> SET mapreduce.framework.name; # 查看变量
beeline> SET mapreduce.framework.name=xxx; # 设置变量
mysql> select * from metastore.TBLS;
beeline -u jdbc:hive2://
在同一个进程中打开 HiveServer2 和 Beeline,仅用于测试。
正常情况下,应该先启动服务 hiveserver2
,然后再连接 beeline -u jdbc:hive2://localhost:10000
。
$ beeline
beeline> !connect jdbc:hive2://127.0.0.1:10000 # 提示输入用户名密码
beeline> !connect jdbc:hive2://localhost:10000 root 123456
beeline> show tables;
如果使用 Derby,日志默认为 ./derby.log
。
如果使用 MySQL,日志默认为 /tmp/<USERNAME>/hive.log
,相关配置 hive.exec.scratchdir
。
端口 10002
如果是用 derby
,就删除 metastore_db
,再重新执行 schematool -dbType derby -initSchema
。
启动 hiveserver2
时报错,因为 hadoop 里面有 slf4j
,hive 里面的重复了,移除 hive 中的即可。
cd lib/
mv log4j-slf4j-impl-2.6.2.jar log4j-slf4j-impl-2.6.2.jar.bak
beeline -u jdbc:hive2://
在本地同时启动服务端和客户端,如果之前已经启动了 hiveserver2
,就会报这个错误。
java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$ %7Bsystem:user.name%7D
在 hive-site.xml
中增加:
<!-- 放在所有配置的前面 -->
<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>
<!-- end -->
METASTORE_FILTER_HOOK will be ignored, since hive.security.authorization.manager is set to instance of HiveAuthorizerFactory
修改配置如下,表示用指定用户执行操作,而不是当前用户:
<name>hive.server2.enable.doAs</name>
<value>false</value>
<description>
Setting this property to true will have HiveServer2 execute
Hive operations as the user making the calls to it.
</description>