1Hive的体系架构
1.1what is hive?
由facebook开源用于解决海量结构化日志的数据统计
hive是基于hadoop的一个数据仓库工具,可以将结构化的文件映射成一张表,并提供SQL功能
hive是构建在Hadoop之上的数据仓库
hive的本质是将HQL换成mapreduce(程序内有引擎会有将输入的ql语句转化为mapreduce语句)
灵活性(可以自定义函数)和扩展性(hadoop之上)较好,支持udf,自定义存储格式
适合离线数据处理
hive功能:
1)使提取转化加载(ETL)更简便
2)映射结构化在多种数据格式上
3)文件存储在HDFS上或者Hbase
4)通过mapreduce查询
Hive与mapreduce相比的优势:
mapreduce的编程不便性,并且八股文格式编程,成本高
而hive无需复杂的编程,它可以直接写sql语句,其程序内有引擎会将ql语句转化为mapreduce程序,受众面广,使对java编程不熟悉的人也可以操作,方便简单。
Hive 是大数据仓库
底层是mapreduce, 而mapreduce 数据在hdfs上,运行在yarn上,故hive其实可以看做hadoop的一个客户端.
之所以称其为大数据仓库,第一因为hive的数据存储在hdfs上,第二因为数据的分析运作在mapreduce上,而执行程序运行在yarn上面
表的元数据存在RDNMS中(mysql或者postgrosql)
应用场景:
数据的离线处理:比如日志分析
Hive的执行延迟较高,适用于对实时性要求不高的场合
hive的优势在于处理大数据,对于处理小数据没有优势,因执行延迟较高
只能解决大众化的简单的mapreduce程序,若需要复杂的则仍需要mapreduce程序来撰写
hive的架构:
1)client客户端:有四种方式可以写命令连接hive
2)meta store存储着元数据,一般使用mysql存储元数据
3)driver驱动器(包含解析器,优化器,编译器,执行器)
解析器:解析用户写的sql语句
优化器:对逻辑执行计划进行优化
编译器(物理执行计划):将解析好的语句编译物理执行计划,如需要多少个map
执行器:将物理执行计划转化成可以允许的计划,在mapreduce上执行
4)Hadoop
mapreduce进行执行计算和分析
hdfs进行存储数据
2Hive下载、配置、启动、测试
2.1 下载
将hive安装包拖到货下载到/opt/software/目录下
权限被限制的话可以修改一下权限
将压缩包解压到/opt/modules/目录中
解压后文件名字太长看不顺眼的话可以重命名为如hive-0.13.1
2.2配置与hadoop的关联
1)打开目录/opt/modules/hive-0.31.1/下的文件hive-env.sh,修改hadoop_home的安装目录(注:目前是在伪分布式下)
HADOOP_HOME=/opt/modules/hadoop-2.5.0/
修改hive_home的配置文件目录
export HIVE_CONF_DIR=/opt/modules/hive-0.31.1/conf
2)创建目录/tmp 和目录/user/hive/warehouse,并且在hdfs之上赋予权限g+w, so that we can create a table in Hive
$bin/hdfs dfs -mkdir /tmp
$bin/hdfs dfs -mkdir -p /user/hive/warehouse
$bin/hdfs dfs -chmod g+w /tmp
$bin/hdfs dfs -chmod g+w /user/hive/warehouse
注:在创建/tmp目录与修改权限之前,ls一下看看是否已经存在,若已存在则无需创建
另外warehouse目录中存储的是在Hive中创建表的数据
2.3启动与测试
到hive-0.13.1目录启动:
$bin/hive
显示数据库并使用:
show databases //显示数据库
use default; //使用default数据库
show tables; //查看该数据库中的表格
create table student(id int,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; //创建一张表
show tables; //此时便出现了刚刚创建的student表
往表中添加数据(先准备一下数据)
$touch /opt/datas/stu.tx //创建一个文件
$vi /opt/datas/stu.tx //编辑文件添加内容
添加内容如下:
再回到hive中,将刚刚的表内容添加到student文件中,并查询表中内容
$load data local inpath '/opt/datas/stu.tx' into table student; //加载内容
$select * from student; //查询表的所有内容
$select id from student; //查询表中的某个字段,此时在mapreduce上运作
<