在虚拟机或Docker中搭建大数据伪分布式集群(三):添加Hive

在虚拟机或Docker中搭建大数据伪分布式集群(三):添加Hive

系列文章:

在虚拟机或Docker中搭建大数据伪分布式集群系列(一):hadoop基础功能——hdfs 与 yarn

在虚拟机或Docker中搭建大数据伪分布式集群(二):集群添加zookeeper与HBase


目录

在虚拟机或Docker中搭建大数据伪分布式集群(三):添加Hive

一、Hive 安装与配置

1、Hive 安装

2、修改配置

(1)hive-env.sh文件

(2)hive-site.xml 文件

(3)修改 hadoop 中的 core-site.xml

3、启动

(1)重启hadoop 

(2)第一次启动需要初始化

(3)启动

(4)测试

(5)远程连接


前面一路从hadoop、zookeeper、HBase等集群搭建而来,大数据生态环境已经初步形成,接下来搭建大数据生态中很重要的Hive。

注意先安装mysql 数据库,并开启远程连接权限。请参考:

这里我直接启用docker生成mysql容器

# 拉取并查看镜像
docker pull mysql:latest
docker images

# 运行容器
docker run -itd --name mysql-hive -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

# -p 3306:3306  将宿主机的3306映射到容器的3306端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
# MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码

这里我就直接使用 root 用户了,如果使用其他用户,记得在 hive-site.xml 中的 javax.jdo.option.ConnectionDriverName 参数配置中使用 该用户名

注意:生产上不会直接使用MySQL的 root 用户,一般会创建一个普通用户,并且授权(最小授权原则:用什么才给什么,无授权即禁止) 

# 进入容器或服务器中,开启mysql客户端,并在客户端中执行
mysql> CREATE USER 'hive'@'%' IDENTIFIED BY '123456'; 

mysql> GRANT ALL PRIVILEGES ON hivedb.* TO 'hive'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

mysql> FLUSH PRIVILEGES;

一、Hive 安装与配置

1、Hive 安装

Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转换为 MapReduce 任务执行。因为只是映射和转换工具,并不需要考虑多集群模式,所以Hive只需在一个节点(最好是master)上安装即可。

软件:

