赞
踩
Hive 官网地址:https://hive.apache.org/
下载地址:http://www.apache.org/dyn/closer.cgi/hive/
把安装文件apache-hive-3.1.2-bin.tar.gz上传到master节点的/opt/software目
录下,执行以下命令把安装文件解压到/opt/app目录中
- cd /export/software
- tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /export/server
进入/opt/app目录,为目录apache-hive-3.1.2-bin建立软件链接
即输入hive就相当于输入apache-hive-3.1.2-bin,方便以后的shell命令
- cd /export/server
- ln -s apache-hive-3.1.2-bin hive
用vi命令编辑/etc/profile文件,添加环境变量
- #HIVE_HOME
- export HIVE_HOME=/export/server/apache-hive-3.1.2-bin
- export PATH=$PATH:$HIVE_HOME/bin
运行source命令,让修改后的配置文件生效
source /etc/profile
解决日志jar包冲突:改名称
mv -T $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
初始化元数据库
schematool -dbType derby -initSchema
报以下错误
Exception in thread "main" java.lang.NoSuchMethodError:
com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
原因是hadoop和hive的两个guava.jar版本不一致,两个jar位置分别位于下面两个目录:
- /export/server/hive/lib/guava-19.0.jar
- /export/server/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar
解决办法:
删除低版本的那个,将高版本的复制到低版本目录下。
- cd /export/server/hive/lib
- rm -f guava-19.0.jar
- cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /export/server/hive/lib
再次运行schematool -dbType derby -initSchema,即可成功初始化元数据库。
在命令窗口中输入以下命令启动hive:
hive
如果发生下面的报错
hive启动时报Exception in thread "main" java.lang.RuntimeException: java.net.ConnectExcepti on: Call From hadoop101/192.168.2.101 to hadoop101:9820 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
额,你忘了启动hadoop集群了,hive的运行是基于hadoop集群的
exit;
Hive的日志存放在“/tmp/登录用户名”目录下,以root用户登录,则存放在/tmp/root目录下。
默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用, 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。内置的derby主要问题是并发性能很差,可以理解为单线程操作。
rpm -qa|grep mariadb
如果查找到内容则要卸载mariadb,没有查找到内容则可以开始安装mysql。
rpm -e --nodeps mariadb-libs
注意一行一行的执行命令
- cd /export/software/mysql
- yum install -y numactl libaio net-tools
- rpm -ivh mysql-community-common-8.0.19-1.el7.x86_64.rpm
- rpm -ivh mysql-community-libs-8.0.19-1.el7.x86_64.rpm
- rpm -ivh mysql-community-client-8.0.19-1.el7.x86_64.rpm
- rpm -ivh mysql-community-server-8.0.19-1.el7.x86_64.rpm
输入以命令运行MySQL
- systemctl start mysqld.service # 启动MySQL
- systemctl enable mysqld.service # 开机自启动
查找MySQL的默认密码
grep 'temporary password' /var/log/mysqld.log
用查找到的密码登录mysql
mysql -uroot -p'%:D%oc#1r:u.'
mysql登录成功后,执行以下命令修改root用户的登录密码为"%:D%oc#1r:u.",
让密码永不过期,
user 表中的 root 用户允许任意 ip 连接。
- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Big_data20';
- ALTER USER 'root'@'localhost' IDENTIFIED BY 'Big_data20' PASSWORD EXPIRE NEVER;
- update mysql.user set host='%' where user='root';
- flush privileges;
为了让 Hive 能够连接到 MySQL 数据库,需要下载 MySQL JDBC 驱动程序。可以到MySQL 官网(
http://www.mysql.com/downloads/connector/j)下载mysql_connector-java-8.0.23.tar.gz。
从下载好的压缩包中解压出mysql-connector-java-8.0.23.jar,复制到/exprot/server/hive/lib 目录中。
- cd /export/server/mysql
- cp mysql-connector-java-8.0.23.jar /export/server/hive/lib
vi $HIVE_HOME/conf/hive-site.xml
添加如下内容
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- jdbc 连接的 URL --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node7:3306/metastore?createDatabaseIfNotExist=true&useUnicode=true&characte rEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8</value> </property> <!-- jdbc 连接的 Driver--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <!-- jdbc 连接的 username--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <!-- jdbc 连接的 password --> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>Big_data20</value> </property> <!-- Hive 元数据存储版本的验证 --> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> <!--元数据存储授权--> <property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property> <!-- Hive 默认在 HDFS 的工作目录 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration>
mysql -uroot -p'Big_data20'
解决中文乱码的问题,在/etc/my.cnf的末尾添加发下代码:
- character-set-server = utf8
- collation-server = utf8_general_ci
- init_connect='SET NAMES utf8'
-
- [client]
- default-character-set=utf8
若metastore数据库已创建,需要执行发下命令,若未创建可以忽略:
- alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
- alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
- alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
- alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
- alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
先登入mysql,后然创建Hive元数据库
- create database metastore;
- quit;
schematool -initSchema -dbType mysql -verbose
hive
在Hive命令行窗口中输入以下命令
- create table test (name string);
- insert into test values('john');
- select * from test;
注意:insert语句执行会很慢,时间可能会有几十秒,这是正常的
在HDFS上查看创建的表
内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。数据库和Metastore服务都嵌入在主Hive Server进程中。这个是默认的,配置简单,但是一次只能有一个进程可以连接到数据库,适用于用来实验,不适用于生产环境。解压hive安装包 bin/hive 启动即可使用
缺点:不同路径启动hive,每一个hive拥有一套自己的元数据,无法共享。
本地模式采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server。本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。也就是说当你启动一个hive 服务,里面默认会帮我们启动一个metastore服务。hive根据hive.metastore.uris 参数值来判断,如果为空,则为本地模式。本地模式下hive的配置主需要指定mysql的相关信息。
缺点:每启动一次hive服务,都内置启动了一个metastore。
远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程模式的metastore服务和hive运行在不同的进程里。在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。远程模式下,需要配置hive.metastore.uris 参数来指定metastore服务运行的机器ip和端口,并且需要单独手动启动metastore服务。
- <!-- 指定存储元数据要连接的地址 -->
- <property>
- <name>hive.metastore.uris</name>
- <value>thrift://node7:9083</value>
- </property>
前台启动:
hive --service metastore
注意: 该启动方式下,进程会一直占用shell终端前台。如果ctrl+c结束进程,则hive metastore服务也会同时关闭。
后台启动:
nohup hive --service metastore &
后台启动的情况下,如果想关闭metastore服务,使用jps查看进程,kill -9 进程号即可。
前台启动需要打开一个新命令行窗口,后台启动不需要打开一个新的命令行窗口。用hive命令启动hive。
- <!-- 指定存储元数据要连接的地址 -->
- <!-- 指定 hiveserver2 连接的 host -->
- <property>
- <name>hive.server2.thrift.bind.host</name>
- <value>node7</value>
- </property>
-
- <!-- 指定 hiveserver2 连接的端口号 -->
- <property>
- <name>hive.server2.thrift.port</name>
- <value>10000</value>
- </property>
nohup hive --service metastore &
nohup hive --service hiveserver2 &
beeline -u 'jdbc:hive2://node7:10000' -n root
若出现以下错误
User: root is not allowed to impersonate root (state=08S01,code=0)
在/export/server/hadoop-3.1.4/etc/hadoop/core-site.xml 中添加如下部分,重启服务即可:
- <property>
- <name>hadoop.proxyuser.root.hosts</name>
- <value>*</value>
- </property>
- <property>
- <name>hadoop.proxyuser.root.groups</name>
- <value>*</value>
- </property>
重启hadoop、metastore服务、hiveserver2服务,再次启动beeline 客户端就可以连接成功了。
以上的方式启动、停止hive比较麻烦,下面编写一个Hive启动/停止脚本hive_script.sh,用于自动启停hive。
- cd /export/server/hive/bin
- vim hive-script.sh
脚本内容如下:
#!/bin/bash if [ $# -lt 1 ] then echo "Input No Args!" echo "请输入 $(basename $0) start/stop/restart/status" exit; fi HIVE_LOG_DIR=$HIVE_HOME/logs if [ ! -d $HIVE_LOG_DIR ] then mkdir -p $HIVE_LOG_DIR fi function check_process() { pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}') ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1) echo $pid [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1 } function hive_start() { metapid=$(check_process HiveMetastore 9083) cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &" [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动" server2pid=$(check_process HiveServer2 10000) cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &" [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动" } function hive_stop() { metapid=$(check_process HiveMetastore 9083) [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动" server2pid=$(check_process HiveServer2 10000) [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动" } case $1 in "start") hive_start ;; "stop") hive_stop ;; "restart") hive_stop sleep 3 hive_start ;; "status") check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常" check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2服务运行异常" ;; *) echo "Input Args Error!" echo "请输入 $(basename $0) start/stop/restart/status" ;; esac
保存脚本后,为脚本添加运行权限
chmod +x hive-script.sh
用脚本启动、停止、重启、检测运行状态的命令分别为:
- hive-script.sh start
- hive-script.sh stop
- hive-script.sh restart
- hive-script.sh status
注意:hive --service hiveserver2启动较慢,启动后在用hive-script.sh status检测服务状态时要多等一会儿,否则报服务运行异常。
hive-script.sh脚本只是启动了metastore服务和hiveserver2服务,要运行hive命令还需要启beeline 客户端。
beeline -u 'jdbc:hive2://node7:10000' -n root
关于hive异常:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStor
可能是你使用了metastore的远程模式,但是没有启动metastore服务导致,用通过重启metastore服务解决。
- 3台虚拟机重启后需要运行以下命令,重启hadoop和hive服务:
- 1. start-all.sh #启动hadoop服务
- 2. hive-script.sh start #启动metastore服务和HiveServer2服务
- 3. hive #启动hive
- 或运行beeline -u 'jdbc:hive2://node7:10000' -n root启动beeline客户端
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。