首页 文章 精选 留言 我的

精选列表

搜索[文智公众趋势分析],共10000篇文章
优秀的个人博客,低调大师

一文读懂MapReduce

Hadoop解决大规模数据分布式计算的方案是MapReduce。MapReduce既是一个编程模型,又是一个计算框架。也就是说,开发人员必须基于MapReduce编程模型进行编程开发,然后将程序通过MapReduce计算框架分发到Hadoop集群中运行。我们先看一下作为编程模型的MapReduce。 MapReduce编程模型 MapReduce是一种非常简单又非常强大的编程模型。 简单在于其编程模型只包含map和reduce两个过程,map的主要输入是一对值,经过map计算后输出一对值;然后将相同key合并,形成;再将这个输入reduce,经过计算输出零个或多个对。 但是MapReduce同时又是非常强大的,不管是关系代数运算(SQL计算),还是矩阵运算(图计算),大数据领域几乎所有的计算需求都可以通过MapReduce编程来实现。 我们以WordCount程序为例。WordCount主要解决文本处理中的词频统计问题,就是统计文本中每一个单词出现的次数。如果只是统计一篇文章的词频,几十K到几M的数据,那么写一个程序,将数据读入内存,建一个Hash表记录每个词出现的次数就可以了,如下图。 小数据量的词频统计 但是如果想统计全世界互联网所有网页(数万亿计)的词频数(这正是google这样的搜索引擎典型需求),你不可能写一个程序把全世界的网页都读入内存,这时候就需要用MapReduce编程来解决。 WordCount的MapReduce程序如下。 public class WordCount { public static class TokenizerMapper extends Mapper { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } } 其核心是一个map函数,一个reduce函数。 map函数的输入主要是一个对,在这个例子里,value是要统计的所有文本中的一行数据,key在这里不重要,我们忽略。 public void map(Object key, Text value, Context context) map函数的计算过程就是,将这行文本中的单词提取出来,针对每个单词输出一个这样的对。 MapReduce计算框架会将这些收集起来,将相同的word放在一起,形成>这样的数据,然后将其输入给reduce函数。 public void reduce(Text key, Iterable values,Context context) 这里的reduce的输入参数values就是由很多个1组成的集合,而key就是具体的单词word。 reduce函数的计算过程就是,将这个集合里的1求和,再将单词(word)和这个和(sum)组成一个()输出。每一个输出就是一个单词和它的词频统计总和。 假设有两个block的文本数据需要进行词频统计,MapReduce计算过程如下图。 MapReduce计算过程 一个map函数可以针对一部分数据进行运算,这样就可以将一个大数据切分成很多块(这也正是HDFS所做的),MapReduce计算框架为每个块分配一个map函数去计算,从而实现大数据的分布式计算。 上面提到MapReduce编程模型将大数据计算过程切分为map和reduce两个阶段,在map阶段为每个数据块分配一个map计算任务,然后将所有map输出的key进行合并,相同的key及其对应的value发送给同一个reduce任务去处理。 这个过程有两个关键问题需要处理 如何为每个数据块分配一个map计算任务,代码是如何发送数据块所在服务器的,发送过去是如何启动的,启动以后又如何知道自己需要计算的数据在文件什么位置(数据块id是什么) 处于不同服务器的map输出的 ,如何把相同的key聚合在一起发送给reduce任务 这两个关键问题正好对应文章中“MapReduce计算过程”一图中两处“MapReduce框架处理”。 MapReduce计算过程中两处MapReduce框架处理 我们先看下MapReduce是如何启动处理一个大数据计算应用作业的。 MapReduce作业启动和运行机制 我们以Hadoop1为例,MapReduce运行过程涉及以下几类关键进程: 大数据应用进程:启动用户MapReduce程序的主入口,主要指定Map和Reduce类、输入输出文件路径等,并提交作业给Hadoop集群。 JobTracker进程:根据要处理的输入数据量启动相应数量的map和reduce进程任务,并管理整个作业生命周期的任务调度和监控。JobTracker进程在整个Hadoop集群全局唯一。 TaskTracker进程:负责启动和管理map进程以及reduce进程。因为需要每个数据块都有对应的map函数,TaskTracker进程通常和HDFS的DataNode进程启动在同一个服务器,也就是说,Hadoop集群中绝大多数服务器同时运行DataNode进程和TaskTacker进程。 如下图所示。 MapReduce作业启动和运行机制 具体作业启动和计算过程如下: 应用进程将用户作业jar包存储在HDFS中,将来这些jar包会分发给Hadoop集群中的服务器执行MapReduce计算。 应用程序提交job作业给JobTracker。 JobTacker根据作业调度策略创建JobInProcess树,每个作业都会有一个自己的JobInProcess树。 JobInProcess根据输入数据分片数目(通常情况就是数据块的数目)和设置的reduce数目创建相应数量的TaskInProcess。 TaskTracker进程和JobTracker进程进行定时通信。 如果TaskTracker有空闲的计算资源(空闲CPU核),JobTracker就会给他分配任务。分配任务的时候会根据TaskTracker的服务器名字匹配在同一台机器上的数据块计算任务给它,使启动的计算任务正好处理本机上的数据。 TaskRunner收到任务后根据任务类型(map还是reduce),任务参数(作业jar包路径,输入数据文件路径,要处理的数据在文件中的起始位置和偏移量,数据块多个备份的DataNode主机名等)启动相应的map或者reduce进程。 map或者reduce程序启动后,检查本地是否有要执行任务的jar包文件,如果没有,就去HDFS上下载,然后加载map或者reduce代码开始执行。 如果是map进程,从HDFS读取数据(通常要读取的数据块正好存储在本机)。如果是reduce进程,将结果数据写出到HDFS。 通过以上过程,MapReduce可以将大数据作业计算任务分布在整个Hadoop集群中运行,每个map计算任务要处理的数据通常都能从本地磁盘上读取到。而用户要做的仅仅是编写一个map函数和一个reduce函数就可以了,根本不用关心这两个函数是如何被分布启动到集群上的,数据块又是如何分配给计算任务的。这一切都由MapReduce计算框架完成。 MapReduce数据合并与连接机制 在WordCount例子中,要统计相同单词在所有输入数据中出现的次数,而一个map只能处理一部分数据,一个热门单词几乎会出现在所有的map中,这些单词必须要合并到一起进行统计才能得到正确的结果。 事实上,几乎所有的大数据计算场景都需要处理数据关联的问题,简单如WordCount只要对key进行合并就可以了,复杂如数据库的join操作,需要对两种类型(或者更多类型)的数据根据key进行连接。 MapReduce计算框架处理数据合并与连接的操作就在map输出与reduce输入之间,这个过程有个专门的词汇来描述,叫做shuffle。 MapReduce shuffle过程 每个map任务的计算结果都会写入到本地文件系统,等map任务快要计算完成的时候,MapReduce计算框架会启动shuffle过程,在map端调用一个Partitioner接口,对map产生的每个进行reduce分区选择,然后通过http通信发送给对应的reduce进程。这样不管map位于哪个服务器节点,相同的key一定会被发送给相同的reduce进程。reduce端对收到的进行排序和合并,相同的key放在一起,组成一个传递给reduce执行。 MapReduce框架缺省的Partitioner用key的哈希值对reduce任务数量取模,相同的key一定会落在相同的reduce任务id上,实现上,这样的Partitioner代码只需要一行,如下所示。 /* Use {@link Object#hashCode()} to partition. / public int getPartition(K2 key, V2 value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } shuffle是大数据计算过程中发生奇迹的地方,不管是MapReduce还是Spark,只要是大数据批处理计算,一定会有shuffle过程,让数据关联起来,数据的内在关系和价值才会呈现出来。不理解shuffle,就会在map和reduce编程中产生困惑,不知道该如何正确设计map的输出和reduce的输入。shuffle也是整个MapReduce过程中最难最消耗性能的地方,在MapReduce早期代码中,一半代码都是关于shuffle处理的。

优秀的个人博客,低调大师

一文了解JVM

一、什么是JVM JVM是Java Virtual Machine(Java 虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是平台无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。 二、JVM总体

优秀的个人博客,低调大师

Django 2.1.3文档

关于Django你需要知道的一切。 获得帮助 遇到麻烦?我们想帮忙! 尝试常见问题解答- 它可以解答许多常见问题。 寻找具体信息?尝试索引,模块索引或详细目录。 在django-users邮件列表的档案中搜索信息,或发布问题。 在#django IRC频道中提问,或者搜索IRC日志以查看之前是否有人询问过。 在我们的票务跟踪器中报告Django的错误。 如何组织文档 Django有很多文档。对其组织方式的高级概述将帮助您了解在哪些方面寻找某些事物: 教程将指导您完成创建Web应用程序的一系列步骤。如果您是Django或Web应用程序开发的新手,请从这里开始。另请参阅下面的“第一步”。 主题指南在相当高的层次上讨论关键主题和概念,并提供有用的背景信息和解释。 参考指南包含API的技术参考和Django机器的其他方面。它们描述了它的工作原理以及如何使用它,但假设您对关键概念有基本的了解。 操作指南是食谱。它们将指导您完成解决关键问题和用例所涉及的步骤。它们比教程更先进,并且假设有关Django如何工作的一些知识。 第一步 你是Django的新手还是编程?这是开始的地方! 从头开始:概述|安装 教程:第1部分:请求和响应|第2部分:模型和管理站点|第3部分:视图和模板|第4部分:表单和通用视图|第5部分:测试|第6部分:静态文件|第7部分:自定义管理站点 高级教程:如何编写可重用的应用程序|为Django编写第一个补丁 模型层 Django提供了一个抽象层(“模型”),用于构建和操作Web应用程序的数据。在下面了解更多信息: 型号:模型简介|字段类型|索引|元选项|模特课 QuerySets:进行查询|QuerySet方法引用|查找表达式 模型实例:实例方法|访问相关对象 迁移:迁移简介|操作参考|SchemaEditor|编写迁移 高级:经理|原始SQL|交易|聚合|搜索|自定义字段|多个数据库|自定义查找|查询表达式|条件表达式|数据库功能 其他:支持的数据库|旧数据库|提供初始数据|优化数据库访问|PostgreSQL的特定功能 视图层 Django具有“视图”的概念来封装负责处理用户请求和返回响应的逻辑。通过以下链接找到您需要了解的所有视图: 基础知识:URLconfs|查看功能|快捷方式|装饰 参考:内置视图|请求/响应对象|TemplateResponse对象 文件上传:概述|文件对象|存储API|管理文件|定制存储 基于类的视图:概述|内置显示视图|内置编辑视图|使用mixins|API参考|扁平指数 高级:生成CSV|生成PDF 中间件:概述|内置中间件类 模板层 模板层提供了一种设计者友好的语法,用于呈现要呈现给用户的信息。了解设计人员如何使用此语法以及程序员如何扩展它: 基础知识:概述 对于设计师:语言概述|内置标签和过滤器|人性化 对于程序员:Template API|自定义标签和过滤器 表格 Django提供了一个丰富的框架来促进表单的创建和表单数据的操作。 基础知识:概述|表格API|内置字段|内置小部件 高级:模型的表单|集成媒体|Formsets|自定义验证 开发过程 了解各种组件和工具,以帮助您开发和测试Django应用程序: 设置:概述|完整的设置列表 应用:概述 例外:概述 django-admin和manage.py:概述|添加自定义命令 测试:简介|编写和运行测试|包含的测试工具|高级主题 部署:概述|WSGI服务器|部署静态文件|通过电子邮件跟踪代码错误 管理员 找到您需要了解的有关自动管理界面的所有信息,这是Django最受欢迎的功能之一: 管理站点 管理员行动 管理文档生成器 安全 安全性是Web应用程序开发中最重要的主题,Django提供了多种保护工具和机制: 安全概述 Django中披露的安全问题 点击劫持保护 跨站点请求伪造保护 加密签名 安全中间件 国际化和本地化 Django提供强大的国际化和本地化框架,以帮助您开发多语言和世界区域的应用程序: 概述|国际化|本地化|本地化的Web UI格式和表单输入 时区 性能和优化 有许多技术和工具可以帮助您更有效地运行代码 - 更快,并且使用更少的系统资源。 性能和优化概述 地理框架 GeoDjango打算成为世界级的地理Web框架。其目标是尽可能简化地构建GIS Web应用程序并利用空间数据的强大功能。 常用Web应用程序工具 Django提供了Web应用程序开发中常用的多种工具: 身份验证:概述|使用身份验证系统|密码管理|自定义身份验证|API参考 高速缓存 记录 发送电子邮件 联合供稿(RSS / Atom) 分页 消息框架 序列化 会议 站点地图 静态文件管理 数据验证 其他核心功能 了解Django框架的其他一些核心功能: 条件内容处理 内容类型和通用关系 的flatpages 重定向 信号 系统检查框架 网站框架 Django中的Unicode Django开源项目 了解Django项目本身的开发过程以及如何做出贡献: 社区:如何参与|发布过程|团队组织|Django源代码库|安全政策|邮件列表 设计理念:概述 文档:关于本文档 第三方发行版:概述 Django随着时间的推移:API稳定性|发行说明和升级说明|弃用时间表

优秀的个人博客,低调大师

安装CentOS7(文)

步骤: “虚拟机设置”》“cd/dvd“的选择“使用ios映像” 开启虚拟机。 选择第一项安装。 选择语言下拉“中文”“简体中文”,继续 系统选择安装位置、其他存储选项分区,选择“我要配置分区”完成。 下拉列表中选择“标准分区”,在选择“+”》挂载点“boot”容量“200M”、“swap”“内存的2倍(大于等于4G,分8G就可以)”其他的分根分区。完成》 接受改变。 开始安装。设置用户密码(弱密码两下回车) 本文转自 虾米的春天 51CTO博客,原文链接:http://blog.51cto.com/lsxme/1972627,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android OTA相关博文

OTA升级介绍 http://blog.csdn.net/u013947002/article/details/49024637 http://blog.chinaunix.net/uid-29728680-id-5253651.html [FAQ15046]L版本Recovery Mode打开adb功能 http://blog.chinaunix.net/uid-29728680-id-5252653.html [FAQ11059]T卡升级时,在recovery模式下升级完成后将手动重启修改为自动重启 http://blog.chinaunix.net/uid-29728680-id-5254405.html [FAQ12130]如何通过adb command 完成自动SD卡升级? http://blog.chinaunix.net/uid-29728680-id-5171946.html 1、正常开机模式下:手机连接usb成功。 2、输入adb cmd: adb shell " echo\ "--update_package=/sdcard/update.zip\"> /cache/recovery/command" 3、输入:adbreboot recovery MTK recovery相关的FAQ总结 http://blog.csdn.net/ly890700/article/details/56044355?locationNum=9&fps=1

优秀的个人博客,低调大师

我的数智教育转型认知地图

我所参加的是由中国教育干部网络学院主办的“2026 年区域中小学干部教师数字素养提升专题培训”,整个项目共 4 个阶段、14 个教学活动。培训第一阶段的必修课围绕“智能时代的教育理念革新与 AI 教育认知”主题,由三位专家引领:北航熊璋教授分两讲阐述“人工智能前沿与教育强国战略”(43 分钟)与“教育创新与教师人工智能素养提升”(37 分钟),北师大卢宇教授讲授“AI 赋能基础教育”(73 分钟,四讲:人工智能前瞻布局、课程教学数字化变革、师生数字素养、教育评价与治理)。第一阶段选修课则切入一线操作:王胜灵教授的“生成式 AI 在教育中的多元应用”(40 分钟,聚焦智能编写教案、课堂互动、个性化学习),以及王飞老师的“生成式人工智能在教学中的实践与应用”(53 分钟,覆盖备课、多媒体资源、数字人、论文与数据处理,并专设“技术伦理与实践反思”一讲)。五门课程我均已 100% 完成,这份认知地图就是我在五门课程的真实话语之上,对自己教师角色的再认识。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册