hive的安装与配置

基础环境的准备

  1. 当前环境中有分布式的hadoop环境
    hadoop搭建参考:https://blog.csdn.net/qq_40736702/article/details/115217456
  2. 本地安装mysql(账号:root,密码:root123)
  3. mysql端口号:3306
  4. mysql的jdbc驱动包mysql-connector-java,在此基础上更新hive元数据存储
  5. hive目录:/usr/local/hive

准备mysql环境

查看当前的环境中是否有已经安装的mariadb,将其卸载:

[root@master src]# rpm -qa |grep mariadb  
mariadb-libs-5.5.68-1.el7.x86_64
[root@master src]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64   #--nodeps:不检测依赖性
[root@master src]# rpm -qa |grep mariadb                           
[root@master src]# 

安装mysql依赖包的安装:

[root@master src]# yum -y install nettools perl

下载:

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.23.tar.gz
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-server-8.0.23-1.el7.x86_64.rpm
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-client-8.0.23-1.el7.x86_64.rpm
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-common-8.0.23-1.el7.x86_64.rpm
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/community-client-plugins-8.0.23-1.el7.x86_64.rpm
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/community-libs-8.0.23-1.el7.x86_64.rpm

依次安装mysql的mysql_common,mysql-client-plugins,mysql_lib,mysql_client,mysql_server:

cd /usr/local/src
rpm -ivh mysql-community-common-8.0.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.23-1.el7.x86_64.rpm 

修改mysql的配置文件:

[root@master etc]# vim /etc/my.cnf
#将datadir修改为:
datadir=/var/lib/mysql/data
#追加
symbolic-links=0
default-storage-engine=innodb  #存储引擎
innodb_file_per_table   #表数据单独保存,方便管理和提升性能
collation-server=utf8_general_ci        #支持中文编码字符集
init-connect='SET NAMES utf8'   #用户登录到数据库后,在第一次执行查询前执行这条语句,将使用的>
字符集编码设置为utf8
character-set-server=utf8       #将mysql的服务器字符集设定为utf8

启动mysql数据库服务:

[root@master etc]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
`mysqld启动失败`
[root@master etc]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
[root@master etc]# systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 三 2021-03-31 23:09:41 CST; 1min 9s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 1785 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE)
  Process: 1717 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 1785 (code=exited, status=1/FAILURE)
   Status: "Server startup in progress"

3月 31 23:09:31 master systemd[1]: Starting MySQL Server...
3月 31 23:09:41 master systemd[1]: mysqld.service: main process exited, code=exited, st...URE
3月 31 23:09:41 master systemd[1]: Failed to start MySQL Server.
3月 31 23:09:41 master systemd[1]: Unit mysqld.service entered failed state.
3月 31 23:09:41 master systemd[1]: mysqld.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
[root@master etc]# 

解决方法:
/etc/my.cnf 里面默认是:

datadir=/var/lib/mysql

修改为:

datadir=/var/lib/mysql/data

重新启动:

[root@master ~]# chown -R mysql:mysql /var/lib/mysql/			#授权
[root@master ~]# systemctl start mysqld 
[root@master ~]# systemctl status mysqld    
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 三 2021-03-31 23:38:01 CST; 2min 20s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 2191 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 2262 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─2262 /usr/sbin/mysqld

3月 31 23:37:50 master systemd[1]: Starting MySQL Server...
3月 31 23:38:01 master systemd[1]: Started MySQL Server.

查询mysql的密码:

[root@master mysql]# more /var/log/mysqld.log |grep password
2021-03-31T15:37:56.260237Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: LgUyq=Rzj8O<
查到密码为:`LgUyq=Rzj8O<`

数据库登陆

mysql -u root -p
#输入上面查到的密码

设置登陆密码复杂度

set global validate_password.length=4;
set global validate_password.policy=0;
SHOW VARIABLES LIKE 'validate_password%'; 

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';
flush privileges;

开放所有IP都能访问

use mysql;
select host, user, authentication_string, plugin from user;
CREATE USER 'root'@'%' IDENTIFIED BY 'root123';
grant all privileges ON *.* to 'root'@'%' with grant option;
flush privileges;

修改加密方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root123';
select host, user, authentication_string, plugin from user;

重启数据库

systemctl restart mysqld
#开机自启动
systemctl enable mysqld

登录并创建hive数据库:

[root@master lib]# mysql -u root -proot123
mysql> create database hive;

hive安装

配置hive环境变量:
解压缩并给hadoop用户权限:

[root@master src]# wget https://mirrors.bfsu.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
[root@master local]# tar -zxvf apache-hive-3.1.2-bin.tar.gz  -C /usr/local/
[root@master src]# mv /usr/local/apache-hive-3.1.2-bin /usr//local/hive
[root@master local]# chown -R hadoop:hadoop /usr/local/hive/
vim /etc/profile
#追加
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile

修改hive配置文件:

cd /usr/local/hive/conf
vim hive-env.sh
#追加
export JAVA_HOME=/usr/local/jdk-16
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf

切换到hadoop用户下操作:

[root@master hive]# su - hadoop

将hive-default.xml.template拷贝一个hive-site.xml,以hive-site.xml为配置文件来进行修改操作:

[hadoop@master ~]$ cd /usr/local/hive/conf
[hadoop@master conf]$ cp hive-default.xml.template hive-site.xml
vim /usr/local/hive/conf/hive-site.xml
`找到下列标签,修改值为下面的value`
 <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>Username to use against metastore database</description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>root123</value>
    <description>password to use against metastore database</description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=GMT</value>
    <description>
      JDBC connect string for a JDBC metastore.
      To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
      For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
    </description>
  </property>
  <property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
    <description>Auto creates necessary schema on a startup if one doesn't exist.' Set this to false, after creating it once.To enable auto create also set hive.metastore.schema.verification=false. Auto creation is not recommended for production use cases, run schematool command instead.</description>
  </property>
<property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
    <description>
      Enforce metastore schema version consistency.
      True: Verify that version information stored in is compatible with one from Hive jars.  Also disable automatic
            schema migration attempt. Users are required to manually migrate schema after Hive upgrade which ensures
            proper metastore schema migration. (Default)
      False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
    </description>
  </property>
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/local/hive/tmp/${user.name}</value>
    <description>Local scratch space for Hive jobs</description>
  </property>
  <property>
<name>system:java.io.tmpdir</name>
<value>/usr/local/hive/iotmp</value>
<description/>
</property>

  <property>
    <name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/tmp/${hive.session.id}_resources</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>
<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/hive/tmp/${system:user.name}</value>
    <description>Location of Hive run time structured log file</description>
  </property>
  <property>
    <name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/tmp/${system:user.name}/operation_logs</value>
    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>
  </property>
  <property>
    <name>hive.metastore.db.type</name>
    <value>mysql</value>
    <description>
      Expects one of [derby, oracle, mysql, mssql, postgres].
      Type of database used by the metastore. Information schema &amp; JDBCStorageHandler depend on it.
    </description>
  </property>
  <property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
    <description>Whether to include the current database in the Hive prompt.</description>
  </property>
  <property>
    <name>hive.cli.print.header</name>
    <value>true</value>
    <description>Whether to print the names of the columns in query output.</description>
  </property>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
    <description>location of default database for the warehouse</description>
  </property>
<property>


再hive安装目录中新建临时文件夹tmp:

[hadoop@master hive]$ mkdir /usr/local/hive/tmp

初始化hive元数据

在hadoop用户下操作:

  1. 将mysql的数控驱动文件/usr/local/src/mysql-connector-java-8.0.16.jar复制到hive的安装目录的/usr/local/hive/lib下,然后给文件赋权限:
[root@master conf]# cd /usr/local/src/
[root@master src]# tar -zxvf  /usr/local/src/mysql-connector-java-8.0.23.tar.gz 
[root@master src]# cp  /usr/local/src/mysql-connector-java-8.0.23/mysql-connector-java-8.0.23.jar  /usr/local/hive/lib/
[hadoop@master conf]$ chown -R hadoop:hadoop /usr/local/src/mysql-connector-java-8.0.23/mysql-connector-java-8.0.23.jar
  1. 删除hadoop下的/usr/local/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar文件,要不然 会初始化元数据失败。若没有这个文件,则不操作。
  2. 启动hadoop服务:
[hadoop@master hive]$ cd /usr/local/hadoop/sbin/
[hadoop@master sbin]$ ./start-all.sh 
查看3个节点都要启动成功
  1. 初始化元数据,使用schematool升级元数据,将hive的元数据重新写入mysql中。
[root@master lib]# schematool  -initSchema  -dbType mysql

出现错误:

[root@master lib]# schematool  -initSchema  -dbType mysql
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
        at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
        at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
        at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)
        at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)
        at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448)
        at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)
        at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5104)
        at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96)
        at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

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

/usr/local/hive/lib/
/usr/local/hadoop/share/hadoop/common/lib/

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

