20240305-2-海量数据处理常用技术概述

海量数据处理常用技术概述

在这里插入图片描述

如今互联网产生的数据量已经达到PB级别,如何在数据量不断增大的情况下,依然保证快速的检索或者更新数据,是我们面临的问题。
所谓海量数据处理,是指基于海量数据的存储、处理和操作等。因为数据量太大无法在短时间迅速解决,或者不能一次性读入内存中。

在解决海量数据的问题的时候,我们需要什么样的策略和技术,是每一个人都会关心的问题。今天我们就梳理一下在解决大数据问题
的时候需要使用的技术,但是注意这里只是从技术角度进行分析,只是一种思想并不代表业界的技术策略。
常用到的算法策略

  1. 分治:多层划分、MapReduce
  2. 排序:快速排序、桶排序、堆排序
  3. 数据结构:堆、位图、布隆过滤器、倒排索引、二叉树、Trie树、B树,红黑树
  4. Hash映射:hashMap、simhash、局部敏感哈希

海量数据处理--从分而治之到Mapreduce

分治

分治是一种算法思想,主要目的是将一个大问题分成多个小问题进行求解,之后合并结果。我们常用到的有归并排序:先分成两部分进行排序,之后在合并
当然还有其他的很多应用,就比如是我们上篇文章中提到的Top K问题,就是将大文件分成多个小文件进行统计,之后进行合并结果。这里我们对分治进行抽象,
依然从上述提到的Top K频率统计开始出发。定义如下:有M多个Query日志文件记录,要求得到Top K的Query。
我们可以抽象成几个步骤:

  1. 多个文件的输入,我们叫做input splits
  2. 多进程同时处理多个文档,我们叫做map
  3. partition 从上文中我们知道。因为我们要将相同的Query映射的一起
  4. 多进程处理划分或的文件,我们叫做reduce
  5. 合并过个文件的结果,我们叫做merge

上面的这四个步骤是我们从Top K问题抽象出来的,为什么我们对每一步进行一个取名字?因为这就是最简单的MapReduce的原理。我们现在就可以认为之前已经
用过Mapreduce的思想了,它就是这么简单,当然中的很多问题我都没有提出来,但是主要的思想就是这样,很成熟的MapReduce的实现,有Hadoop和CouchDB等。
我给出一张图片来表示这个过程。

MapReduce

MapReduce是一种编程模式、大数据框架的并行处理接口和分布式算法计算平台,主要用于大规模数据集合的并行计算。一个Mapreduce的程序主要有两部分组成: map和reduce. 它主要借鉴了函数式编程语言和矢量编程语言特性。
MapReduce最早是由Google公司研究提出的一种面向大规模数据处理的并行计算模型和方法。Google公司设计MapReduce的初衷主要是为了解决其搜索引擎中大规模网页数据的并行化处理。

MapReduce组成

  1. Map:
    用户根据需求设置的Map函数,每一个工作节点(主机)处理本地的数据,将结果写入临时文件,给调用Reduce函数的节点使用。
  1. Shuffle:
    在MapReduce的编程模式中,我们要时刻注意到数据结构是(key, value)对,Shuffle就是打乱数据,也是我们之前提到过的Partition处理,主要目的是将相同的key的数据映射到同一个Reduce工作的节点(这是主要的功能,当然还有其他的功能)。
  1. Reduce:
    Reduce函数,并行处理相同key的函数,返回结果。
Mapreduce模式这么流行,现在几乎所有的大公司都在使用Hadoop框架,当然可能会有一些优化,不过主要的思想依然是MapReduce模式。在公司中或者个人的使用的时候,我们一般会先搭建Hadoop环境,之后最简单的使用就是提供Map函数和Reduce函数即可,语言可以使用C++、Java、Python等。例如我们提到的Top k问题的伪代码的例子:     ```
map(String key, String values):// key: 文档名字// values: 文档内容for each line in values:EmitIntemediate(line, "1")..... // 这中间的省略号,表示还可以加一些代码,
..... // 不加也不影响结果,只是效率问题,后面会提到reduce(String key, Iterator values):// key: a query// values: a lists of countsint result = 0;for each v in values:result += ParseInt(v)Emit(AsString(result))
```

代码抽象

map:    (k1, v1)    —>   list(k2, v2)
reduce:   (k2, list(v2)) —>   list(v3)

MapReduce支持的数据格式,从上述的代码中,我们可以看到MapReduce的输入和输出都是(k, v)对的格式。当然这只是转换之后的格式,一般来书我们的输入文件都是文件,MapReduce认为第一个分隔符之前的字段是key,后面的values,(values可以不存在,例如我们的Top k问题就没有values)。所有在使用的时候,我们只需要用分隔符空格将key和values分开,每一行代表一个数据,提供我们需要的Map和Reduce函数即可。

文章到此应该已经可以结束了,我们可以在任何MapReduce框架下,根据需求写出map函数和reduce函数。对于想用使用MapReduce的程序员来说,在写函数的时候只需要注意key和value怎么设置,如何编写map和reduce函数,因为中间的细节,运行的框架已经帮我们封装的很好的,这就是为什么Mapreduce在业界流行。这种编程模式很简单,只要提map和reduce函数,对于那些没有并行计算和分布式处理经验的程序员,MapReduce框架帮我们处理好了并行计算、错误容忍、本地读取优化和加载平衡的细节,我们只需要关注业务,不用关心细节,还有就是这么编程模式可以简单的解决很多常见的问题,例如: linux中的grep命令,Sort,Top K,倒排索引等问题。

知其然而知其所以然,不仅更能帮助我们写出更优的代码,更重要的是如何在改进现有的技术,使其更好的应用到我们的业务上,因为很多大公司都会重写这种代码,使其在公司内部更好的应用。

浅谈技术细节

MapReduce模式下我们需要关注的问题如下(参考论文):

  1. 数据和代码如何存储?

设置一个Master,拷贝代码文件,分配给节点进行处理,指定Map或者Reduce已经输入和输出文件的路径。所有Master节点是一个管理节点负责调度。

  1. 如何Shuffle?

在MapReduce中都是(key, values)数据,输入的M个文件直接对应M的Map,产生的中间结果key2,通过哈希函数,
hash(key) % R(R是Reduce的个数)。当然我们需要设置一个好的hash函数,保证任务不平衡分到不同的Reduce节点上。

  1. 节点之间如何通信?

Master负责调度和通信,其他节点之和Master节点通信,master监控所有节点的信息,比如是map或者reduce任务,是否运行结束,占用的资源、文件读写速度等,master会重新分配那些已经完成的节点任务,对所有的错误的节点重新执行。

  1. 节点出现错误如何解决?

因为有master的存在,可以重新执行出现错误的运行节点,注意的是对于出错的map任务,其分配到的reduce任务也要重新执行。节点运行bug,我们可以修改代码,使其更鲁棒,但是有时候我们必须使用try-catch操作跳过一些错误的bad lines.

  1. Map和Reduce个数如何设置?

这个设置和集群的个数和经验有很大关系,建议我们每一个map任务的输入数据16-64MB, 因此map的个数 = 总的文件大小 / 16-64MB. reduce的个数建议大于节点的个数,这样可以保证更好的并行计算。

  1. 怎么控制负载平衡?

master会监控所有节点的运行状态,并且要对所有的运行完成的节点重新分配任务,来保证负载均衡,需要注意的是这里的并行计算是map和reduce的分别并行计算,必须保证map执行之后才能执行reduce(因为你有shuffle操作)。

  1. 技巧
  • map任务运行时候尽可能的读取本地或者当前局域内的文件,减少文件传输的网络带宽
  • M和R的设置会对master的监督有一定的影响,因为要监督所有的状态
  • 备份运行状态很重要,可以知道那台节点运行的缓慢,可能出现异常,可以让其他节点代替它运行任务
  • shuffle操作的hash函数真的很重要,可以有效的解决负载均衡
  • map生成的中间文件要根据key进行排序,也可以便于划分
  • map和reduce之间有时候需要加合并(combiner)操作,可以起到加速作用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js SheetJS 合并表格导出到同一个excel中

