加密算法、分布式缓存与Hadoop

发布时间:2024年01月24日

1 加密算法

1.1. AES

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传
输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下
图:

1.2. RSA

R SA 加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广
泛的非对称加密算法。
非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。公钥用于加密,私钥用
于解密。

1.3. CRC ?

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简
短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。
它是利用除法及余数的原理来作错误侦测的。

1.4. MD5

MD5 常常作为文件的签名出现,我们在下载文件的时候,常常会看到文件页面上附带一个扩展
名为.MD5 的文本或者一行字符,这行字符就是就是把整个文件当作原数据通过 MD5 计算后的值, 我们下载文件后,可以用检查文件 MD5 信息的软件对下载到的文件在进行一次计算。两次结果对 比就可以确保下载到文件的准确性。 另一种常见用途就是网站敏感信息加密,比如用户名密码, 支付签名等等。随着 https 技术的普及,现在的网站广泛采用前台明文传输到后台,MD5 加密 (使用偏移量)的方式保护敏感数据保护站点和数据安全。

2?分布式缓存

2.1. 缓存雪崩

缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都 去查询数据库了,而对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列 连锁反应,造成整个系统崩溃。一般有三种处理办法:
1. 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
2. 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓 存。
3. 为 key 设置不同的缓存失效时间。

2.2. 缓存穿透

缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在 缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请 求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用 布隆过滤器 ,将所有可能存在的数据哈 希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存 储系统的查询压力。另外也有一个更为简单粗暴的方法, 如果一个查询返回的数据为空(不管是数据不 存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了 ,而不会继续访问数据库。

2.3. 缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候, 先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

2.4. 缓存更新

缓存更新除了缓存服务器自带的缓存失效策略之外(Redis 默认的有 6 中策略可供选择),我们还可以 根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种:
(1)定时去清理过期的缓存;
(2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数 据并更新缓存。

2.5. 缓存降级

当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然 需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开 关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的 (如加入购物车、结算)。

3 Hadoop

3.1. 概念

就是一个大数据解决方案。它提供了一套分布式系统基础架构。 核心内容包含 hdfs 和
mapreduce。hadoop2.0 以后引入 yarn.
hdfs 是提供数据存储的,mapreduce 是方便数据计算的。
1. hdfs 又对应 namenode 和 datanode. namenode 负责保存元数据的基本信息,
datanode 直接存放数据本身;
2. mapreduce 对应 jobtracker 和 tasktracker. jobtracker 负责分发任务,tasktracker 负
责执行具体任务;
3. 对应到 master/slave 架构,namenode 和 jobtracker 就应该对应到 master, datanode
和 tasktracker 就应该对应到 slave.

3.2?HDFS

3.2.1. Client

Client(代表用 户) 通过与 NameNode 和 DataNode 交互访问 HDFS 中 的文件。 Client 提供
了一个类似 POSIX 的文件系统接口供用户调用。

3.2.2. NameNode

整个 Hadoop 集群中只有一个 NameNode。 它是整个系统的“ 总管”, 负责管理 HDFS 的目
录树和相关的文件元数据信息。 这些信息是以“ fsimage”( HDFS 元数据镜像文件)和
“ editlog”(HDFS 文件改动日志)两个文件形式存放在本地磁盘,当 HDFS 重启时重新构造出
来的。此外, NameNode 还负责监控各个 DataNode 的健康状态, 一旦发现某个 DataNode 宕
掉,则将该 DataNode 移出 HDFS 并重新备份其上面的数据。

3.2.3?Secondary NameNode

Secondary NameNode 最重要的任务并不是为 NameNode 元数据进行热备份, 而是定期合并
fsimage 和 edits 日志, 并传输给 NameNode。 这里需要注意的是,为了减小 NameNode 压
力, NameNode 自己并不会合并 fsimage 和 edits, 并将文件存储到磁盘上, 而是交由
Secondary NameNode 完成。

3.2.4?DataNode

一般而言, 每个 Slave 节点上安装一个 DataNode, 它负责实际的数据存储, 并将数据信息定期
汇报给 NameNode。 DataNode 以固定大小的 block 为基本单位组织文件内容, 默认情况下
block 大小为 64MB。 当用户上传一个大的文件到 HDFS 上时, 该文件会被切分成若干个 block,
分别存储到不同的 DataNode ; 同时,为了保证数据可靠, 会将同一个 block 以流水线方式写到
若干个(默认是 3,该参数可配置)不同的 DataNode 上。 这种文件切割后存储的过程是对用户
透明的。

3.3?MapReduce

同 HDFS 一样,Hadoop MapReduce 也采用了 Master/Slave(M/S)架构,具体如图所示。它
主要由以下几个组件组成:Client、JobTracker、TaskTracker 和 Task。 下面分别对这几个组件
进行介绍。

3.3.1. Client

用户编写的 MapReduce 程序通过 Client 提交到 JobTracker 端; 同时, 用户可通过 Client 提
供的一些接口查看作业运行状态。 在 Hadoop 内部用“作业”(Job) 表示 MapReduce 程序。
一个 MapReduce 程序可对应若干个作业,而每个作业会被分解成若干个 Map/Reduce 任务
(Task)。

?3.3.2. JobTracker

JobTracker 主要负责资源监控和作业调度。JobTracker 监控所有 TaskTracker 与作业的健康状况, 一旦发现失败情况后,其会将相应的任务转移到其他节点;同时 JobTracker 会跟踪任务的执行进 度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合 适的任务使用这些资源。在 Hadoop 中,任务调度器是一个可插拔的模块,用户可以根据自己的 需要设计相应的调度器。

3.3.3. TaskTracker

TaskTracker 会周期性地通过 Heartbeat 将本节点上资源的使用情况和任务的运行进度汇报给
JobTracker, 同时接收 JobTracker 发送过来的命令并执行相应的操作(如启动新任务、 杀死任
务等)。TaskTracker 使用“slot” 等量划分本节点上的资源量。“slot” 代表计算资源(CPU、
内存等)。一个 Task 获取到一个 slot 后才有机会运行,而 Hadoop 调度器的作用就是将各个
TaskTracker 上的空闲 slot 分配给 Task 使用。 slot 分为 Map slot 和 Reduce slot 两种,分别供
MapTask 和 Reduce Task 使用。 TaskTracker 通过 slot 数目(可配置参数)限定 Task 的并发
度。

3.3.4. Task

Task 分为 Map Task 和 Reduce Task 两种, 均由 TaskTracker 启动。 HDFS 以固定大小的 block
为基本单位存储数据, 而对于 MapReduce 而言, 其处理单位是 split。split 与 block 的对应关
系如图所示。 split 是一个逻辑概念, 它只包含一些元数据信息, 比如数据起始位置、数据长度、
数据所在节点等。它的划分方法完全由用户自己决定。 但需要注意的是,split 的多少决定了 Map
Task 的数目 ,因为每个 split 会交由一个 Map Task 处理。
Map Task 执行过程如图所示。 由该图可知,Map Task 先将对应的 split 迭代解析成一个个
key/value 对,依次调用用户自定义的 map() 函数进行处理,最终将临时结果存放到本地磁盘上,
其中临时数据被分成若干个 partition,每个 partition 将被一个 Reduce Task 处理。

?

3.3.5. Reduce Task 执行过程

该过程分为三个阶段
1. 从远程节点上读取 MapTask 中间结果(称为“Shuffle 阶段”);
2. 按照 key 对 key/value 对进行排序(称为“ Sort 阶段”);
3. 依次读取<key, value list>,调用用户自定义的 reduce() 函数处理,并将最终结果存到 HDFS
上(称为“ Reduce 阶段”)

3.4. Hadoop MapReduce 作业的生命周期

1. 作业提交与初始化
1. 用户提交作业后, 首先由 JobClient 实例将作业相关信息, 比如将程序 jar 包、作业配置文
件、 分片元信息文件等上传到分布式文件系统( 一般为 HDFS)上,其中,分片元信息文件
记录了每个输入分片的逻辑位置信息。 然后 JobClient 通过 RPC 通知 JobTracker。
JobTracker 收到新作业提交请求后, 由 作业调度模块对作业进行初始化:为作业创建一个
JobInProgress 对象以跟踪作业运行状况, 而 JobInProgress 则会为每个 Task 创建一个
TaskInProgress 对象以跟踪每个任务的运行状态, TaskInProgress 可能需要管理多个
“ Task 运行尝试”( 称为“ Task Attempt”)。
2. 任务调度与监控。
2. 前面提到,任务调度和监控的功能均由 JobTracker 完成。TaskTracker 周期性地通过
Heartbeat 向 JobTracker 汇报本节点的资源使用 情况, 一旦出 现空闲资源, JobTracker
会按照一定的策略选择一个合适的任务使用该空闲资源, 这由任务调度器完成。 任务调度器
是一个可插拔的独立模块, 且为双层架构, 即首先选择作业, 然后从该作业中选择任务, 其
中,选择任务时需要重点考虑数据本地性。 此外,JobTracker 跟踪作业的整个运行过程,并
为作业的成功运行提供全方位的保障。 首先, 当 TaskTracker 或者 Task 失败时, 转移计算
任务 ; 其次, 当某个 Task 执行进度远落后于同一作业的其他 Task 时,为之启动一个相同
Task, 并选取计算快的 Task 结果作为最终结果。
3. 任务运行环境准备
3. 运行环境准备包括 JVM 启动和资源隔 离, 均由 TaskTracker 实现。 TaskTracker 为每个
Task 启动一个独立的 JVM 以避免不同 Task 在运行过程中相互影响 ; 同时,TaskTracker 使
用了操作系统进程实现资源隔离以防止 Task 滥用资源。
4. 任务执行
4. TaskTracker 为 Task 准备好运行环境后, 便会启动 Task。 在运行过程中, 每个 Task 的最
新进度首先由 Task 通过 RPC 汇报给 TaskTracker, 再由 TaskTracker 汇报给 JobTracker。
5. 作业完成。
5. 待所有 Task 执行完毕后, 整个作业执行成功。

文章来源:https://blog.csdn.net/qq_45309297/article/details/135647804
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。