Hive入门
复习Hadoop:
1、Hadoop是什么
存储 HDFS
计算 MapReduce
资源调度 YARN
2、HDFS的访问方式
Shell CLI :Hadoop/hdfs fs ……
Java API :FileSystem
Web UI:HUE/Hadoop自带UI
3、Hadoop的常用操作
HDFS:mkdir put get rm mv
问题:copy vs mv
MR:mr的执行流程(一定要掌握的)
YARN:mr作业跑在yarn之上,杀死yarn上的作业,提交的时候指定的一些重要的参数。
问题:使用MapReduce实现join、mapjoin的功能?
===>非常繁琐
wordcount
明白:MR是非常麻烦的
Hive的产生背景:
1、MR编程不便性
2、传统的RDBMS人员的需求
HDFS上面的文件就是普通的文件,它并没有schema的概念
schema:RDBMS中的表结构
people.txt <== id name age address
sql ===> 搞定海量数据的统计分析
===> 产生Hive
Hive
分布式系统:HDFS/S3
问题:HDFS存的是近期的数据
1min:几百G
冷数据:定期的移走S3 table的location指向S3
FaceBook开源
目的是解决海量结构化日志数据的统计文件
构建在Hadoop之上的数据仓库
数据存储子HDFS之上
计算时使用MR
弹性:线性扩展
Hive底层的执行引擎:MapReduce、Tez、Spark
Hive定义一种类似SQL的查询语言:HQL
问题:HQL和SQL的关系?
什么关系都没有,只是语法类似
很多的SQL on Hadoop的语法都是和RDBMS非常类似的
Hive常用于:离线批处理
SQL ===> MR:把SQL语句翻译成MapReduce作业,并提交到YARN上运行
问题:是否智能、执行计划(sql是如何翻译成mr作业)
高级:UDF
版本
Stinger Plan:
Phase 1 0.11 ORC HiveServer2
Phase 2 0.22 ORC improvement
Phase 3 0.13 Vectorized query engine & Tex
Stinger.next Phase 1 0.14 CBO
为什么要使用Hive
1)、简单易用
2)、弹性
3)、统一的元数据管理
元数据存放在哪里呢?
metadata mysql
统一:SQL on Hadoop都是能够共享的
Hive/Pig/Impala/Spark SQL/Presto
问题:Hive的数据存放在哪里?
HDFS + metadata
Hive体系架构
测试环境部署架构:
客户端(client、web、idbc)发送HQL语句到Hive(可以存放数据在MySQL或者Derby)上,最后作业提交到Hadoop集群上。
问题:Hive需要集群吗?
Hive不需要集群,可以理解Hive为一个客户端。
问题:存在什么缺陷?
一个MySQL在生产中可能存在单点故障,所以需要准备两个MySQL,一个是active一个是standby,一台机器出现问题,另外一台机器运行。
Hive部署架构
Hive VS RDBMS
Hive的缺点:
慢、非实时、延时性比较高
Hive环境的搭建
wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz
tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app
1)添加HIVE_HOME到系统环境变量:
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
export PATH=$HIVE_HOME/bin:$PATH
2)Hive配置修改
hive-env.sh
HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
hive-site.xml 统一元数据管理
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/ruozedata_basic02(数据库名)?createDatabaseIfNotExist=true(当数据库不存在的时候,自动创建数据库)</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>root</value>
</property>
</configuration>
3)拷贝MySQL驱动包到$HIVE_HOME/lib
如果没有拷贝MySQL驱动包,启动hive会报错:
The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH.
Please check your CLASSPATH specification,
and the name of the driver.
4)权限问题
创建表失败:
FAILED: Execution Error,
return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
MetaException(message:For direct MetaStore DB
connections, we don't support retries at the client
level.)
思路:找日志
日志在哪里:$HIVE_HOME/conf/hive-log4j.properties.template
hive.log.dir=${java.io.tmpdir}/${user.name}
hive.log.file=hive.log
问题:能不能改,如何改?
日志错误:
ERROR [main]: Datastore.Schema (Log4JLogger.java:error(115)) - An exception was thrown while adding/validating class(es) :
Specified key was too long; max key length is 767 bytes
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
解决:
alter database ruozedata_basic02 character set latin1;
【来自@若泽大数据】