最近有个需求,我在一个页面显示了4个表格, 然后合并导出到excel文件中 四个表,四个sheet,一个excel文件 最后导出时这样: 实现: 1,页面有个导出的checkbox,勾选则导出,不勾选不处理 2,在一个函数中,集中处理四个表数据获取,并将结果返回出来 //获取数据后返回为…

bun 单元测试

bun test Bun 附带了一个快速、内置、兼容 Jest 的测试运行程序。测试使用 Bun 运行时执行,并支持以下功能。 TypeScript 和 JSX生命周期 hooks快照测试UI 和 DOM 测试使用 --watch 的监视模式使用 --preload 预加载脚本 Bun 旨在与 Jest 兼容,但并非所…

Linux搭建SFTP服务器

案例:搭建SFTP服务器 SFTP(SSH文件传输协议) SFTP(SSH文件传输协议)是一种安全的文件传输协议,用于在计算机之间传输文件。它基于SSH(安全外壳协议)的子系统,提供了加密的…

1908_Arm Cortex-M3的实现

1908_Arm Cortex-M3的实现 全部学习汇总: g_arm_cores: ARM内核的学习笔记 (gitee.com) 这是第一次看一份这样的手册,之前的MCU编程基本上就是专注于软件接口方面。而OS等方面的一些功能基本上都是用了现成的解决方案,因此也就没有过多的关注…

git合并多次提交

简介 Git是一个分布式版本控制系统,它允许开发人员在不同的分支上进行并行开发,并将这些分支合并到主分支或其他分支中。在开发过程中,我们经常会创建多个commit来记录每次的代码变更。有时候我们希望将这些连续的commit合并为一个更有意义的…

CSS实现选中卡片样式操作

图一默认自动选中&#xff0c;并且不可取消选中&#xff0c;当选择其他卡片才可点击下一步 在 “ src/assets ” 路径下存放 save.png&#xff0c;代表选中的状态 <div class"cards"><ul class"container"><li v-for"image in image…

【前端系列】vue

这里写目录标题 一、Vue简介1.1 主流前端框架/库简介 二、下载和安装Vue2.1 下载2.2 安装完成后&#xff0c;检查2.3创建全局安装目录和缓存日志目录2.4 为了下载包快速&#xff0c;改源为淘宝镜像2.5 查看npm配置修改是否成功 三、配置环境变量环境变量—用户变量—选中Path—…

Vue+SpringBoot打造实验报告管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验管理模块2.2 实验实例模块2.3 实验批阅模块2.4 实验咨询模块 三、系统展示四、核心代码4.1 查询实验4.2 新增实验咨询4.3 回复实验咨询4.4 新增实验实例4.5 查询实验实例 五、免责说明 一、摘要 1.1 项目介绍 基于…

【学习笔记】卫星基础知识

一、什么是卫星以及它如何工作&#xff1f; 通信卫星是一种人造卫星&#xff0c;通过使用转发器在源和接收器之间中继和放大无线电电信信号。卫星的工作原理是接收从地球发送的无线电信号并将无线电信号重新发送回地球。卫星使用从大型太阳能电池阵列收集的太阳能&#xff0c;…

HTML标签分类,web微信开发者工具

第一个阶段&#xff0c;开发环境和工具准备 浏览器 &#xff08;Google&#xff0c;FireFox&#xff0c;…&#xff09;下载&#xff0c;安装前端开发工具vscode&#xff0c;下载、安装 node、npm、webpack、webpack-cli、cnpm&#xff0c;配置前端开发环境下载、配置PHP和MyS…

Centos安装Jenkins

