Hadoop总结

  • Post author:
  • Post category:其他



目录


1、什么是hadoop


2、hadoop的组成


3、大数据平台组件:主从架构


4、HDFS


4.1、hdfs操作命令


4.2、hdfs负责文件存储


4.3、block块:


4.4、角色


1、NameNode名称节点 nn


2、Secondery NameNode  第二名称节点 snn:


3、DataNode数据节点【真正干事的】dn:


4.5、架构设计


1.hdfs :


2. NameNode:


3.DataNode:


4.6、写流程


4.8、读流程


4.9、HDFS副本放置策略


4.10、安全模式


4.11、模板模式


4.12、hdfs 生产最佳实践


5、MapReduce【最重要的思想】


5.1、大数据数据处理三段论:


5.2、整个流程


5.3、Map task 个数由什么东西决定的?


5.4、Reduce task 个数由什么东西决定的?


5.5、分区


6、Yarn


6.1、架构


6.2、资源调度和隔离


6.3、架构设计


6.4、调度器【默认是容量调度器】


6.5、调优


6.5.1、yarn资源调优


7、存储hdfs


压缩文件        7.1、为什么要使用压缩


7.2、使用场景?


7.3、凡事都有两面性?


7.4、如何使用压缩?


7.5、常见的压缩格式


1、什么是hadoop

广义:以 apache hadoop软件为主的生态圈: hive、flume、hbase、kafka、spark、flink

狭义:apache hadoop软件

2、hadoop的组成

hdfs 存储 海量的数据

mapreduce  计算、分析

yarn 资源和作业的调度

存储是第一位 存储和计算是相辅相成的

3、大数据平台组件:主从架构

hdfs 存储 海量的数据:

namenode 老大 负责指挥数据的存储

datanode 小弟 主要负责数据的存储

seconderynamenode 万年老二 主要辅助namenode工作

yarn 资源和作业的调度

resourcemanager 老大 负责指挥资源分配

nodemanager 小弟真正的资源

4、HDFS

4.1、hdfs操作命令


hadoop fs -ls /

hadoop fs -mkdir file

mv cp

put上传 get下载

chmod chown  cat

补充:

hdfs回收站

fs.trash.interval 0  10080 7天

<property>

<name>fs.trash.interval</name>

<value>10080</value>

</property>

生产上:

开启回收站 回收站 有效期 至少7天以上

4.2、hdfs负责文件存储

1.文件进行拆分 文件块

2.存储 拆分 文件块

hdfs主要存储大文件,不是不能存储小文件,存储小文件会影响hdfs的性能

4.3、block块:

怎么来的:

文件拆分来的【按照块大小进行拆分】

属性:

块大小:128M

块副本数:

伪分布式:1

完全分布式:3

4.4、角色

1、NameNode名称节点 nn


1、文件名称

2、文件的目录结构

3、文件的属性、权限、创建时间 副本数据 =》metadata 【元数据:描述数据的数据】

4、blockmap块映射

不会永久持久化这个存储

是通过集群启动和运行时 dn(DataNode)定期发送blockreprot个nn来进行

动态的维护这种映射关系 mem

作用:

管理文件系统的命名空间 其实就是维护系统树的文件和文件夹

是以两种文件 永久的保存在本地磁盘

2、Secondery NameNode  第二名称节点 snn:


定期把定向文件和日志文件 拿过来合并,备份 推送个老大nn

3、DataNode数据节点【真正干事的】dn:


存储数据块和数据块的校验

作用:

1.每个3s发送一次心跳 给nn 告诉你的 我还活着

dfs.heartbeat.interval 3s

2.每隔一定时间发送一次 blockreport

dfs.blockreport.intervalMsec 21600000ms 6h

dfs.datanode.directoryscan.interval 21600s 6h

目的: 生产上 可能会发生 文件块 丢失/损坏

4.5、架构设计

1.hdfs :


HDFS has a master/slave architecture.【主从架构】

master: a single NameNode

slave:DataNodes

补充:

生产上 两个NameNode =》 hdfs ha =》 high a


2. NameNode:


1.manages the file system namespace [管理 hdfs 文件系统的命名空间]

hdfs 文件的元数据:

1.文件的名称、权限、副本

2.文件路径、文件的块信息

2.regulates access to files by clients    【对外提供服务】

3.the mapping of blocks to DataNodes【负责 映射块文件】


3.DataNode:


1.one per node in the cluster【每个节点有这个进程】

