大数据技术暑期实习四___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官网地址
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;