Hive基础知识

131 阅读5分钟

“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

生命无罪,健康万岁,我是laity。

我曾七次鄙视自己的灵魂:

第一次,当它本可进取时,却故作谦卑;

第二次,当它在空虚时,用爱欲来填充;

第三次,在困难和容易之间,它选择了容易;

第四次,它犯了错,却借由别人也会犯错来宽慰自己;

第五次,它自由软弱,却把它认为是生命的坚韧;

第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;

第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。

数据仓库基础知识

概念:数据仓库,是一个用于存储、分析、报告的数据系统

  • 数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持。

Hive入门

Hive是基于Hadoop的数据仓库软件,我们负责写Sql,Hive将我们写的Sql帮助我们转为mr

  • 元数据:表与文件的对应关系

元数据的概念Metadate,又称中介数据、中继数据,为描述数据的数据,主要描述数据的属性信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

元数据的存储:Hive说如果你不想自己存我有一个自己的关系型数据库Derby,当然你也可以使用第三方如MySQL等。

Hive安装部署

搭建远程服务:不使用Hive自己的数据库,使用第三方数据库

<!--在core-size.xml中添加-->
    <!-- 整合hive 用户代理设置 -->
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>

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

        <!-- 文件系统垃圾桶保存时间 -->
    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>
    </property>

安装MySQL数据库

已完成

Hive安装

  • 只需要在一台服务器上安装即可

  • 上传安装包并解压

tar zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/laityInstall/
  • 解决Hive与Hadoop之间guava版本差异
cd /opt/laityInstall/apache-hive-3.1.2-bin/
rm -rf lib/guava-19.0.jar
cp /opt/laityInstall/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
  • 修改配置文件

    • hive-env.sh

      cd /opt/laityInstall/apache-hive-3.1.2-bin/conf
      mv hive-env.sh.template hive-env.sh
      
      vim hive-env.sh
      export HADOOP_HOME=/opt/laityInstall/hadoop
      export HIVE_CONF_DIR=/opt/laityInstall/apache-hive-3.1.2-bin/conf
      export HIVE_AUX_JARS_PATH=/opt/laityInstall/apache-hive-3.1.2-bin/lib
      
      • hive-site.xml

        vim hive-site.xml
        
        <configuration>
        <!-- 存储元数据mysql相关配置 -->
        <property>
        	<name>javax.jdo.option.ConnectionURL</name>
        	<value>jdbc:mysql://Itlaity101:3306/hive3?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</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>Wang9264.</value>
        </property>
        
        <!-- H2S运行绑定host -->
        <property>
            <name>hive.server2.thrift.bind.host</name>
            <value>Itlaity101</value>
        </property>
        
        <!-- 远程模式部署metastore metastore地址 -->
        <property>
            <name>hive.metastore.uris</name>
            <value>thrift://Itlaity101:9083</value>
        </property>
        
        <!-- 关闭元数据存储授权  --> 
        <property>
            <name>hive.metastore.event.db.notification.api.auth</name>
            <value>false</value>
        </property>
        </configuration>
        
        
    • 上传mysql jdbc驱动到hive安装包lib下

      mysql-connector-java-5.1.32.jar
      
    • 初始化元数据

      cd /opt/laityInstall/apache-hive-3.1.2-bin/
      
      bin/schematool -initSchema -dbType mysql -verbos
      #初始化成功会在mysql中创建74张表
      
    • 在hdfs创建hive存储目录(如存在则不用操作)

      hadoop fs -mkdir /tmp
      hadoop fs -mkdir -p /user/hive/warehouse
      hadoop fs -chmod g+w /tmp
      hadoop fs -chmod g+w /user/hive/warehouse
      
    • ==启动hive==

      • 1、启动metastore服务

        #前台启动  关闭ctrl+c
        /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore
        
        #前台启动开启debug日志
        /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console  
        
        #后台启动 进程挂起  关闭使用jps+ kill -9
        nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore &
        
        # 查看jps
        83078 RunJar  -- 有这个就说明后台启动成功了
        
    • 2、启动hiveserver2服务 -- 不推荐

      nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
      
      #注意 启动hiveserver2需要一定的时间  不要启动之后立即beeline连接 可能连接不上
      # 显示两个 runjar 就是成功的表现
      /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive
      
    • 3、beeline客户端连接 -- 推荐

      • 拷贝node1安装包到beeline客户端机器上(node3)

        scp -r /opt/laityInstall/apache-hive-3.1.2-bin/ Itlaity103:/export/server/
        
      • 错误

        Error: Could not open client transport with JDBC Uri: jdbc:hive2://node1:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate root (state=08S01,code=0)
        
        • 修改

          在hadoop的配置文件core-site.xml中添加如下属性:
          <property>
                  <name>hadoop.proxyuser.root.hosts</name>
                <value>*</value>
          </property>
          <property>
                  <name>hadoop.proxyuser.root.groups</name>
                  <value>*</value>
          </property>
          
        • 连接访问

          /opt/laityInstall/apache-hive-3.1.2-bin/bin/beeline
          
          beeline> ! connect jdbc:hive2://Itlaity101:10000
          beeline> root
          beeline> 直接回车
          
    • 错误解决:==Hive3执行insert插入操作 statstask异常==

      • 现象

        在执行insert + values操作的时候  虽然最终执行成功,结果正确。但是在执行日志中会出现如下的错误信息。
        
      • 开启hiveserver2执行日志。查看详细信息

        2020-11-09 00:37:48,963 WARN  [5ce14c58-6b36-476a-bab8-89cba7dd1706 main] metastore.RetryingMetaStoreClient: MetaStoreClient lost connection. Attempting to reconnect (1 of 1) after 1s. setPartitionColumnStatistics
        
        ERROR [5ce14c58-6b36-476a-bab8-89cba7dd1706 main] exec.StatsTask: Failed to run stats task
        
      • 但是 ==此错误并不影响最终的插入语句执行成功==。

      • 分析原因和解决

        • statstask是一个hive中用于统计插入等操作的状态任务 其返回结果如下

        • 此信息类似于计数器 用于告知用户插入数据的相关信息 但是不影响程序的正常执行。

        • Hive新版本中 这是一个issues 临时解决方式如下

          community.cloudera.com/t5/Support-…

        • ==在mysql metastore中删除 PART_COL_STATS这张表即可==。