[root@master lib]# cd /usr/local/hive/lib/
[root@master lib]# ll guava-19.0.jar 
-rw-r--r-- 1 hadoop hadoop 2308517 9月  27 2018 guava-19.0.jar
[root@master lib]# rm -rf guava-19.0.jar 
[root@master lib]# cp /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive/lib/

再次初始化:

mysql> ^DBye
[hadoop@master local]$ schematool  -initSchema  -dbType mysql
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL:        jdbc:mysql://master:3306/hive?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
Metastore Connection Driver :    com.mysql.jdbc.Driver
Metastore connection User:       root
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql
。。。。。。。。。。。。。。。。。。。。。。

Initialization script completed
schemaTool completed

启动hive:

[hadoop@master local]$ hive
which: no hbase in (.:/usr/local/jdk-16/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/jdk-16/bin:/usr/local/hadoop/sbin:/usr/local/hive/bin:/home/hadoop/.local/bin:/home/hadoop/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 87a4a1c8-2509-4987-8a10-850964010a59

Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.2.jar!/hive-log4j2.properties Async: true
Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /tmp/hive. Name node is in safe mode.
The reported blocks 17 has reached the threshold 0.9990 of total blocks 17. The minimum number of live datanodes is not required. In safe mode extension. Safe mode will be turned off automatically in 3 seconds. NamenodeHostName:master
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.newSafemodeException(FSNamesystem.java:1508)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkNameNodeSafeMode(FSNamesystem.java:1495)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3251)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:1158)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:723)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:528)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1086)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:1029)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:957)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2957)

        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:651)
        at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:591)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:747)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

报错:
原因:hdfs的安全模式未关闭
解决:

[hadoop@master tmp]$ hdfs dfsadmin -safemode leave
Safe mode is OFF

再次启动:

