hive的设计思想和技术框架

2019/2/20 星期三

此笔记参考2017年 优化与2019/2/20 星期三

Hive的设计思想和技术架构
Hive的基础
Hive是一种数据仓库工具,他的功能是讲SQL语法表达的数据运算逻辑转换为mapreduce程序在hadoop集群上对海量数据进行分析 //hive表是可以创建索引的 https://www.iteblog.com/archives/836.html //Hive创建索引
hive的设计思想
库:sql语法表达成MapReduce的jar库
因为,sql语法相对是一个规则的东西,我们把sql语法用MapReduce来表达出来,形成一个库

翻译器:可以接受sql语句,然后去翻译,查找一个特定的mr程序。

1、翻译器接受sql语句,然后去翻译,
2、到sql库中查找一个特定的mr程序。
3、提交hadoop集群上执行MR job

其实:hive就是翻译器+库+元数据库 这三者封装起来就是hive

hive中建立表语句:其实就是建立一种映射关系,这种映射关系就是表名,表里面的字段,字段跟hdfs路径上的字段怎么对应起来,他要记录这些信息,把这些信息记录在元数据库中

hive的技术架构 //见图
其中最重要的是driver:包括 编译器,优化器,执行器
metastore 元数据库:可以是mysql,他自身携带了一个叫derby的数据库

安装hive
首先在官网下载hive,上传到linux中 解压到我们安装的目录下面,这里我们是安装在/usr/local/apps/下的
tar -zxvf hive(压缩包) -C /usr/local/apps/
然后我们到安装目录下查看
cd /usr/local/apps/
hive 这个工具是不需要再每台机器上安装,他提供一个界面给我们,把SQL变成mr程序,提交给hadoop集群去执行,所以他在那边运行都没关系
hive
hive依赖与hadoop的集群环境,他运算所用的框架是mr所以在运行hive之前要确保hadoop的开启
首先 start-dfs.sh
start-yarn.sh
然后在hive的安装包下的bin目录下有一个hive可以直接运行hive
./hive
这样就启动起来了
进入hive> 他是支持sql语句的,我们来执行show databases
show table

hive的4中使用方式:https://blog.csdn.net/ansiallen/article/details/79427468 //参考链接
1、Hive交互shell
bin/hive
2、hive启动服务,为客户端提供服务
bin/hiveserver2 //cdh版本安装就是用的这种方式。分为hive的客户端和服务端
3、Hive命令
hive -e ‘show databases’
bin/hive -e 'use itcast; show tables;select * from emp_add_sp;'
4、Hive JDBC服务(参考java jdbc连接mysql)
备注:在cdh中hiveserver2安装在那台服务器上才可以用hive shell进入到hive后台
我们的测试都是在cdh集群上,cdh建议使用方法2 beeline方式连接hive
方法1
[root@hadoop-node01 ~]# hive shell

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/jars/hive-common-1.1.0-cdh5.9.2.jar!/hive-log4j.properties
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
使用jar中的配置初始化日志:file:/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/jars/hive-common-1.1.0-cdh5.9.2.jar!/ hive-log4j.properties
警告:不推荐使用Hive CLI,建议迁移到Beeline。
hive> show databases;
OK
default
Time taken: 1.021 seconds, Fetched: 1 row(s)

方法3
[root@hadoop-node01 ~]# beeline -u "jdbc:hive2://192.168.0.121:10000"
scan complete in 2ms
Connecting to jdbc:hive2://192.168.0.121:10000
Connected to: Apache Hive (version 1.1.0-cdh5.9.2)
Driver: Hive JDBC (version 1.1.0-cdh5.9.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.1.0-cdh5.9.2 by Apache Hive
0: jdbc:hive2://192.168.0.121:10000> show databases;
INFO : Compiling command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d): show databases
INFO : Semantic Analysis Completed
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO : Completed compiling command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d); Time taken: 0.171 seconds
INFO : Executing command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d): show databases
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d); Time taken: 0.067 seconds
INFO : OK
+----------------+--+
| database_name |
+----------------+--+
| default |
+----------------+--+
1 row selected (0.369 seconds)

方法3
[root@hadoop-node01 ~]# hive -e 'show databases;'

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/jars/hive-common-1.1.0-cdh5.9.2.jar!/hive-log4j.properties
OK
default
Time taken: 1.659 seconds, Fetched: 1 row(s)