SQL语言:

  • Hive可视化客户端:DataGripDbeaverSQuirrel SQL Client

DML语法:

关系型数据库sql语句我之前复习完完不久,所以我这里就再不做笔记了。

Load加载数据操作
# Hive服务的启动
nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore &  # metastore
nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &  # hiveserver2
# 客户端连接
/opt/laityInstall/apache-hive-3.1.2-bin/bin/beeline
beeline> ! connect jdbc:hive2://Itlaity101:10000
beeline> root
beeline> 直接回车
# 在 beeline客户端 中执行 -- 复制
load data local inpath "Hive部署的服务器中文件的地址(Itlaity101)" into table "HDFS存放的目标位置";
# 移动
load data inpath "HDFS的文件位置" into table "HDFS存放的目标位置";
insert插入数据操作
# 标准插入  -- 时间很慢
insert into table 表名("指定键") values("数据"...);
insert into table 表名 values("数据"...);
# insert + select
insert into table 表名 select 字段,字段... from student;
select查询语句
# having与where区别  -- 两个都是过滤
having 在分组(group by)后对数据进行过滤
where是在分组前对数据进行过滤
having可以使用聚合函数
where不可以使用聚合函数
# 执行顺序
select state,sum(deaths) as cnts from t_usa_covid19
where count_date = "2021-01-28"
group by state
having cnts> 10000
limit 2;
# 也就是 from > where > group by > having > limit > order by > select
join 关联查询 外键
# 使用最多的join分别是:
inner join -- 内连接
left join  -- 左连接
# 内连接 -- 关联表的交集部分
# 左连接 -- 以左边表的全部数据为准,右边与之关联;左表数据全部返回,右表关联上的显示返回,关怀不上的显示null返回。
Hive 常用函数
# 查看hive有哪些函数
show functions;
# 描述一个函数的用法
describe function extended 函数名(count);