2.these blocks are stored in a set of DataNodes【负责存储数据块】

3.The DataNodes are responsible for serving read and write requests from the file system’s clients.【负责文件的读写】

a file is split into one or more blocks

4.6、写流程

对用户操作是无感知的

1、Client 调用FileSystem.crete(filepath)

去nn进行【RPC】通信

NN会去检查这个路径的文件是否已经存在,

是否有权限能够创建这个文件

假如都ok,就去创建一个新的文件,

但是这时还没有写数据,是不关联任何block

nn根据上传的文件的大小、根据块大小+副本数参数

计算要上传多少块和块存储在DN的位置

最终将这些信息 返回给客户端

【FSDataOutputStream对象】

2、Client调用【FSDataOutputStream对象】

write方法

将第一个块的第一个副本数写第一个DN节点

写完去第二个DN节点写第二个副本

写完去第三个DN节点写第三个副本

当第三个副本写完,就返回一个ack package

确认包给DN2节点

当DN2节点接收到这个ack packet确认包 加上自己也

写完了就返回一个ack package给第一个DN节点

当DN1节点收到这个ack确认包 加上自己也写完了

DN1节点

将ack package 返回给【FSDataOutputStream对象】

就表示第一个块 的三个副本 写完

其他块以此类推。。

3、当所有的块全部写完 client嗲用

【FSDataOutputStream对象】的

close方法 告诉NN文件写完了 。

4.8、读流程

对用户操作是无感知的

1、Client调用FS.open(filepath)

与NN进行RPC通讯,返回该文件的

部分或者全部的block列表

以【FSDataInputStream】对象

2、Client 【FSDataInputStream】对象

的read方法

去与第一个块的最近的DN进行读取,读取完成

会check 假如ok 就关闭与DN通信

假如读取失败 会记录 DN+block信息

下次就不会从这个节点读取。那么就从第二个节点读取

然后去与第二个块的最近的DN进行读取,以此类推

假如当block列表全部读取完成,文件还没有读取完

继续调用FS从NN获取下一个批次的block列表 以此类推

3、Client调用【FSDataInputStream】对象对象

close方法 关闭输入流

4.9、HDFS副本放置策略

机架:


生产上读写操作,选择DN节点进行读取

第一副本:

1.放置在client上传的DN节点

2.client 不在DN节点 ,就随机选择一个DN

第二个副本:

放置在第一个副本不同的机架上的某个DN节点

第三副本:

与第二个副本相同机架的不同节点上


补充:

副本数 3

如果副本数设置更多 4 就随机放置

4.10、安全模式

什么时候发生安全模式:

1、启动hadoop

2、hdfs故障【集群文件块大量丢失,说明集群不稳定,进入安全模式】

3、人为进入安全模式,跟业务有关

集群维护

对业务有什么影响:

读文件 可以

写文件 不可以

命令:

hdfs dfsadmin -safemode <enter | leave | get | wait | forceExit>

4.11、模板模式

定义顶层类 抽象类 或者接口

1.只需要把过程定义好即可

2.具体实现由子类完成

好处:

多个子类之间 实现流程一样 但是 业务不一样

4.12、hdfs 生产最佳实践

block 丢失

1.如何查看hdfs block是否丢失?

hdfs fsck /

2.hdfs block丢失 如何解决?

1.不用解决 hdfs 高容错 自动恢复 【多副本情况下】

dn  6h

2.手动进行恢复 丢失的block

hdfs debug recoverLease -path <filename> [-retries <num-retries>]


模拟 文件块丢失?

1.删除一个文件 的一个文件块 =》 删除一个副本

rm -rf blk_1073741831 blk_1073741831_1007.meta

2.重启 hdfs  检查文件块是否丢失

hdfs fsck /

3.手动修复

hdfs debug recoverLease -path /1_blk.log -retries 10  [拼人品]

5、MapReduce【最重要的思想】

以并行的方式处理数据

5.1、大数据数据处理三段论:


input

处理

output

5.2、整个流程

(input) <k1, v1> -> map -> <k2, v2> ->  reduce -> <k3, v3> (output)

1.整个阶段都是对 kv进行开发

2.每个阶段输出都是kv

3.kv 数据类型 have to be serializable:

1.mplement the Writable interface

deserializable

serializable 场景就是把数据进行网络传输

2. key classes have to implement the WritableComparable:

key既要实现序列化+排序

value 只需实现序列化

map:映射

reduce:规约

shuffle:把相同的key “拉倒一起”