[hadoop@master tmp]$ hive
which: no hbase in (.:/usr/local/jdk-16/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/jdk-16/bin:/usr/local/hadoop/sbin:/usr/local/hive/bin:/home/hadoop/.local/bin:/home/hadoop/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = bbf4f88e-d92b-44ba-9907-2fd14da82633

Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.2.jar!/hive-log4j2.properties Async: true
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 1d8ad84e-d822-4ea6-b8bd-93552eb92619
hive (default)> 

启动成功
测试:

hive (default)> create database chenfeng;
OK
Time taken: 0.114 seconds
`创建hive数据库没问题`
hive (default)> show databases;
OK
database_name
Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D
Time taken: 0.028 seconds
`查询出现错误`

解决方案,修改hive-site.xml,配置文件修改如下属性:(主要是设置目录)

<property>
    <name>hive.exec.scratchdir</name>
    <value>/home/hadoop/tmp/hive</value>
    <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/&lt;username&gt; is created, with ${hive.scratch.dir.permission}.</description>
</property>

<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/home/hadoop/tmp/hive/local</value>
    <description>Local scratch space for Hive jobs</description>
 </property>

<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/home/hadoop/tmp/hive/local/resources</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
</property>

再次测试:

hive (default)> show databases;
OK
database_name
chenfeng
default
Time taken: 0.482 seconds, Fetched: 2 row(s)
hive (default)> use default;
hive (default)> show tables;
OK
tab_name
Time taken: 0.036 seconds

问题解决!
在hive cli命令窗口中如何查看hdfs文件系统:

hive (default)> dfs -ls /user/hive/warehouse;
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2021-04-03 23:13 /user/hive/warehouse/chenfeng.db
drwxr-xr-x   - hadoop supergroup          0 2021-04-04 00:36 /user/hive/warehouse/student
hive (default)> 

退出hive窗口:

hive(default)>exit;

beeline cli远程访问hive:
修改Hadoop的core-site.xml配置文件:

 vim /usr/local/hadoop/etc/hadoop/core-site.xml
 ##添加
 <!--为hive赋予代理用户权限,“*”为固定写法,前者表示hadoop集群下的所有节点可以使用hadoop代理用户访问hive,后者表示所有组-->
<property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
</property>
<property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
</property>

将core-site.xml分发下去:

scp /usr/local/hadoop/etc/hadoop/core-site.xml slave1:/usr/local/hadoop/etc/hadoop/
scp /usr/local/hadoop/etc/hadoop/core-site.xml slave2:/usr/local/hadoop/etc/hadoop/

启动hadoop集群。

启动hiveserver2:

hiveserver2

报错:

2021-07-05T00:03:56,623  INFO [shutdown-hook-0] handler.ContextHandler: Stopped o.e.j.s.ServletContextHandler@12365bd8{/logs,file:///tmp/hadoop/,UNAVAILABLE}
2021-07-05T00:03:56,624  INFO [shutdown-hook-0] handler.ContextHandler: Stopped o.e.j.s.ServletContextHandler@6481dce5{/static,jar:file:/usr/local/hive/lib/hive-service-3.1.2.jar!/hive-webapps/static,UNAVAILABLE}
2021-07-05T00:03:56,627  INFO [shutdown-hook-0] handler.ContextHandler: Stopped o.e.j.w.WebAppContext@85ab964{/,null,UNAVAILABLE}{jar:file:/usr/local/hive/lib/hive-service-3.1.2.jar!/hive-webapps/hiveserver2}
2021-07-05T00:03:56,632  INFO [shutdown-hook-0] server.HiveServer2: Web UI has stopped
2021-07-05T00:03:56,632  INFO [shutdown-hook-0] server.HiveServer2: `Stopping/Disconnecting tez sessions.`
2021-07-05T00:03:56,632  INFO [shutdown-hook-0] server.HiveServer2: Stopped tez session pool manager.
2021-07-05T00:03:56,632  INFO [shutdown-hook-0] server.HiveServer2: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down HiveServer2 at master/192.168.1.108
************************************************************/

解决:hive-site.xml增加配置 hive.server2.active.passive.ha.enable=true

<property>
    <name>hive.server2.active.passive.ha.enable</name>
    <value>true</value>
    <description>The host address the HiveServer2 WebUI will listen on</description>
</property>

再启动hiveserver2:

[hadoop@master ~]$ hiveserver2
which: no hbase in (.:/usr/local/jdk-16/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/jdk-16/bin:/usr/local/zookeeper/bin:/usr/local/scala/bin:/usr/local/spark311/bin:/usr/local/hive/bin:/home/hadoop/.local/bin:/home/hadoop/bin)
2021-07-05 00:38:55: Starting HiveServer2
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = c3bdced1-6c5c-431c-95b3-5759bcf610c2
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Hive Session ID = 9febaa36-2e6a-40ad-b8ac-b121c874d0bb
OK

时间要很久,好几分钟,甚至十几分钟,不要关闭这个连接。
启动成功,查看webui:
在这里插入图片描述
启动beeline远程连接:
将hive拷贝到slave1:

[root@master hadoop]# scp -r /usr/local/hive slave1:/usr/local/
##授权
[root@slave1 local]# chown -R hadoop:hadoop /usr/local/hive/
切换到hadoop:
[root@slave1 tmp]# su - hadoop
[hadoop@slave1 ~]$ vi ~/.bashrc
##添加
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export HIVE_CONF_DIR=/usr/local/hive/conf
source  ~/.bashrc

然后在slave1节点远程连接beeline:
出错:

[hadoop@slave1 ~]$ beeline -u jdbc:hive2://192.168.1.108:10000
Connecting to jdbc:hive2://192.168.1.108:10000
2021-07-05 00:21:11,525 INFO jdbc.Utils: Supplied authorities: 192.168.1.108:10000
2021-07-05 00:21:11,527 INFO jdbc.Utils: Resolved authority: 192.168.1.108:10000
2021-07-05 00:21:11,853 WARN jdbc.HiveConnection: Failed to connect to 192.168.1.108:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://192.168.1.108:10000: Failed to open new session: java.lang.RuntimeExcep                                                           tion: org.apache.hadoop.security.AccessControlException: Permission denied: user=anonymous, access=EXECUTE, inode="/tmp":hadoop:supergroup                                                           :drwx------
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:399)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:315)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:242)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:193)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:606)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1845)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkTraverse(FSDirectory.java:1863)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.resolvePath(FSDirectory.java:686)
        at org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.getFileInfo(FSDirStatAndListingOp.java:112)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3208)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1186)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTran                                                           slatorPB.java:982)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodePr                                                           otocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:528)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1086)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:1029)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:957)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2957) (state=08S01,code=0)
Beeline version 2.3.7 by Apache Hive
beeline> ^C[hadoop@slave1 ~]$

报权限不足:

Permission denied: user=anonymous, access=EXECUTE, inode="/tmp/hive/anonymous":hadoop:hadoop:drwx------

解决:开放文件权限给所有人

[hadoop@master ~]$ hdfs dfs  -chmod  -R  777 /tmp/hive

重新连接beeline:

[hadoop@master ~]$  beeline -u jdbc:hive2://192.168.1.108:10000
Connecting to jdbc:hive2://192.168.1.108:10000
2021-07-05 00:41:28,299 INFO jdbc.Utils: Supplied authorities: 192.168.1.108:10000
2021-07-05 00:41:28,300 INFO jdbc.Utils: Resolved authority: 192.168.1.108:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 2.3.7)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 2.3.7 by Apache Hive
0: jdbc:hive2://192.168.1.108:10000> show databases;
INFO  : Compiling command(queryId=hadoop_20210705004453_1f153900-5975-4d86-9f96-9fd9298689b5): show databases
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hadoop_20210705004453_1f153900-5975-4d86-9f96-9fd9298689b5); Time taken: 0.02 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=hadoop_20210705004453_1f153900-5975-4d86-9f96-9fd9298689b5): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hadoop_20210705004453_1f153900-5975-4d86-9f96-9fd9298689b5); Time taken: 0.11 seconds
INFO  : OK
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name  |
+----------------+
| chenfeng       |
| default        |
+----------------+
2 rows selected (0.594 seconds)
0: jdbc:hive2://192.168.1.108:10000>



#####slave1
[hadoop@slave1 ~]$ beeline -u jdbc:hive2://192.168.1.108:10000
Connecting to jdbc:hive2://192.168.1.108:10000
2021-07-05 00:42:41,532 INFO jdbc.Utils: Supplied authorities: 192.168.1.108:10000
2021-07-05 00:42:41,533 INFO jdbc.Utils: Resolved authority: 192.168.1.108:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 2.3.7)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 2.3.7 by Apache Hive
0: jdbc:hive2://192.168.1.108:10000> show databases;
INFO  : Compiling command(queryId=hadoop_20210705004259_c99d6bfb-ce12-42c5-afb9-9a70e1d924d8): show databases
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hadoop_20210705004259_c99d6bfb-ce12-42c5-afb9-9a70e1d924d8); Time taken: 3.04 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=hadoop_20210705004259_c99d6bfb-ce12-42c5-afb9-9a70e1d924d8): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hadoop_20210705004259_c99d6bfb-ce12-42c5-afb9-9a70e1d924d8); Time taken: 0.536 seconds
INFO  : OK
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name  |
+----------------+
| chenfeng       |
| default        |
+----------------+
2 rows selected (10.054 seconds)
0: jdbc:hive2://192.168.1.108:10000>

查看webui界面:有两个连接
在这里插入图片描述
后台运维hiveserver2程序:

[hadoop@master hive]$ nohup hiveserver2 &
[1] 3594
[hadoop@master hive]$ nohup: 忽略输入并把输出追加到"nohup.out"

相关概念
1.Metadata概念:

元数据包含用Hive创建的database、table等的元信息。元数据存储在关系型数据库中。如Derby、MySQL等。

2.Metastore作用:

客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。

bin/hin --访问--> metaStore server --访问-->MySQL
beeline --访问-->hiveServer2 --访问--> metaStore server --访问--> MySQL

3.Metastore 有3中开启方式:
–1-->默认开启方式:
没有配置metaStore的时候,每当开启bin/hive;或者开启hiveServer2的时候,都会在内部启动一个metastore
嵌入式服务;资源比较浪费,如果开启多个窗口,就会存在多个metastore server。

--2-->local mataStore(本地)
    当metaStore和装载元数据的数据库(MySQL)存在同一机器上时配置是此模式,
    开启metastore服务就只需要开启一次就好,避免资源浪费!
    
--3-->Remote Metastore(远程)
    当metaStore和装载元数据的数据库(MySQL)不存在同一机器上时配置是此模式,
    开启metastore服务就只需要开启一次就好,避免资源浪费!

启动hive的远程模式,并开启meatstore服务(hive的元数据直接从这里读,保证mysql的账号和密码的安全,更快速的读取,多个客户端连接一个meatstore服务,更省资源):

停止hiveserver2服务:
kill -9 pid
修改配置文件:
vim /usr/local/hive/conf/hive-site.xml
#添加:
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://master:9083</value>
</property>

服务端metastore 启动方式:

第一种:hive --service metastore -p 9083 &

第二种:在hive-site.xml中配置hive.metastore.uris,指定端口,然后直接 hive --service metastore

metastore启动前后查询数据库对比:

启动前:
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name  |
+----------------+
| chenfeng       |
| default        |
+----------------+
2 rows selected `(1.369 seconds)`

启动后:
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name  |
+----------------+
| chenfeng       |
| default        |
+----------------+
2 rows selected `(0.07 seconds)`

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值