apache-hive-3.1.2-bin.tar.gz (可直接从国内的清华大学等镜像网站下载,地址:清华大学开源软件镜像站 | Tsinghua Open Source Mirror

mysql-connector-java-8.0.22.jar (可从maven中央仓库https://mvnrepository.com/或阿里仓库仓库服务下载,最好是8.x版本)

上传解压改名

# 虚拟机使用rz,docker 使用docker cp
docker cp /Volumes/Linux/apache-hive-3.1.2-bin.tar.gz  hadoop-master:/opt/
docker cp /Volumes/Linux/mysql-connector-java-8.0.22.jar  hadoop-master:/opt/

进入虚拟机或容器后,解压改名

tar -xzvf apache-hive-3.1.2-bin.tar.gz
mv apache-hive-3.1.2-bin  hive

配置环境变量

vi  /etc/profile

在文件尾部添加配置

export HIVE_HOME=/opt/hive
export PATH=$HIVE_HOME/bin:$PATH

退出保存,再使配置生效

source /etc/profile

# 有hive的版本显现,安装成功!
hive --version

注意:需要把mysql的驱动包copy到hive的安装目录下的 $HIVE_HOME/lib 中

mv mysql-connector-java-8.0.22.jar $HIVE_HOME/lib/

2、修改配置

进入安装目录的 conf/ 目录下,拷贝配置样本并进行修改

(1)hive-env.sh文件

cd $HIVE_HOME/conf

cp hive-env.sh.template hive-env.sh

vi hive-env.sh

# 在文件尾部添加
source /etc/profile
export JAVA_HOME=$JAVA_HOME
export HADOOP_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=$HIVE_HOME
export HIVE_CONF_DIR=$HIVE_HOME/conf
export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib
# 保存退出

(2)hive-site.xml 文件

cp hive-default.xml.template hive-site.xml
vim hive-site.xml 

关于Metastore的三种配置:内嵌配置,本地配置,远程配置。

      1. 默认情况下,metastore服务和Hive的服务运行在同一个JVM中,包含了一个内嵌的以本地磁盘作为存储的Derby(Hive自带的数据库)数据库实例。同时,这种配置也被称为内嵌配置。但是这种方式的不好之处就在于每次只有一个内嵌的Derby数据库可以访问某个磁盘上的数据文件,也就是说一次只能为每个metastore打开一个hive会话。如果尝试连接多个,会报错。这样效率很低。

       2.如果要支持多会话,或者多用户的话,需要使用一个独立的数据库(比如mysql,比较常用),这种配置方式称为本地metastore配置。虽然这种方式Hvie服务和Metastore服务仍然在一个JVM进程中,但连接的却是另外一个进程中运行的数据库,在同一台机器上或者远程机器上。任何JDBC兼容的数据库都可以通过javax.jdo.option.*配置属性来供metastore使用。

       3.还有一种配置时远程metastore配置,这种配置情况下,一个或多个metastore服务器和Hive服务运行在不同的进程中。这样一来,数据库层可以 完全置于防火墙后,客户端则不需要数据库凭证(密码账号),从而提供了更好的可管理性和安全。可以通过hive.metastore.uris设置 为metastore服务器你URI(如果有多个服务器,可以用'逗号'分割),把hive服务设为使用远程metastore.metastore服务器的URI的格式为:thrift://host:port.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
    <!-- 记录Hive中的元数据信息  记录在mysql中 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://192.168.78.1:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;serverTimezone=GMT&amp;allowPublicKeyRetrieval=true</value>
    </property>
    <!-- mysql的驱动 -->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
    </property>
    <!-- mysql的用户名和密码,请自定义 -->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
    </property>
    <!-- 设置hive仓库的HDFS上的位置 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/hive/warehouse</value>
    </property>
    <!-- 添加元数据服务配置 -->
    <property>
        <name>hive.metastore.local</name>
        <value>false</value>
    </property>
    <!-- 属性为空,则默认为本地模式,否则为远程模式 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hadoop-master:9083</value>
        <description>IP address (or fully-qualified domain name) and port of the metastore host</description>
    </property>
    <!-- 元数据 schema 检查 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
    <!-- 显示当前数据库的信息 -->
    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
    </property>
    <!-- 显示查询表的行头信息 -->
    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
    </property>

    <!--设置资源临时文件存放位置 -->
    <property>
        <name>hive.exec.scratchdir</name>
        <value>/hive/tmp</value>
    </property>

    <!--设置查询日志在HDFS上的位置 -->
    <property>
        <name>hive.querylog.location</name>
        <value>/hive/log</value>
    </property>
    <!-- 客户端远程连接的host -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>0.0.0.0</value>
    </property>
    <!-- 客户端远程连接的端口 -->
    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>
    <!-- hive远程服务的页面的host -->
    <property>
        <name>hive.server2.webui.host</name>
        <value>0.0.0.0</value>
    </property>
    <!-- hive远程服务的页面的端口 -->
    <property>
        <name>hive.server2.webui.port</name>
        <value>10002</value>
    </property>
    <!-- hive远程服务的连接超时设置 -->
    <property>
        <name>hive.server2.long.polling.timeout</name>
        <value>5000</value>
    </property>
    <!-- hive远程服务模拟连接的用户,默认为true,HiveServer2以提交查询的用户身份执行查询处理;
    为false,查询将以运行hiveserver2进程的用户身份运行,即yarn作业获取到的hiveserver2用户都为hive用户 -->
    <property>
        <name>hive.server2.enable.doAs</name>
        <value>true</value>
    </property>
    <!-- 设置 权限 -->
    <property>
        <name>hive.scratch.dir.permission</name>
        <value>777</value>
    </property>
    <!-- 在不存在时是否自动创建必要的schema(数据库和表) -->
    <property>
        <name>datanucleus.autoCreateSchema</name>
        <value>false</value>
    </property>
    <!-- 开启数据核固定数据存储模式 -->
    <property>
        <name>datanucleus.fixedDatastore</name>
        <value>true</value>
    </property>
    <!-- 根据输入文件的大小决定是否将普通join转换为mapjoin的一种优化,默认不开启false -->
    <property>
        <name>hive.auto.convert.join</name>
        <value>false</value>
    </property>
    <!-- Hive计算引擎:mr=>mapreduce(默认);spark=>spark -->
    <property>
        <name>hive.execution.engine</name>
        <value>mapreduce</value>
    </property>
</configuration>

当然,配置可以简单一点(针对hive新版本-非生产环境)

<property>
	<name>javax.jdo.option.ConnectionURL</name>
	<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;serverTimezone=GMT&amp;allowPublicKeyRetrieval=true</value>
</property>
<property>
	<name>javax.jdo.option.ConnectionDriverName</name>
	<value>com.mysql.jdbc.Driver</value>
</property>
<property>
	<name>javax.jdo.option.ConnectionUserName</name>
	<value>root</value>
</property>
<property>
	<name>javax.jdo.option.ConnectionPassword</name>
	<value>rzm1991</value>
</property>

(3)修改 hadoop 中的 core-site.xml

vi $HADOOP_HOME/etc/hadoop/core-site.xml 

添加如下配置:

<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>

<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

3、启动

(1)重启hadoop 

$HADOOP_HOME/sbin/stop-dsf.sh
$HADOOP_HOME/sbin/start-dfs.sh

(2)第一次启动需要初始化

schematool -dbType mysql -initSchema

注意:初始化时可能出现的问题

问题一:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

原因:hadoop和hive的两个guava.jar版本不一致
两个位置分别位于下面两个目录:

$HIVE_HOME/lib/
$HADOOP_HOME/share/hadoop/common/lib/

解决办法:删除低版本的那个,将高版本的复制到低版本目录下

问题二:java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password‘

主要原因8.x版本的验证模块和之前版本不同:

5.x版本是:default_authentication_plugin=mysql_native_password

8.x版本就是:default_authentication_plugin=caching_sha2_password

解决方案:更新mysql驱动的jar版本,最好修改为8.x版本

(3)启动

服务端启动

# 前台启动, 默认监听端口是:9083 
hive --service  metastore  [-p 9083]

# 后台启动
hive --service  metastore  &  [-p 9083]

netstat -nltp  | grep  9083

# 关闭: pid为上述查询的进程id 
kill -9 pid

注意客户端中的端口配置需要和启动监听的端口一致。服务端启动正常后,客户端就可以执行hive操作了。

客户端本地连接

hive

注意:hive启动问题汇总

问题一: java.net.ConnectException: Connection refused

大概率是 hadoop 集群没开启 或 hive-sit.xml 中的 hadoop 配置错误。

问题二:Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /opt/hive/tmp. Name node is in safe mode

没有关闭安全模式,直接强制离开安全模式就行了:

hdfs dfsadmin -safemode leave

(4)测试

hive> show databases;
OK
default
Time taken: 2.529 seconds, Fetched: 1 row(s)
hive> show tables;
OK
Time taken: 0.225 seconds
hive> create table employee (id bigint,name string) row format delimited fields terminated by '\t';
OK
Time taken: 2.264 seconds
hive> select * from employee;
OK
Time taken: 3.812 seconds

(5)远程连接

远程服务器启动

# 前台启动
hive --service hiveserver2

# 后台启动
hive --service hiveserver2 &

netstat -nltp  | grep  10000

# 关闭: pid为上述查询的进程id 
kill -9 pid

客户端连接

beeline
!connect jdbc:hive2://hadoop-master:10000

# 或者
beeline -u jdbc:hive2://hadoop-master:10000 -n root

web页面

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值