driver: 定义如何启动map reduce

5.3、Map task 个数由什么东西决定的?

1、可以被切分

map task数据由 input 的切片数量决定的

2、不可被切分

切片数量就是1  对应一个map task

1.文件能被切分

1.文件大小小于128m

就有一个切片 =》 一个maptask

2.文件大小大于 128M

fileszie/splitsize = num  切片数

filesize剩余的部分:比较大小 splitsize * 10%

filesize-splitsize

大 那么就会额外开启一个切片

小 不会开启切片

2.不能切分的文件

某些压缩文件

5.4、Reduce task 个数由什么东西决定的?

1.mr 用户自己决定

2.默认reduce task个数是 1

3.reduce task 个数 最终文件输出的时候 就有多少个文件

5.5、分区


“把相同的key拉倒一起”

key按照某个规则进行分发到 一起

某个规则:

默认 hash

6、Yarn

6.1、架构

1.resourcemanger : 负责资源的分配

2.nodemanager:负责资源的供给与隔离

6.2、资源调度和隔离

1.资源调度?

resourcemanger将nodemanager上资源分配给task

2.资源隔离?

nodemanager按照要求给task 提供资源 保证提供的资源具有独占性

资源:

nodemanager指挥分配的资源:

container:【一定比例的cpu和mem】

1.cpu

2.mem

6.3、架构设计

mr作业运行 如何申请资源去运行作业?

resourcemanger:

nodemanager:

1.client =》 rm apps发送请求 去运行 jar (app master)

2.apps 分配一个container 去运行app master

3.app master 向 apps manager 去注册 (yarn web 可以看到job 运行情况)

4.app master 向 resouce scheduler 申请资源运行 我的代码

5-6.nodemanager会开启资源 container 去运行 map task  reduce task

7.task 会向 app master 汇报 代码的运行情况

8.当运行完成之后  app master 会给 apps manager 通知我的作业运行完成了 请求释放资源

9.apps manager 收到请求之后 通知客户端 你的代码运行完成了

补充:

input: map task个数 =》 container 申请的个数

reduce : reduce task =》 container 申请的个数

6.4、调度器【默认是容量调度器】

1.FIFO scheduler  :

先进先出 单队列

2.Capacity scheduler 容量调度器:

多队列、每个队列之间 互不影响  先进先出

3.Fair scheduler   公平调度器

多队列、 每个队列之间 job 有影响 不是先进先出

job的优先级

Capacity scheduler 容量调度器

yarn.resourcemanager.scheduler.class =》 CapacityScheduler

6.5、调优

6.5.1、yarn资源调优

1.container?

一定比例的cpu和mem

2.针对集群中 每个节点 对container进行配置

刀片服务器配置: 128G  16物理core

1.刀片服务器 装完系统 消耗1G

2.系统预留 20%内存 [包含 装完系统 消耗1G]

1.给未来部署组件预留内存空间

2.防止 全部使用 会导致 系统夯住 oom机制【linux系统】


1.目前位置 大数据服务资源: 102G

hadoop:

Datanode      进程内存  2G

nodemanager   进程内存  4G

102G  -2g -4G  = 96G  => yarn资源 container 一共 96G

container资源划分 :

1.内存

2.cpu 【core】

1.container内存:

总:

yarn.nodemanager.resource.memory-mb  96G 【默认值是8G】

最小:

yarn.scheduler.minimum-allocation-mb 1g  极限情况下 会有96个container

最大:

yarn.scheduler.maximum-allocation-mb 96G 极限情况下 会有1个container

注意:

container内存会自动增加 默认1g递增

2.container cpu

虚拟核 vcore =》 设计初衷 考虑不同节点的cpu性能不一样

比如:

某个物理cpu是另外一个物理cpu的2G

第一机器: 强悍 pcore:vcore=1:2 【1core 当成2core使用】

第二机器: 不强悍  pcore:vcore=1:1

16个物理核 : 16vcore

1.虚拟核 和物理核的比例 :

yarn.nodemanager.resource.pcores-vcores-multiplier  2

yarn core =》 vcore 16*2 = 32 vcore

总:

yarn.nodemanager.resource.cpu-vcores 32  【默认是8vcore】

最小:

yarn.scheduler.minimum-allocation-vcores 1 极限情况下 只有32个container

最大:

yarn.scheduler.maximum-allocation-vcores 32 极限情况下 只有1个container


实际开发角度:

1.mem 为主

2.cpu :

