Fork me on GitHub

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 "\t";
    
  • 加载数据

    # 加载本地数据,(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 "\t";

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即可

posted @ 2021-02-01 15:19  是阿凯啊  阅读(72)  评论(0编辑  收藏  举报