方法4:略
——————————————————————————————————————————————————————————————————————————————————————————————
这样其实hive就可以用了
hive>create table t_order(

id int,produce_id string,numble int,amount double)
row format delimited(这句话的意思是,文件里的一行就是我们这个表中的一条记录)
fields terminated by ',';(这句话的意思是:我们用','作为分隔符)
然后show table 看表在不在
随后我们在表中导入数据
首先我们要在集群中创建一个文件(随便那台机器上去做)
mkdir hivedata
cd hivedata/
vi order.data.1
在这里面我们存入我们的数据
我们linux本地会有这个文件,我们需要上传到hdfs文件中
hadoop fs -put order.data.1 /user/hive/warehouse/t_order
网页中刷新一下,就可以找到order.data.1这个文件
然后我们就可以再hive这边查询这个文件了
hive >select from t_order;(就会查看到我们刚刚在order.data.1中所写的数据)
hive >select count(
) from t_order;(计数)
用mapreduce程序去跑,计数出有多少个数据值。
hive >select distinct(priduce_id) from t_order;(查询一下订单中不重复是商品id)

其实上传的时候我们可以再hive中使用命令去从本地上传到hive中
hive >load data local inpath '/root/order.data.1' into table t_order;
在这之前,我们是在另外的机器上去建order.data.1 所以我们需要拷贝到主机00 的机器上去
scp order.data.1 hadoop-server-00:/root/

hive >select * from t_order;(只有这个语句不需要转换为mr语句)

hive >select id,product_id from t_order;(只查询id,prdcuct_id 需要转换为mr语句去执行)

hive的内部表和外部表的区别(对hive来说内部表和外部表的区别也就是文件存放的位置不同,但是对于hive的管理来说,就有区别 当我们删除内部表的时候[dorp table t_order] 在 show tables 的时候就没有了,同时在/user/hive/warehouse/的表都删除了,hdfs里面是数据都没有了。而外部表[dorp table t_product] 然后show tables hive里面也把对 t_product这个表的描述信息也删除了,但是在hdfs里面的数据还是存在的)
内部表是创建的表必须放在/user/hive/warehouse 这个目录下
而外部表不需要必须放在/user/hive/warehouse下面 可以放在hdfs文件系统的任何位置
创建外部表的语句:
hive>create external table t_product(

id int,produce_id string,numble int,amount double)
row format delimited(这句话的意思是,文件里的一行就是我们这个表中的一条记录)
fields terminated by '\t'(这句话的意思是:我们用'tab'作为分隔符)
location '/diangshang/product';(指定这个表放在哪里 放在hdfs的根目录下的diangshang/product)
然后show table
到网页上去看看

有两个表之后接下来我们做个链表查询
hive >select o.id,o.produce_id,p.typeid,p.color,o.numble,o.amount

from t_order o join t_product p (这里的o p 分别代表着两个表的别名)
on o.produce_id=p.id;

linux中mysql数据库的安装
首先查询一下,你的linux系统中是否安装了mysql
rpm -qa mysql
如果出来mysql那就说明安装过了,接下来我们就需要卸载原来安装的
rpm -e mysql  // 普通删除模式
rpm -e --nodeps mysql  // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除(这里我们推荐强力删除)
删除后我们再查询一下有没有卸载干净
rpm -qa mysql
进入到mysql的文件夹中
cd mysql文件夹
初始化数据库
scripts/mysql_install_db --user=mysql
[这些命令都不是必须的
chown -R root .(修改 文件的 所有者)(.代表当前目录)
chown -R mysql data(也就是把data从root用户改成mysql)(修改data文件夹的所有者)
chgrp -R mysql .(改变用户组)]

启动mysql
bin/mysqld_safe --user=mysql &(&表示:以后台的方式启动)
没有错误就代表启动成功
netstart -anp |more (查看mysql的端口号3306)
使用mysql
在bin目录下面有一个mysql
./mysql -u root -p
系统提示你输入密码
一开始密码为空

如果希望在任何一个目录下都可以进入mysql,则需要在/root/etc/profile添加路径

hive元数据库配置
hive自身也带了一个元数据库叫derby数据库 derby这个数据库系统产生的信息放在merastoer_db里面 利用derby这个数据库只是保存了表的描述信息,并不会用这个数据库去保存hive表里面的内容,hive表里面的内容是海量的巨大的,我们把他放在hdfs文件里面的
hive自带的元数据量derby有一个巨大的弊端 弊端是:derby这个数据库只能是单实例的去访问,也就是说,只能是一个人去操作,不支持多人操作
所以我们要修改hive所默认的berby元数据库,我们只需要在conf目录下加一个hive-site.xml
cd conf/
vi hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-server-00:3306/hive?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>

保存退出

mysql -uroot -proot (连接mysql数据量,用户名是root 密码是root)

接下来要把jdbc的驱动com.mysql.jdbc.Driver放到hive/lib 里面
首先,我们在CRT中的sftp中切换到hive/lib
cd /root/usr/local/apps/hive- /lib
put 驱动在windows的位置
就上传到了lib中
这样就可以用了,不管在哪里启动hive都可以多人访问hive了

猜你喜欢

转载自blog.51cto.com/12445535/2352588