cloudera 公司推荐 一个contaier 的vcore 最大值最好不要超过5   4

理想情况下:标准 cloudera 公司

1.cpu角度:

16个物理核 : 16vcore

1.虚拟核 和物理核的比例 :

yarn.nodemanager.resource.pcores-vcores-multiplier  2

yarn core =》 vcore 16*2 = 32 vcore

总:

yarn.nodemanager.resource.cpu-vcores 32  【默认是8vcore】

最小:

yarn.scheduler.minimum-allocation-vcores 1 极限情况下 只有32个container

最大:

yarn.scheduler.maximum-allocation-vcores 4 极限情况下 只有8个container


反推内存:

1. vcore 4  container 8个

总:

yarn.nodemanager.resource.memory-mb  96G 【默认值是8G】

最小:

yarn.scheduler.minimum-allocation-mb 1g  极限情况下 会有96个container

最大:

yarn.scheduler.maximum-allocation-mb 12G 极限情况下 会有8个container

注意:

container内存会自动增加 默认1g递增

container:

1. 8-32 个container =>  task  8-32个

2.以内存为主

总:

yarn.nodemanager.resource.memory-mb  96G 【默认值是8G】

最小:

yarn.scheduler.minimum-allocation-mb 2G

最大:

yarn.scheduler.maximum-allocation-mb 20G

20G => container ? 5个container

2g => container ? 48个container


4G 2core

1.内存

总:

yarn.nodemanager.resource.memory-mb  4G 【默认值是8G】

最小:

yarn.scheduler.minimum-allocation-mb 1g  极限情况下 会有96个container

最大:

yarn.scheduler.maximum-allocation-mb 2G 极限情况下 会有8个container

2.cpu 2

1.虚拟核 和物理核的比例 :

yarn.nodemanager.resource.pcores-vcores-multiplier  2

总:

yarn.nodemanager.resource.cpu-vcores 4  【默认是8vcore】

最小:

yarn.scheduler.minimum-allocation-vcores 1 极限情况下 只有32个container

最大:

yarn.scheduler.maximum-allocation-vcores 2 极限情况下 只有8个container


yarn-site.xml:

内存:

<property>

<name>yarn.nodemanager.resource.memory-mb</name>

<value>4096</value>

</property>

<property>

<name>yarn.scheduler.minimum-allocation-mb</name>

<value>1024</value>

</property>

<property>

<name>yarn.scheduler.maximum-allocation-mb</name>

<value>2048</value>

</property>

cpu:

<property>

<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>

<value>2</value>

</property>

<property>

<name>yarn.nodemanager.resource.cpu-vcores</name>

<value>4</value>

</property>

<property>

<name>yarn.scheduler.minimum-allocation-vcores</name>

<value>1</value>

</property>

<property>

<name>yarn.scheduler.maximum-allocation-vcores</name>

<value>2</value>

</property>


mapreduce:

1.map task  reduce task  默认申请的container:cpu mem 分别是多少?

2.map task:

1.mem

mapreduce.map.memory.mb 默认是1024

一个map task 申请的内存资源是 1024M

如果map task 实际使用的资源量超过该值  task将会被强制杀死

2.cpu

mapreduce.map.cpu.vcores  默认是1

3.reduce task :

1.mem

mapreduce.reduce.memory.mb 默认是1024

2.cpu

mapreduce.reduce.memory.mb 默认是1

7、存储hdfs

压缩文件

7.1、为什么要使用压缩


1.节省空间 (1file hdfs 3个副本)

2.节省时间:

网络io 和磁盘io 会减少

1.mapreduce 过程中 map端输出采用压缩

1.经过网络传输的数据量会变少 【减少了网络io】

2.磁盘上数据压缩后,读取到内存的数据量也会变少 【减少磁盘io】

7.2、使用场景?


1.采用压缩,对机器的cpu要求比较高

2.存储数据的空间不够

7.3、凡事都有两面性?


1.采用压缩

1.空间 和时间 减少

2.cpu 消耗 cpu利用率高  =》 会导致整个mr作业处理数据时间会稍微长一些

7.4、如何使用压缩?


1.存储角度

压缩普通文件

2.计算角度 mr spark flink

1.input mr 不用考虑 切片会对压缩格式进行校验 =》 源码里面

2.map out  配置参数即可

3.reduce out 配置参数即可

7.5、常见的压缩格式


gzip

bzip2

LZO

Snappy

LZ4



版权声明:本文为weixin_48625295原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。