大数据技术暑期实习四___Hive安装部署、案例分析、元数据配置MySQL及Hive常用操作

一、入门概念

  1.1.什么是Hive

   Hive是有Facebook开源,用于解决海量数据结构化日志的数据统计,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。其本质是将HQL转化成为MR程序。

    1)Hive处理的数据存储在HDFS上

    2)Hive分析数据的底层实现是MR

    3)执行程序在Yarn上

  1.2.Hive优缺点

   1.2.1优点:

    1)操作接口采用类SQL语法,提供快速开发能力,容易上手

    2)避免写MR程序,减少开发成本

    3)由于执行延时较高,所以适合做大规模历史数据的分析处理

    4)支持用户自定义函数,用户可以根据需求实现自己的函数

  1.2.2缺点:

    1)SQL表达能力有限,迭代式算法无法实现,数据挖掘能力欠缺

    2)执行效率低,Hive自动生成的MR作业 通常不够智能化

    3)Hive调优比较困难,粒度较粗

  1.3.架构原理

   

  1.4.索引

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

二、Hive安装部署

  2.1.安装地址

   2.1.1.Hive官网地址

   http://hive.apache.org/

   2.1.2.文档查看地址

   https://cwiki.apache.org/confluence/display/Hive/GettingStarted

   2.1.3.下载地址

   http://archive.apache.org/dist/hive/

   2.1.4.github地址

   https://github.com/apache/hive

  2.2.Hive安装部署

   2.2.1.Hive安装及配置

  (1)把apache-hive-1.2.1-bin.tar.gz上传到linux的/opt/software目录下

  (2)解压apache-hive-1.2.1-bin.tar.gz到/opt/module/目录下面

[atguigu@hadoop102 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt/module/

 

  (3)修改apache-hive-1.2.1-bin.tar.gz的名称为hive

[atguigu@hadoop102 module]$ mv apache-hive-1.2.1-bin/ hive

 

  (4)修改/opt/module/hive/conf目录下的hive-env.sh.template名称为hive-env.sh    

[atguigu@hadoop102 conf]$ mv hive-env.sh.template hive-env.sh

 

       (5)配置hive-env.sh文件

         (a)配置HADOOP_HOME路径

export HADOOP_HOME=/opt/module/hadoop-2.7.2

 

         (b)配置HIVE_CONF_DIR路径

export HIVE_CONF_DIR=/opt/module/hive/conf

 

   2.2.2.Hadoop集群配置

  (1)必须启动hdfs和yarn

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh

 

  (2)在HDFS上创建/tmp和/user/hive/warehouse两个目录并修改他们的同组权限可写

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir /tmp

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir -p /user/hive/warehouse

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /tmp

[atguigu@hadoop102 hadoop
-2.7.2]$ bin/hadoop fs -chmod g+w /user/hive/warehouse

   2.2.3.Hive基本操作

  (1)启动hive

    [atguigu@hadoop102 hive]$ bin/hive

  (2)查看数据库

    hive> show databases;

  (3)打开默认数据库

    hive> use default;

  (4)显示default数据库中的表

    hive> show tables;

  (5)创建一张表

    hive> create table student(id int, name string);

  (6)显示数据库中有几张表

    hive> show tables;

  (7)查看表的结构

    hive> desc student;

  (8)向表中插入数据

    hive> insert into student values(1000,"ss");

  (9)查询表中数据

    hive> select * from student;

  (10)退出hive

    hive> quit;

 

三、 将本地文件导入Hive案例

需求

将本地/opt/module/datas/student.txt这个目录下的数据导入到hive的student(id int, name string)表中。

  3.1.数据准备

   在/opt/module/datas这个目录下准备数据

   (1)在/opt/module/目录下创建datas

[atguigu@hadoop102 module]$ mkdir datas

 

   (2)在/opt/module/datas/目录下创建student.txt文件并添加数据

[atguigu@hadoop102 datas]$ touch student.txt

[atguigu@hadoop102 datas]$ vi student.txt

1001   zhangshan

1002   lishi

1003   zhaoliu

注意以tab键间隔。

回到hive,将数据导入,语句如下。

load data local inpath "/data/app/datas/student.txt" into table student;

  3.2.Hive实际操作

  (1)启动hive

    [atguigu@hadoop102 hive]$ bin/hive

  (2)显示数据库

    hive> show databases;

  (3)使用default数据库

    hive> use default;

  (4)显示default数据库中的表

    hive> show tables;

  (5)删除已创建的student表

    hive> drop table student;

  (6)创建student表, 并声明文件分隔符’\t’

    hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

  (7)加载/opt/module/datas/student.txt 文件到student数据库表中。

    hive> load data local inpath '/opt/module/datas/student.txt' into table student;

  (8)Hive查询结果

    hive> select * from student;

    OK

    (1001),    (zhangshan)

    1002   lishi

    1003   zhaoliu

    Time taken: 0.266 seconds, Fetched: 3 row(s)

  3.3.遇到的问题

  再打开一个客户端窗口启动hive,会产生java.sql.SQLException异常。

 Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException:

   Unable to instantiate

   org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

          at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)

          at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)

          at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

          at java.lang.reflect.Method.invoke(Method.java:606)

          at org.apache.hadoop.util.RunJar.run(RunJar.java:221)

          at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

  Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

          at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1523)

          at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:86)

          at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132)

          at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104)

          at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3005)

          at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3024)

          at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:503)

    ... 8 more

 

   原因是,Metastore默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore;

