• hive-01


    hive

    1.hive介绍:

    1.什么是Hive

    • Hive:由Facebook开源用于解决海量结构化日志的数据统计。

    • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

      本质是:将HQL转化成MapReduce程序

    • Hive处理数据存储在HDFS
    • Hive分析数据底层实现是MapReduce
    • 执行程序运行在Yarn上

    2.Hive优缺点

    • 优点

      1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
      2)避免了去写MapReduce,减少开发人员的学习成本。
      3)Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
      4)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
      5)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
      
    • 缺点

      1.Hive的HQL表达能力有限
      (1)迭代式算法无法表达
      (2)数据挖掘方面不擅长
      2.Hive的效率比较低
      (1)Hive自动生成的MapReduce作业,通常情况下不够智能化
      (2)Hive调优比较困难,粒度较粗
      

    3.Hive架构

    4.Hive和数据库比较

    • 由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性,Hive不是数据库。

    5.查询语句

    • 由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

    6.数据存储位置

    • Hive建立在Hadoop之上,所有Hive数据都是存储在HDFS中的,而数据库则可以将数据保存在块设备或者本地文件系统中。

    7.数据更新

    • 由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET修改数据。

    8.索引

    • Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。

    9.执行

    • Hive中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。

    10.执行延迟

    • Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

    11.可扩展性

    • 由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的规模在4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。

    12.数据规模

    • 由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

    2.hive的安装

    • 官网:http://hive.apache.org/

    • 文档查看:https://cwiki.apache.org/confluence/display/Hive/GettingStarted

    • 下载地址:http://archive.apache.org/dist/hive/

    • github地址:https://github.com/apache/hive

    • 安装部署:

      1.上传tar.gz包
      2.解压:tar -zxvf apache-hive-2.3.1-bin.tar.gz 
      3.mv apache-hive-2.3.1-bin hive-2.3.1
      4.拷贝配置:cp hive-env.sh.template hive-env.sh
      5.配置:vim hive-env.sh
      HADOOP_HOME=/opt/hdp/hadoop-2.8.5
      export HIVE_AUX_JARS_PATH=/opt/hdp/hive-2.3.1/conf
      6.配置mysql允许远程访问(见下面mysql安装)
      7.配置conf下xml文件
      [root@linux01 conf]# vim hive-site.xml
      
      <?xml version="1.0"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>
              <property>
                <name>javax.jdo.option.ConnectionURL</name>
                # 配置连接mysql 地址   metastore表示远程连接的库
                <value>jdbc:mysql://linux01:3306/metastore?createDatabaseIfNotExist=true</value>
                <description>JDBC connect string for a JDBC metastore</description>
              </property>
      
              <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>root</value>
                <description>password to use against metastore database</description>
              </property>
      </configuration>
      
      8.将jdbc的ymsql驱动包上传hive/lib里面  mysql-connector-java-5.1.39.jar
      
      9.启动hive客户端: /opt/hdp/hive-2.3.1/bin/hive
      如报错:FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeExcepti
      解决:
      # hive-site.xml配置
        <property>
          <name>datanucleus.schema.autoCreateAll</name>
          <value>true</value>
        </property>
      # mysql删除注册metastore
        drop database metastore;
      # /opt/hdp/hive-2.3.1/bin下执行
        schematool -dbType mysql -initSchema
      
      

      hive连接方式2:

      # 启动hive的jdbc客户端
      /opt/hdp/hive-2.3.1/bin/beeline
      # 创建hive客户端连接
      !connect jdbc:hive2://linux01:10000
      # 输入用户名,密码
      

      hiveserver2报错解决

    • 启动zookeeper

      /opt/zookeeper-3.4.6/bin/zkServer.sh start /opt/zookeeper-3.4.6/conf/zoo.cfg
      
    • 启动dfs

      [root@linux01 sbin]# ./start-dfs.sh
      
    • hbase启动

      start-hbase.sh
      
    • 启动hive

      hive
      
    • 此时 http://linux01:50070/explorer.html中会有hbase文件

    3.mysql安装

    • 采用rpm安装。

    • 授权:

      # 获取密码
      grep 'temporary password' /var/log/mysqld.log
      # 登录
      mysql -uroot -p生成的面膜
      # 修改管理员密码:
      set global validate_password_policy=0
      set global validate_password_length=4
      SET PASSWORD = PASSWORD('你的密码')
      # 设置远程登录权限
      grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
      
      • 在不知道root密码下更改root密码操作:适用5.7以上mysql
      1.关闭mysql服务:systemctl stop mysqld
      2.配置my.conf 增加
      	skip-grant-tables
      3.启动mysql服务:
      	systemctl start mysqld
      4.进入mysql: mysql -uroot
      5.关键点来了,更改密码
      	use mysql;
      	update user set authentication_string=password('root') where user="root"
      6.退出mysql
      7.关闭mysql:systemctl stop mysqld
      8.关闭配置:vim my.conf 注释掉下面一行
      	skip-grant-tables
      9.重启mysql:systemctl start mysqld
      

    4.hive与数据库命令

    • hive创建一个表

      create table tb_user(id int,name string);
      # 默认表会存储在hdfs中 /user/hive/warehouse/tb_user
      
    • hive创建一个数据库

      create database demo;
      # 默认数据库存储在hdfs中 /user/hive/warehouse/demo.db
      
    • 查询库

      show databases like "demo*";
      
    • 详细查看库

      desc database extended demo_1;
      
    • 更改库参数

      alter database demo_1 set dbproperites("author"="xujunkai");
      
    • 切换数据

      use demo
      
    • 查看正在被使用数据库

      select current_database();
      
    • 展示数据库所有表

      show tables;
      
    • 查看表结构

      desc 表名;
      desc formatted 表名;# 详细表结构
      
    • 向表中插入数据(一般不会用它插入数据)

      insert into tb_user values(1, "wangming",22);
      # 当执行完插入数据执行:show tables;
      # 会多显示如下信息
      values__tmp__table__1
      # 代表插入的数据进入临时表中,重启后,会消失。
      
    • 查询数据

      select * from tb_user;
      
    • 退出客户端

      quit;
      
    • 删除数据库 强制删除

      drop database demo cascade;
      

    5.基本设置+删除数据库

    • hive -help查看帮助如下:

       -d,--define <key=value>          Variable substitution to apply to Hive
                                        commands. e.g. -d A=B or --define A=B
          --database <databasename>     Specify the database to use
       -e <quoted-query-string>         SQL from command line
       -f <filename>                    SQL from files
       -H,--help                        Print help information
          --hiveconf <property=value>   Use value for given property
          --hivevar <key=value>         Variable substitution to apply to Hive
                                        commands. e.g. --hivevar A=B
       -i <filename>                    Initialization SQL file
       -S,--silent                      Silent mode in interactive shell
       -v,--verbose                     Verbose mode (echo executed SQL to the
                                        console)
      
    • -e 用法

      # 不用进到交互模式,操作数据库
      hive - e "use demo; select * from tb_user;" > data.res
      
      
    • -f 用法

      # 使用hive 执行sql脚本
      hive -f my.sql
      
    • 存储在hdfs路径配置

      # 1./opt/hdp/hive-2.3.1/conf 下:
      	cp hive-default.xml.template hive-default.xml
      # 2.修改默认数据仓库原始位置
        <property>
          <name>hive.metastore.warehouse.dir</name>
          <!--用户名-->
          <value>/user/hive/warehouse</value>
          <description>location of default database for the warehouse</description>
        </property>
      # 3.配置同组用户有执行权限
      	bin/hdfs dfs -chmod g+w /user/hive/warehourse
      
    • hive-site.xml 文件添加配置信息,可以实现显示当前数据库,一级查询表的头

      <property>
      	<name>hive.cli.print.header</name>
      	<value>true</value>
      </property>
      <property>
      	<name>hive.cli.print.current.db</name>
      	<value>true</value>
      </property>
      

    6. Hive 运行 日志信息配置

    • Hive 的log默认存放在/tmp/root/hive.log目录下(当前用户名下)

    • 修改hive的log存放日志到/opt/module/hive/logs

      # /opt/hdp/hive-2.3.1/conf目录下:
      	mv hive-log4j2.properties.template hive-log4j2.properties
      # vim hive-log4j2.properties
      	修改:property.hive.log.dir = /opt/hdp/hive-2.3.1/logs
      

    7.创建表加载本地数据到表中

    • 本地准备数据/data/user.txt

      1       Tom
      2       Jerry
      3       Lucy
      4       Li
      5       James
      
    • 创建表

      0: jdbc:hive2://linux01:10000>create table tb_user(id int , name string)row format delimited fields terminated by "	";
      
    • 加载数据

      # 加载本地数据,(local表示本地数据)
      load data local inpath "/data/user.txt" into table tb_user;
      # 加载hdfs数据load到表中
      load data inpath "/data/user.txt" into table tb_user;
      
    create table tb_user(id int , name string)row format delimited fields terminated by "	";
    

    8.Hive创建表

    • 创建表语法

      CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
      [(col_name data_type [COMMENT col_comment], ...)] 
      [COMMENT table_comment] 
      [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
      [CLUSTERED BY (col_name, col_name, ...) 
      [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
      [ROW FORMAT row_format] 
      [STORED AS file_format] 
      [LOCATION hdfs_path]
      -- 字段解释说明
      (1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
      (2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
      (3)COMMENT:为表和列添加注释。
      (4)PARTITIONED BY创建分区表
      (5)CLUSTERED BY创建分桶表
      (6)SORTED BY不常用
      (7)ROW FORMAT 
      DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
              [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] 
         | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
      用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
      SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。
      (8)STORED AS指定存储文件类型
      常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
      如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
      (9)LOCATION :指定表在HDFS上的存储位置。
      (10)LIKE允许用户复制现有的表结构,但是不复制数据。
      
    • Hive的最底层也事mapreduce,最终达到效果是为了提高查询效率。PARTITIONED 代表分区,CLUSTERED 代表分桶:

    分区:分区是将文件放到不同文件夹上
    分桶:分桶是将不同数据存到不同文件上
    

    10.Hive内部表和外部表

    • 未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);

    • 区别:

      1.内部表数据由Hive自身管理,外部表数据由HDFS管理
      2.内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里)
      3.删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除
      4.对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复
      

    11 yarn配置

    • /opt/hdp/hadoop-2.8.5/etc/hadoop 下执行

      cp mapred-site.xml.template mapred-site.xml
      
    • vim mapred-site.xml配置如下

      <configuration>
              <property>
                   <name>mapreduce.framework.name</name>
                   <value>yarn</value>
              </property>
      </configuration>
      
    • /opt/hdp/hadoop-2.8.5/etc/hadoop,接着修改配置文件 yarn-site.xml:

      <configuration>
      <!--  主节点所在机器 -->
      <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>linux01</value>
      </property>
      
      <!--  为mr程序提供shuffle服务 -->
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      
      <!--  一台NodeManager的总可用内存资源 -->
      <property>
      <name>yarn.nodemanager.resource.memory-mb</name>
      <value>2048</value>
      </property>
      <!--  一台NodeManager的总可用(逻辑)cpu核数 -->
      <property>
      <name>yarn.nodemanager.resource.cpu-vcores</name>
      <value>2</value>
      </property>
      
      <!--  是否检查容器的虚拟内存使用超标情况 -->
      <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
      </property>
      
      <!--  容器的虚拟内存使用上限:与物理内存的比率 -->
      <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>2.1</value>
      </property>
      
      </configuration>
      
      
    • 启动yarn

      ./sbin/start-yarn.sh      # 启动YARN
      ./sbin/mr-jobhistory-daemon.sh start historyserver  # 开启历史服务器,才能在Web中查看任务运行情况
      

    11 mysqlJob for mysqld.service failed because the control process exited with error code问题

    • vim /var/log/mysqld.log

      2021-01-31T03:02:08.174208Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory
      2021-01-31T03:02:08.488448Z 0 [Note] InnoDB: Buffer pool(s) load completed at 210131 11:02:08
      2021-01-31T03:02:09.174919Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
      
      
    • 发现没有/var/run/mysqld/mysqld.pid文件

      mkdir -p /var/run/mysqld/
      touch /var/run/mysqld/mysqld.pid
      
      
      chown mysql.mysql /var/run/mysqld
      chown mysql.mysql /var/run/mysql/mysqld.pid
      
    • systemctl start mysqld即可

  • 相关阅读:
    Vue 学习笔记之 —— 组件(踩了个坑)
    Vue 学习笔记之 —— 表单输入绑定
    js cookie
    python中线程、进程和协程的区别
    设计模式
    Mysql从入门到精通整理
    如何处理缓存失效、缓存穿透、缓存并发等问题
    mysql 查询当天、本周,本月,上一个月的数据
    Mysql分表和分区的区别、分库分表介绍与区别(转)
    mysql数据库死锁的产生原因及解决办法
  • 原文地址:https://www.cnblogs.com/xujunkai/p/14356798.html
Copyright © 2020-2023  润新知