一、部署规划 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包含以下数据模型:表、外部表、分区和桶
Metadata概念: 元数据包含用Hive创建的database、table等的元信息。元数据存储在关系型数据库中。如Derby、MySQL等。
Metastore作用: 客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接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部署
下载解压 下载地址: https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
1 2 3 4 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
环境配置 1 2 3 4 5 useradd mysql mkdir -pv /data/mysql/{data,logs,binlog}chown mysql.mysql /data/mysql -R
创建配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 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 1 bin/mysqld --initialize --user=mysql --datadir=/data/mysql/data/ --basedir=/usr/local/mysql
启动MYSQL 1 2 cp support-files/mysql.server /etc/init.d/mysqldchmod +x /etc/init.d/mysqld
2.6 登录MYSQL
1 2 3 4 5 6 7 8 9 cat /data/mysql/logs/error.log |grep password|awk -F':' '{print $NF}' 5>G=3sJ6Cy2i mysqladmin -uroot -p'5>G=3sJ6Cy2i' password 123456 mysql -uroot -p123456
Hive授权 1 2 3 4 create database hive;create user "hive"@"%" identified by "Passw0rd";grant all privileges on hive.* to "hive"@"%";flush privileges;
mysql解决时区问题
1 2 3 select now();show variables like '%time_zone%' ;set gloable time_zone= '+8:00' ;
二、Hive部署
2.1 下载解压 下载地址: https://downloads.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
1 2 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下加入
1 2 3 4 5 6 7 8 cat >> /etc/profile << 'EOF' HIVE_HOME=/usr/local/hive PATH=$HIVE_HOME /bin:$PATH export PATH HIVE_HOMEEOF source /etc/profile
2.2 修改配置
hive-log4j2.properties 1 cp hive-log4j2.properties.template hive-log4j2.properties
hive-env.sh 1 2 3 4 5 cat > hive-env.sh << 'EOF' export HADOOP_HOME=/usr/local/hadoopexport HIVE_CONF_DIR=/usr/local/hive/confexport HIVE_AUX_JARS_PATH=/usr/local/hive/libEOF
2.3 同步配置 1 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/
并在节点上创建软连接
1 ln -s /opt/hadoop/apache-hive-3.1.2-bin /usr/local/hive
创建目录
1 2 hdfs dfs -mkdir -p /data/hive/{warehouse,tmp,logs} hdfs dfs -chmod -R 775 /data/hive/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 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 > <property > <name > hive.exec.scratchdir</name > <value > /data/hive/tmp</value > </property > <property > <name > hive.scratch.dir.permission</name > <value > 775</value > </property > <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 > <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
1 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
1 $HIVE_HOME /bin/schematool -dbType mysql -initSchema
报错:
1 Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
guave版本不对, 解决方法, 删除低版本(hadoop或者hive), 复制高版本, 如下:
1 2 3 4 5 6 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.jarcp $HADOOP_HOME /share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME /lib/
1 2 mkdir -pv $HIVE_HOME /logsnohup $HIVE_HOME /bin/hive --service metastore >> $HIVE_HOME /logs/metastore.log 2>&1 &
2.5 hiveserver2配置
2.5.1 hiveserver2-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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 > <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 > <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中加入以下配置
1 2 3 4 5 6 7 8 9 <!-- 如果连接不上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则会报错
1 2 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
1 2 mkdir -pv $HIVE_HOME /logsnohup $HIVE_HOME /bin/hive --service hiveserver2 >> $HIVE_HOME /logs/hiveserver2.log 2>&1 &
2.5.4 连接测试 1 2 $HIVE_HOME/bin/beeline -u jdbc:hive2://slave1:10001 $HIVE_HOME/bin/beeline -u jdbc:hive2://slave2:10001
2.5.5 ui界面 http://172.16.20.201:10002/
http://172.16.20.202:10002/
2.6 hive客户端配置 hive-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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版本不一致问题
1 2 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命令