四、Mysql安装(参考我同学的博客)

  Ubuntu下安装mysql和可视化工具超级简单教程

五、Hive元数据配置到Mysql

  5.5.1 驱动拷贝

    1.在/opt/software/mysql-libs目录下解压mysql-connector-java-5.1.27.tar.gz驱动包

[root@hadoop102 mysql-libs]# tar -zxvf mysql-connector-java-5.1.27.tar.gz

 

    2.拷贝/opt/software/mysql-libs/mysql-connector-java-5.1.27目录下的mysql-connector-java-5.1.27-bin.jar到/opt/module/hive/lib/

[root@hadoop102 mysql-connector-java-5.1.27]# cp mysql-connector-java-5.1.27-bin.jar

 /opt/module/hive/lib/

  5.5.2 配置Metastore到MySql

    1.在/opt/module/hive/conf目录下创建一个hive-site.xml

[atguigu@hadoop102 conf]$ touch hive-site.xml

[atguigu@hadoop102 conf]$ vi hive-site.xml

    2.根据官方文档配置参数,拷贝数据到hive-site.xml文件中

      https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

   <property>

     <name>javax.jdo.option.ConnectionURL</name>

     <value>jdbc:mysql://hadoop102: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>000000</value>

     <description>password to use against metastore database</description>

   </property>

</configuration>

 

      3.配置完毕后,如果启动hive异常,可以重新启动虚拟机。(重启后,别忘了启动hadoop集群)

  5.5.3 多窗口启动Hive测试

      1.先启动MySQL

[atguigu@hadoop102 mysql-libs]$ mysql -uroot -p000000

 

查看有几个数据库


mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+

      2.再次打开多个窗口,分别启动hive

        

[atguigu@hadoop102 hive]$ bin/hive

 

      3.启动hive后,回到MySQL窗口查看数据库,显示增加了metastore数据库

 mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| metastore          |

| mysql             |

| performance_schema |

| test               |

+--------------------+

六、HiveJDBC访问

  6.1 启动hiveserver2服务

[atguigu@hadoop102 hive]$ bin/hiveserver2

  6.2 启动beeline

 

[atguigu@hadoop102 hive]$ bin/beeline

Beeline version 1.2.1 by Apache Hive

beeline
>

 

  6.3 连接hiveserver2

beeline> !connect jdbc:hive2://hadoop102:10000(回车)

Connecting to jdbc:hive2://hadoop102:10000

Enter username for jdbc:hive2://hadoop102:10000: atguigu(回车)

Enter password for jdbc:hive2://hadoop102:10000: (直接回车)

Connected to: Apache Hive (version 1.2.1)

Driver: Hive JDBC (version 1.2.1)

Transaction isolation: TRANSACTION_REPEATABLE_READ

0: jdbc:hive2://hadoop102:10000> show databases;

+----------------+--+

| database_name  |

+----------------+--+

| default        |

| hive_db2       |

+----------------+--+

七、ive常用交互命令

[atguigu@hadoop102 hive]$ bin/hive -help

usage: hive

 -d,--define <key=value>          Variable subsitution 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 subsitution 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)

  1.“-e”不进入hive的交互窗口执行sql语句

[atguigu@hadoop102 hive]$ bin/hive -e "select id from student;"

  2.“-f”执行脚本中sql语句

        (1)在/opt/module/datas目录下创建hivef.sql文件

[atguigu@hadoop102 datas]$ touch hivef.sql

文件中写入正确的sql语句

select *from student;

        (2)执行文件中的sql语句

