Skip to content

Instantly share code, notes, and snippets.

@ericzhong
Last active December 3, 2017 12:38
Show Gist options
  • Save ericzhong/f8f6bac44608bb9ab9e9cf56902d7d8b to your computer and use it in GitHub Desktop.
Save ericzhong/f8f6bac44608bb9ab9e9cf56902d7d8b to your computer and use it in GitHub Desktop.
Hive 安装与使用

关于

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

Derby 后端

修改 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

MySQL 后端

安装依赖:

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 的两种连接方式

beeline -u jdbc:hive2:// 在同一个进程中打开 HiveServer2 和 Beeline,仅用于测试。

正常情况下,应该先启动服务 hiveserver2,然后再连接 beeline -u jdbc:hive2://localhost:10000

Beeline 交互命令

$ 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

WebUI

端口 10002

Troubleshooting

Error: FUNCTION 'NUCLEUS_ASCII' already exists.

如果是用 derby,就删除 metastore_db,再重新执行 schematool -dbType derby -initSchema

SLF4J: Class path contains multiple SLF4J bindings.

启动 hiveserver2 时报错,因为 hadoop 里面有 slf4j,hive 里面的重复了,移除 hive 中的即可。

cd lib/
mv log4j-slf4j-impl-2.6.2.jar log4j-slf4j-impl-2.6.2.jar.bak

Failed to start database 'metastore_db' with class loader

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

User: hdfs is not allowed to impersonate root (state=08S01,code=0)

修改配置如下,表示用指定用户执行操作,而不是当前用户:

    <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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment