一、部署规划
hadoop高可用集群部署参考: Hadoop3.X分布式高可用集群部署
1.1 版本说明
软件 | 版本 |
操作系统 | CentOS Linux release 7.8.2003 (Core) |
JAVA | jdk-8u271-linux-x64 |
Hadoop | hadoop-3.2.2 |
Hive | hive-3.1.2 |
1.2 集群规划
- hive远程模式 && hiveserver2高可用
hostname | IP | 组件 | ||||
master | 172.16.20.200 | NameNode | hive-metastore | |||
secondmaster | 172.16.20.201 | NameNode | hive-metastore | |||
slave1 | 172.16.20.202 | Zookeeper | DataNode | NodeManage | hiveserver2 | |
slave2 | 172.16.20.203 | Zookeeper | DataNode | NodeManage | hiveserver2 | |
slave3 | 172.16.20.204 | Zookeeper | DataNode | NodeManage | mysql |
1.3 hive存储概念
- Hive用户接口:
命令行接口(CLI):以命令行的形式输入SQL语句进行数据数据操作
Web界面:通过Web方式进行访问。
Hive的远程服务方式:通过JDBC等方式进行访问。 - 元数据存储
将元数据存储在关系数据库中(MySql、Derby),元数据包括表的属性、表的名称、表的列、分区及其属性以及表数据所在的目录等。 - 解释器、编译器、优化器
分别完成SQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行。 - 数据存储
Hive没有专门的数据存储格式,也没有为数据建立索引,Hive中所有数据都存储在HDFS中。Hive包含以下数据模型:表、外部表、分区和桶
1.4 Metadata,Metastore 的作用
- Metadata概念:
元数据包含用Hive创建的database、table等的元信息。元数据存储在关系型数据库中。如Derby、MySQL等。 - Metastore作用:
客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。
1.5 Hive的元数据存储(Metastore三种配置方式)
- 内嵌模式(Embedded)
hive服务和metastore服务运行在同一个进程中,derby服务也运行在该进程中.内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。
这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。 - 本地模式(Local):本地安装mysql 替代derby存储元数据
- 不再使用内嵌的Derby作为元数据的存储介质,而是使用其他数据库比如MySQL来存储元数据。hive服务和metastore服务运行在同一个进程中,mysql是单独的进程,可以同一台机器,也可以在远程机器上。
- 这种方式是一个多用户的模式,运行多个用户client连接到一个数据库中。这种方式一般作为公司内部同时使用Hive。每一个用户必须要有对MySQL的访问权利,即每一个客户端使用者需要知道MySQL的用户名和密码才行。
- 远程模式(Remote): 远程安装mysql 替代derby存储元数据
- Hive服务和metastore在不同的进程内,可能是不同的机器,该模式需要将hive.metastore.local设置为false,将hive.metastore.uris设置为metastore服务器URL
- 远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。将metadata作为一个单独的服务进行启动。各种客户端通过beeline来连接,连接之前无需知道数据库的密码。
- 仅连接远程的mysql并不能称之为“远程模式”,是否远程指的是metastore和hive服务是否在同一进程内.
二、MYSQL部署
- slave3 节点
下载解压
下载地址: https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
tar -xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
ln -s /usr/local/mysql-8.0.26-linux-glibc2.12-x86_64 /usr/local/mysql
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
环境配置
## 创建用户
useradd mysql
## 创建目录
mkdir -pv /data/mysql/{data,logs,binlog}
chown mysql.mysql /data/mysql -R
创建配置文件
cat > /data/mysql/my.cnf << 'EOF'
[client]
port = 3306
socket = /data/mysql/mysqld.sock
default-character-set = utf8mb4
[mysql]
prompt="\u@mysqldb \R:\m:\s [\d]> "
no-auto-rehash
default-character-set = utf8mb4
[mysqld]
user = mysql
port = 3306
socket = /data/mysql/mysqld.sock
skip-name-resolve
# 设置字符编码
character-set-server = utf8
collation-server = utf8_general_ci
# 设置默认时区
#default-time_zone='+8:00'
server-id = 1
# Directory
basedir = /usr/local/mysql
datadir = /data/mysql/data
secure_file_priv = /data/mysql/
pid-file = /data/mysql/mysql.pid
max_connections = 1024
max_connect_errors = 100
wait_timeout = 100
max_allowed_packet = 128M
table_open_cache = 2048
back_log = 600
default-storage-engine = innodb
log_bin_trust_function_creators = 1
# Log
general_log=off
#general_log_file = /data/mysql/logs/mysql.log
log-error = /data/mysql/logs/error.log
# binlog
log-bin = /data/mysql/binlog/mysql-binlog
binlog_format=mixed
#slowlog慢查询日志
slow_query_log = 1
slow_query_log_file = /data/mysql/logs/slow.log
long_query_time = 2
log_output = FILE
log_queries_not_using_indexes = 0
#global_buffers
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2
key_buffer_size = 64M
innodb_log_file_size = 512M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_data_file_path = ibdata1:20M:autoextend
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
[mysqldump]
quick
max_allowed_packet = 32M
EOF
ln -s /data/mysql/my.cnf /etc/my.cnf
初始化MYSQL
bin/mysqld --initialize --user=mysql --datadir=/data/mysql/data/ --basedir=/usr/local/mysql
启动MYSQL
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
2.6 登录MYSQL
## 查看mysql初始化密码
cat /data/mysql/logs/error.log |grep password|awk -F':' '{print $NF}'
5>G=3sJ6Cy2i
## 修改密码
mysqladmin -uroot -p'5>G=3sJ6Cy2i' password 123456
## 登录mysql
mysql -uroot -p123456
Hive授权
create database hive;
create user "hive"@"%" identified by "Passw0rd";
grant all privileges on hive.* to "hive"@"%";
flush privileges;
mysql解决时区问题
select now(); show variables like '%time_zone%'; set gloable time_zone='+8:00';
二、Hive部署
- master节点操作
2.1 下载解压
下载地址: https://downloads.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
tar -zxf apache-hive-3.1.2-bin.tar.gz -C /opt/hadoop/
ln -s /opt/hadoop/apache-hive-3.1.2-bin /usr/local/hive
配置环境变量, /etc/profie下加入
cat >> /etc/profile << 'EOF'
#HIVE
HIVE_HOME=/usr/local/hive
PATH=$HIVE_HOME/bin:$PATH
export PATH HIVE_HOME
EOF
source /etc/profile
2.2 修改配置
cd $HIVE_HOME/conf
hive-log4j2.properties
cp hive-log4j2.properties.template hive-log4j2.properties
hive-env.sh
cat > hive-env.sh << 'EOF'
export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
EOF
2.3 同步配置
rsync -av /opt/hadoop/apache-hive-3.1.2-bin root@sm:/opt/hadoop/
rsync -av /opt/hadoop/apache-hive-3.1.2-bin root@s1:/opt/hadoop/
rsync -av /opt/hadoop/apache-hive-3.1.2-bin root@s2:/opt/hadoop/
并在节点上创建软连接
ln -s /opt/hadoop/apache-hive-3.1.2-bin /usr/local/hive
2.4 metastore配置
- master和secondmaster节点操作
创建目录
hdfs dfs -mkdir -p /data/hive/{warehouse,tmp,logs}
hdfs dfs -chmod -R 775 /data/hive/
cd $HIVE_HOME/conf
2.4.1 metastore-site.xml
cat > metastore-site.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!--Hive作业的HDFS根目录位置 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/data/hive/tmp</value>
</property>
<!--Hive作业的HDFS根目录创建写权限 -->
<property>
<name>hive.scratch.dir.permission</name>
<value>775</value>
</property>
<!--hdfs上hive元数据存放位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/data/hive/warehouse</value>
</property>
<!--连接数据库地址,名称 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://slave3:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--连接数据库驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<!--连接数据库用户名称 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<!--连接数据库用户密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Passw0rd</value>
</property>
<!-- 指定metastore连接地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>
</configuration>
EOF
secondmaster配置相同, 注意修改hive.metastore.uris地址为thrift://secondmaster:9083
2.4.2 下载mysql驱动包
驱动地址: https://mvnrepository.com/artifact/mysql/mysql-connector-java
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar -P $HIVE_HOME/lib/
2.4.3 初始化MYSQL
- 执行一次即可
$HIVE_HOME/bin/schematool -dbType mysql -initSchema
报错:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
guave版本不对, 解决方法, 删除低版本(hadoop或者hive), 复制高版本, 如下:
ll $HIVE_HOME/lib/guava*; ll $HADOOP_HOME/share/hadoop/common/lib/guava* -rw-r--r-- 1 root root 2308517 Sep 27 2018 /usr/local/hive/lib/guava-19.0.jar -rw-r--r-- 1 1000 1000 2747878 Jan 3 2021 /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar rm -f $HIVE_HOME/lib/guava-19.0.jar cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib/
2.4.4 启动metastore
mkdir -pv $HIVE_HOME/logs
nohup $HIVE_HOME/bin/hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &
2.5 hiveserver2配置
- slave1和salve2节点操作相同
2.5.1 hiveserver2-site.xml
cat > hiveserver2-site.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083,thrift://secondmaster:9083</value>
</property>
<!--hiveserver2高可用-->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
</property>
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<value>slave1:2181,slave2:2181,slave3:2181</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10001</value>
</property>
<!--填写节点, 如slave1,slave2-->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>slave1</value>
</property>
</configuration>
EOF
注意修改hive.server2.thrift.bind.host为本机的hostname
2.5.2 修改hadoop配置
在core-site.xml中加入以下配置
<!-- 如果连接不上10001 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
hadoop.proxyuser.xxx.hosts和hadoop.proxyuser.xxx.groups,其中xxx为启动HiveServer2的用户
如果不修改, 启动hiveserver2则会报错
WARN [main] metastore.RetryingMetaStoreClient: MetaStoreClient lost connection. Attempting to reconnect (1 of 1) after 1s. getCurrentNotificationEventId
org.apache.thrift.TApplicationException: Internal error processing get_current_notificationEventId
2.5.3 启动hiveserver2
启动hive
mkdir -pv $HIVE_HOME/logs
nohup $HIVE_HOME/bin/hive --service hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &
2.5.4 连接测试
$HIVE_HOME/bin/beeline -u jdbc:hive2://slave1:10001
$HIVE_HOME/bin/beeline -u jdbc:hive2://slave2:10001
2.5.5 ui界面
2.6 hive客户端配置
hive-site.xml
cd $HIVE_HOME/conf
cat > hive-site.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083,thrift://secondmaster:9083</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>
</configuration>
EOF
解决guava版本不一致问题
rm -f $HIVE_HOME/lib/guava-19.0.jar cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib/
启动客户端
$HIVE_HOME/bin/hive
连接测试
登录hive命令
$HIVE_HOME/bin/hive