[atguigu@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql

   (3)执行文件中的sql语句并将结果写入文件中

[atguigu@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql  > /opt/module/datas/hive_result.txt

八、Hive其他命令操作

  1.退出hive窗口:

hive(default)>exit;

hive(default)>quit;

在新版的hive中没区别了,在以前的版本是有的:

exit:先隐性提交数据,再退出;

quit:不提交数据,退出;

  2.在hive cli命令窗口中如何查看hdfs文件系统

hive(default)>dfs -ls /;

  3.在hive cli命令窗口中如何查看本地文件系统

hive(default)>! ls /opt/module/datas;

  4.查看在hive中输入的所有历史命令

1)进入到当前用户的根目录/root或/home/atguigu

       (2)查看. hivehistory文件

    [atguigu@hadoop102 ~]$ cat .hivehistory

九、压缩和存储

  1. 资源准备

    1.1  虚拟机能连接外网;

    1.2  Jar包准备(Hadoop源码,jdk8,maven,protobuf);

    (1)hadoop-2.7.2-src.tar.gz

    (2)jdk-8u144-linux-x64.tar.gz

    (3)snappy-1.1.3.tar.gz

    (4)apache-maven-3.0.5-bin.tar.gz

    (5)protobuf-2.5.0.tar.gz

     需要的可以私聊我Q:770958391

  2. jar包安装(所有操作均要在root用户下完成)

    2.1 jdk安装(不再赘述)

    2.2 Maven解压,配置MAVEN_HOME 和 PATH

[root@hadoop101 software]# tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/

[root@hadoop101 apache-maven-3.0.5]# vi /etc/profile

#MAVEN_HOME

export MAVEN_HOME=/opt/module/apache-maven-3.0.5

export PATH=$PATH:$MAVEN_HOME/bin

[root@hadoop101 software]#source /etc/profile

验证命令:mvn -version

   3.  编译源码

    3.1.准备编译环境

[root@hadoop101 software]# yum install svn

[root@hadoop101 software]# yum install autoconf automake libtool cmake

[root@hadoop101 software]# yum install ncurses-devel

[root@hadoop101 software]# yum install openssl-devel

[root@hadoop101 software]# yum install gcc*

    3.2.编译安装snappy

[root@hadoop101 software]# tar -zxvf snappy-1.1.3.tar.gz -C /opt/module/

[root@hadoop101 module]# cd snappy-1.1.3/

[root@hadoop101 snappy-1.1.3]# ./configure

[root@hadoop101 snappy-1.1.3]# make

[root@hadoop101 snappy-1.1.3]# make install

  # 查看snappy库文件

 [root@hadoop101 snappy-1.1.3]# ls -lh /usr/local/lib |grep snappy

    3.3.编译安装protobuf

[root@hadoop101 software]# tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/

[root@hadoop101 module]# cd protobuf-2.5.0/

[root@hadoop101 protobuf-2.5.0]# ./configure 

[root@hadoop101 protobuf-2.5.0]#  make 

[root@hadoop101 protobuf-2.5.0]#  make install

# 查看protobuf版本以测试是否安装成功
[root@hadoop101 protobuf-2.5.0]# protoc --versio

    3.4.编译hadoop native

[root@hadoop101 software]# tar -zxvf hadoop-2.7.2-src.tar.gz

[root@hadoop101 software]# cd hadoop-2.7.2-src/

[root@hadoop101 software]# mvn clean package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/local/lib -Dbundle.snappy

执行成功后,/opt/software/hadoop-2.7.2-src/hadoop-dist/target/hadoop-2.7.2.tar.gz即为新生成的支持snappy压缩的二进制安装包。

十、Hadoop压缩配置

   1. 开启Map输出阶段压缩

    开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。具体配置如下:

  案例实操:

    1.1.开启hive中间传输数据压缩功能

      hive (default)>set hive.exec.compress.intermediate=true;

    1.2.开启mapreduce中map输出压缩功能

      hive (default)>set mapreduce.map.output.compress=true;

    1.3.设置mapreduce中map输出数据的压缩方式

      hive (default)>set mapreduce.map.output.compress.codec=

       org.apache.hadoop.io.compress.SnappyCodec;

    1.4.执行查询语句

        hive (default)> select count(ename) name from emp;

  2. 开启Reduce输出阶段压缩

    当Hive将输出写入到表中时,输出内容同样可以进行压缩。属性hive.exec.compress.output控制着这个功能。用户可能需要保持默认设置文件中的默认值false,这样默认的输出就是非压缩的纯文本文件了。用户可以通过在查询语句或执行脚本中设置这个值为true,来开启输出结果压缩功能。

  案例实操:

    2.1.开启hive最终输出数据压缩功能

hive (default)>set hive.exec.compress.output=true;

    2.2.开启mapreduce最终输出数据压缩      

hive (default)>set mapreduce.output.fileoutputformat.compress=true;

    2.3.设置mapreduce最终数据输出压缩方式

hive (default)> set mapreduce.output.fileoutputformat.compress.codec =

       org.apache.hadoop.io.compress.SnappyCodec;

    2.4.设置mapreduce最终数据输出压缩为块压缩

hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;

    2.5.测试一下输出结果是否是压缩文件

hive (default)> insert overwrite local directory

       '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;
posted @ 2019-09-06 14:16  瓜大wjs  阅读(297)  评论(0编辑  收藏  举报