1、更新系统 &#xff08;1&#xff09;更新下系统 sudo yum -y update 安装用于下载java 17二进制文件的wget命令行工具 sudo yum -y install wget vim 2、卸载centos自带的jdk 由于我们安装的版本比较高&#xff0c;需要jdk17&#xff0c;卸载centos自带的jdk。用 下面的…

【vue/组件封装】封装一个带条件筛选的搜索框组件(多组条件思路、可多选)详细流程

引入&#xff1a;实现一个带有筛选功能的搜索框&#xff0c;封装成组件&#xff1b; 搜索框长这样子&#xff1a; 点击右侧筛选图标后弹出层&#xff0c;长这样子&#xff1a; 实际应用中有多组筛选条件&#xff0c;这里为了举栗子就展示一组&#xff1b; 预览&#xff1a;…

07-prometheus的自定义监控-pushgateway工具组件

一、概述 pushgateway用于自定义监控节点、节点中服务的工具&#xff0c;用户可以通过自定义的命令获取数据&#xff0c;并将数据推送给pushgateway中&#xff1b; prometheus服务&#xff0c;从pushgateway中获取监控数据&#xff1b; 二、部署pushgateway 我们可以“随便”找…

Pytorch学习 day03(Tensorboard、Transforms)

Tensorboard Tensorboard能够可视化loss的变化过程&#xff0c;便于我们查看模型的训练状态&#xff0c;也能查看模型当前的输入和输出结果 在Pycharm中&#xff0c;可以通过按住ctrl&#xff0c;并左键点击某个库来进入源文件查看该库的使用方法SummaryWriter是用来向log_dir…

【数据结构】顺序表+链表

目录 1.顺序表 1.1初始化顺序表 1.2销毁顺序表 1.3检查容量并扩容 1.4把某个元素插入到下标为pos的位置 1.5头插和尾插 1.6删除下标为pos的元素 1.7头删和尾删 2.顺序表的问题及思考 3.链表 3.1链表的访问 3.2链表的增删查改 1.顺序表 顺序表的本质其实就是一个数组…

Tensorflow2.0笔记 - 计算梯度

本笔记主要记录tf.GradientTape和tf.gradient的用法 import tensorflow as tf import numpy as nptf.__version__#要计算梯度的所有参数计算过程必须放到gradient tape中 #with tf.GradientTape as tape: w tf.constant(1.) x tf.constant(2.)with tf.GradientTape() as tap…

惯性导航 | 测量方程中的噪声模型与离散时间噪声模型

惯性导航 | 测量方程中的噪声模型与离散时间噪声模型 IMU测量方程中的噪声模型IMU的离散时间噪声模型 IMU测量方程中的噪声模型 在大多数系统中&#xff0c;IMU的噪声由两部分组成&#xff1a;测量噪声&#xff08;Measurement Nosie&#xff09;与零偏&#xff08;Bias&#…

1.1_3 性能指标——时延、时延带宽积、往返时间RTT、利用率

文章目录 1.1_3 性能指标——时延、时延带宽积、往返时间RTT、利用率&#xff08;一&#xff09;时延&#xff08;二&#xff09;时延带宽积&#xff08;三&#xff09;往返时延RTT&#xff08;四&#xff09;利用率 1.1_3 性能指标——时延、时延带宽积、往返时间RTT、利用率 …

wireshark抓取localhost(127.0.0.1)数据包

打开wireshark中&#xff0c;在"capture"菜单中&#xff0c;选择"interfaces"子菜单&#xff0c;在列出的接口中选中"Adapter for loopback traffic capture"即可。 必须安装了Npcap才有此选项&#xff0c;否则需要重新安装wireshark。 抓包截图…

桥梁安全监测方案:多维度的技术与设备应用

一、背景与意义 随着交通基础设施的快速发展&#xff0c;桥梁作为连接两岸的关键纽带&#xff0c;其安全性能直接关系到人们的生命财产安全和交通畅通。为确保桥梁的安全与稳定&#xff0c;及时发现潜在的安全隐患&#xff0c;采取科学、有效的安全监测方案显得尤为重要。本文将…