1.hadoop:
1. hdfs:
- 存储思想
文件上传、文件下载、元数据合并 - 四大机制:
- 心跳、选择、心跳频率、死亡时间
- 机架、负载均衡、安全模式
- 磁盘元数据、内存元数据
- 安全模式退出的检查标准
- 操作:shell
2.mapreduce:
-
原理:
- maptask的并行度
- reducetask的并行度
- shuffle ****
-
操作:
wc map的key的设计 场景 join mapjoin 分区 **** 排序 *** 分组 **** combiner *****
yarn:
产生背景:
hadoop1.0的模块:
-
hdfs 分布式存储的
-
mapreduce 分布式计算的 map/reduce v1
启动job的时候,对应的进程jobtracker tasktracker
主从结构 -
jobtracker:(类似于yarn–resourcemanager)
mr程序运行的老大
1. 资源的分配
2. 启动所有的应用程序 跟踪每一个应用程序的运行状态
3. 不存在高可用的配置方案的 存在单点故障的 -
tasktracker:
负责为应用程序提供资源
强行的将每一个节点的资源分为2部分:
1.mapslot-----只能用于运行maptask任务
2.reduceslot----只能用于运行reducetask的任务
这种资源的分配方式严重的缺点:
不能合理利用资源 -
map/reduce V1:
1)扩展性差 2)可靠性低 不支持高可用的配置 存在单点故障 3)资源利用率低 4)map/reduce V1只能支持mapreduce任务的执行 不能调度其他的计算任务 yarn:spark on yarn
hadoop2.0
模块:HDFS MAPREDUCE YARN
YARN的架构:
主从架构的 resourcemanager nodemanager
1. 主节点:resourcemanager
整个资源调度的老大
1)负责为每一个job分配资源
2)负责启动当前job的老大 MRappmaster
3)负责管理所有的nodemanager
监控从节点的资源状况 存活状况
组成:
1.1 ASM:
- applicationsmanager:管理所有的应用程序
- 所有job的管理者
- 管理所有的job的MRappmaster
- 负责mrappmaster启动,及mrappmaster的运行状态的监控 失败重启
1.2 Scheduler:
- 调度器
- yarn上提交多个job的时候 调度器就负责哪一个任务先执行 哪一个任务后执行
- job的运行顺序问题
分类:
FIFO:FIRST IN FIRST OUT 先进先出
- 内部维护一个队列 先提交的job在队列的最前面
- 优先调度队列前面的
- 按job提交的先后顺序进行调度的
- 缺陷:如果前面提交的任务都是大的任务,造成后面的任务需要等待很长时间
Fair:公平调度器
- 第一个提交的任务 全部的资源执行这个任务
- 第一个任务执行的过程中 又提交了一个任务 两个job平分资源 每个job占用一半资源
- 如果又提交一个 资源在进行平分 每一个job占用1/3
- 多个job平分资源的
- 缺点:每一个任务的计算量不一样 如果说有一个任务计算量很大 会造成这个任务的运行时间比较长的
Capacity:计算能力调度器 容量调度器
-
可以根据job的实际的运行的任务 进行一个手动的资源的划分
-
内部维护的是多个队列
-
每一个队列都是先进先出的 FIFO
-
用户可以配置每一个队列的资源配比
队列1: 70% 队列2: 30% 默认的调度器:capacity
从节点:nodemanager
-
负责给计算任务真正的提供资源的
-
nodemanager提供资源的时候以Container为单位进行提供的
-
Container:逻辑资源容器 虚拟资源容器
-
逻辑/虚拟:这部分资源没有真正的从节点中划分出来的
-
资源容器:封装了一定的资源(CPU 内存 网络 IO)的容器
-
封装了一定的资源的容器,但是这部分资源没有真正的从节点中物理划分出来
-
nodemanager在提供资源的时候 要么n(正整数)的个container 要么是0个
作用:
1)为计算程序真正的提供资源
2)接受resourcemanager的命令,并处理
3)向resourcemanager发送心跳 告诉resourcemanager自己的存活状况
4)接受并处理MRappmaster的命令
概念:
运行一个计算程序,满足的条件
1)程序
2)资源
3)数据
MRappmaster:
每一个job启动的时候 会最先启动一个这个job对应的MRappmaster
wc job------wc MRappmaster
PI----- PI MRappmaster
一旦启动,
1)负责向resourcemanager申请maptask reducetask的资源
2)负责启动当前job的maptask任务和reducetask任务
3)负责跟踪每一个maptask reducetask的运行状态
4)将失败的maptask reducetask任务进行重启
yarn的资源调度过程:
1)客户端向resourcemanager发送一个提交job的请求
hadoop jar …jar … … …
任务先提交给ASM,向ASM进行注册
ASM将任务转交给Scheduler
2)一旦有资源,调度器开始提交job的运行
resourcemanager(ASM)到对应的资源上启动当前应用程序的MRappmaster
3)MRappmaster向resourcemanager申请运行maptask和reducetask的资源
4)resourcemanager向MRappmaster返回资源节点
5)MRappmaster到对应的节点上启动Container,并在这个container中
启动maptask任务和reducetask任务
6)maptask和reducetask运行过程中向MRappmaster汇报自己的运行状态
和进度
7)maptask或reducetask运行完成就会向MRappmaster汇报
MRappmaster 进行资源销毁释放资源
8)所有的maptask和reducetask运行完成,MRappmaster向resourcemanager注销自己
释放资源
job的提交过程 ****
共享资源:
/tmp/hadoop-yarn/staging/hadoop/.staging/job_1541742916235_0015/job.jar
/tmp/hadoop-yarn/staging/hadoop/.staging/job_1541742916235_0015/job.split
/tmp/hadoop-yarn/staging/hadoop/.staging/job_1541742916235_0015/job.splitmetainfo
/tmp/hadoop-yarn/staging/hadoop/.staging/job_1541742916235_0015/job.xml
job.jar job.split job.splitmetainfo job.xml
job.jar 原始jar包
job.split
job.splitmetainfo 当前job的切片信息 对应的maptask的并行度
job.xml job的配置文件 job中所有的相关设置
job.getConfiguration()
maptask或reducetask从共享资源下载的文件在本地的目录:
/home/hadoop/data/hadoopdata/nm-local-dir/usercache/hadoop/appcache
yarn为mapreduce任务资源调度服务的
注意:
1)第10步中rm向mrappmaster返回maptask的资源节点的时候
优先返回当前的mr任务的数据所在节点
数据本地化原则
如果说mr任务输入的数据的数据块存储的节点没有资源了
这个时候rm会就近原则进行返回节点
同机架
不同机架 同机房
2)安装集群的过程中,配置的从节点既是hdfs的从节点datanode
也是yarn的从节点 nodemanager
集群的运行过程中 nodemanager节点必然是datanode节点
nodemanager:提供资源 运行程序
datanode:提供数据存储
这么配置的原因:数据在哪 计算在哪
mr的设计原则:移动计算比移动数据更划算 计算向数据靠近
补充:
shuffle:
80M溢写完成之后会移动元数据和原始数据形成背对背的结构
形成一个新的分界线
hive
数据仓库
产生的背景:
hadoop中hdfs负责存储,mapreduce负责统计分析
单词统计
学生成绩统计 topN 平均分 结构化数据
流量统计 一个手机号的所有的上行流量 下行流量 总流量 结构化数据
join 结构化数据
上面的需求,如果数据量小的时候,这些针对结构化数据的分析sql是最方便 高效的开发方式
但是现在数据量大了 所以用MR框架
缺点:
开发的成本高
用人成本
招聘 java MR
主流的语言 java c python
时间成本:
开发的周期比较长的
如果可以有一个组件,提供sql编程,分布式运行计算程序就好了
hive就是干这个
hive就是对外提供hql编程(方言版的sql),将hql转换为MR任务的工具
hive底层数据hdfs的,计算使用的MR
hive相当于对hadoop做了一层上层封装
hive可以看做值hadoop的另外一种模式的客户端
hive可以极大的降低结构化数据分析的成本
对于半结构化或非结构化的数据hive是不可以分析的
Hive是什么?
1.Hive 由 Facebook 实现并开源
apache基金会的顶级项目
http://hive.apache.org/
2.是基于 Hadoop 的一个数据仓库工具
数据仓库和数据库区别
1)概念
数据仓库:数据仓库更倾向于数据管理
管理的数据可以不是存储在自己本地的数据
通常用于大批量的数据管理
数据库:
存储的数据一般在自己的本地
通常用于存储小批量的数据 一般用于存储结果数据
2)使用
数据仓库:hql 方言sql
数据库:
mysql 标准sql
nosql 数据库 自己的一套shell
3)应用场景上
OLAP On line Analysis Processing
联机分析处理 查询 数据仓库
hive中不支持事务的
hive中甚至不支持update delete操作 支持insert 但是性能比较低
OLTP On line Transaction Processing
联机事务处理 增删改的操作 数据库
4)模式上
数据仓库:hive
读模式
数据库:
关系型数据库写模式
分布式的数据库的模式不确定
3.可以将结构化的数据映射为一张数据库表
在hive中指定一份结构化的数据,就可以用hive中的表进行关联
数据文件的一行数据-----hive表中的一条数据
数据文件中的一个字段---hive表中的一列
computer,huangxiaoming,85
computer,xuzheng,54
computer,huangbo,86
4.并提供 HQL(Hive SQL)查询功能
hive对外提供hql查询
5.底层数据是存储在 HDFS 上
hive的原始数据存储的hdfs的,在hdfs上有一个hive的默认目录
称为hive的家目录,hive中存储的所有的表数据默认存储在hive的
家目录下
6.Hive的本质是将 SQL 语句转换为 MapReduce 任务运行
在hive的底层会保存很多map和reduce模板
hive最后将hql语句翻译成map reduce任务
7.使不熟悉 MapReduce 的用户很方便地利用 HQL
处理和计算 HDFS 上的结构化的数据
8.适用于离线的批量数据计算
依赖于hadoop
hive的优缺点:
优点:延展性 自定义函数
缺点:
1)不支持事务
2)不支持行级别的update delete操作
目前支持insert的操作 性能低
3)查询的延时性高 不适合实时
hive的架构:
1)用户接口层:CLI shell访问
ODBC/JDBC 代码
WEB UI 网页访问 不用 1)配置复杂 2)丑
2)Thrift Server:跨语言服务层 c java python
将各个语言 翻译成hive识别的操作符
3)元数据库层:
元数据库存储的是用于描述hive中的库或表或表字段的信息的数据
hive的元数据是结构化数据存储的,hive的元数据存储在关系型数据库的
默认存储在derby的数据库的 一般情况下我们会改为mysql
hive中表:stu(id int,name String,age int)
元数据:表名 表的字段 字段的顺序 字段的类型
原始数据:存储的是表中的数据
例如:表中一条数据:1,zs,34 存储在hdfs的
4)驱动层
(1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
(2) 编译器:编译器是将语法树编译为逻辑执行计划 初步构思
(3) 优化器:优化器是对逻辑执行计划进行优化 相同的任务进行合并
(4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划
hive的安装:
安装准备:
jdk
hadoop
mysql
安装好的
安装节点:
一个节点
安装的版本:
下载安装包的镜像站:
http://mirror.bit.edu.cn/apache/hive/
http://mirrors.hust.edu.cn/apache/hive/
http://mirrors.shu.edu.cn/apache/hive/
http://mirrors.tuna.tsinghua.edu.cn/apache/
hive2.3.2版本
1.2.1 版本
安装:
1)元数据库使用自带的derby数据库
步骤:
1)上传安装包
2)解压
tar -xvzf apache-hive-2.3.2-bin.tar.gz
3)配置环境变量
为了方便集群的版本升级,可以先创建软连接
ln -s apache-hive-2.3.2-bin hive
配置换变量:
sudo vi /etc/profile
export HIVE_HOME=/home/hadoop/apps/hive
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
source /etc/profile
4)元数据库初始化
schematool -dbType derby -initSchema
schemaTool completed 证明初始化成功
注意:元数据初始化不成功的时候不要启动hive
初始化完成后会发现在初始化的目录下,会多两个文件
derby.log derby的日志文件
metastore_db 存放元数据库的
5)启动
hive
hive> hive的客户端操作界面 可以执行hive的shell
对于hive来说sql的绝大多数是可以使用的
直接启动发现报错
元数据库报错 元数据的实例化报错
FAILED: SemanticException
org.apache.hadoop.hive.ql.metadata.HiveException:
java.lang.RuntimeException: Unable to
instantiate
org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
这种方式在哪一个目录初始化 在哪一个目录启动 没有问题的
切换目录,报错:
FAILED: SemanticException org.apache.hadoop.hive.ql.metadata
.HiveException: java.lang.RuntimeException:
Unable to instantiate
org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
derby这种方式启动的时候只会读取启动目录下的元数据库,
切换目录后启动目录下没有元数据信息了,所以报错
缺陷:
元数据信息无法共享的
本目录只能访问本目录下的元数据信息
只适合单用户使用 不适合多用户
2)元数据库为mysql的安装方式
1)安装mysql并配置好mysql的用户名密码
yum安装mysql
1)配置yum源
在/mnt创建目录cdrom
mkdir cdrom
挂载
sudo mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom/
配置本地的yum源
cd /etc/yum.repos.d/
sudo rename .repo .repo.bak *
sudo cp CentOS-Media.repo.bak CentOS-Media.repo
sudo yum clean all
yum repolist
2)安装mysql
sudo yum install -y mysql-server
sudo service mysqld start
3)修改mysql的用户名 密码
use mysql;
delete from user where user=’’;
update user set host=’%’ where host=‘localhost’;
update user set password=PASSWORD(‘123456’) where user=‘root’;
flush privileges;
退出mysql
重启mysql服务
2)上传hive的安装包
3)解压hive的安装包
4)修改环境变量
5)修改hive的配置文件
/home/hadoop/apps/hive/conf
touch hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value>
<description>元数据库的连接url,myhive指的是hive的元数据在mysql中的库名</description>
<!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop02 为 localhost -->
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>指定元数据库mysql的驱动类</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>元数据库mysql的用户名</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>元数据库mysql的密码</description>
</property>
</configuration>
6)将mysql的驱动包放在hive的依赖库lib下
7)初始化hive的元数据库
schematool -dbType mysql -initSchema
schemaTool completed
8)启动hive
hive >
hive初体验:
create database test;
use test;
建表关联score数据
math,huangxiaoming,85
create table stu(course string,name string,score int) row
format delimited fields terminated by ',';
row format行格式化
delimited 分界
fields terminated 列分界符
lines terminated by '\n' 行分割符
本地数据加载到表中
load data local inpath '/home/hadoop/tmpdata/score' into table stu;