首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Hadoop概念学习系列之hadoop Java API、 hadoop Streaming 、hadoop Pipes 三者比较学习(十九...

1、hadoop Java API Hadoop的主要编程语言是Java,因而,Java API是最基本的对外编程接口。 2、hadoop Streaming 1、概述 它是为方便非java用户编写Mapreduce程序而设计的工具包。 Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer, 例如: 采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer) $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper cat \ -reducer wc 2、Hadoop Streaming原理 mapper和reducer会从标准输入中读取用户数据,一行一行处理后发送给标准输出。Streaming工具会创建MapReduce作业,发送给各个tasktracker,同时监控整个作业的执行过程。 如果一个文件(可执行或者脚本)作为mapper,mapper初始化时,每一个mapper任务会把该文件作为一个单独进程启动,mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。 同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。 默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。 对于reducer,类似。 以上是Map/Reduce框架和streaming mapper/reducer之间的基本通信协议。 3、Hadoop Streaming用法 Usage: $HADOOP_HOME/bin/hadoop jar \ $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar [options] options: (1)-input:输入文件路径 (2)-output:输出文件路径 (3)-mapper:用户自己写的mapper程序,可以是可执行文件或者脚本 (4)-reducer:用户自己写的reducer程序,可以是可执行文件或者脚本 (5)-file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。 (6)-partitioner:用户自定义的partitioner程序 (7)-combiner:用户自定义的combiner程序(必须用java实现) (8)-D:作业的一些属性(以前用的是-jonconf),具体有: 1)mapred.map.tasks:map task数目 2)mapred.reduce.tasks:reduce task数目 3)stream.map.input.field.separator/stream.map.output.field.separator: map task输入/输出数 据的分隔符,默认均为\t。 4)stream.num.map.output.key.fields:指定map task输出记录中key所占的域数目 5)stream.reduce.input.field.separator/stream.reduce.output.field.separator:reduce task输入/输出数据的分隔符,默认均为\t。 6)stream.num.reduce.output.key.fields:指定reduce task输出记录中key所占的域数目 另外,Hadoop本身还自带一些好用的Mapper和Reducer: (1) Hadoop聚集功能 Aggregate提供一个特殊的reducer类和一个特殊的combiner类,并且有一系列的“聚合器”(例如“sum”,“max”,“min”等)用于聚合一组value的序列。用户可以使用Aggregate定义一个mapper插件类,这个类用于为mapper输入的每个key/value对产生“可聚合项”。Combiner/reducer利用适当的聚合器聚合这些可聚合项。要使用Aggregate,只需指定“-reducer aggregate”。 (2)字段的选取(类似于Unix中的‘cut’) Hadoop的工具类org.apache.hadoop.mapred.lib.FieldSelectionMapReduc帮助用户高效处理文本数据,就像unix中的“cut”工具。工具类中的map函数把输入的key/value对看作字段的列表。 用户可以指定字段的分隔符(默认是tab),可以选择字段列表中任意一段(由列表中一个或多个字段组成)作为map输出的key或者value。 同样,工具类中的reduce函数也把输入的key/value对看作字段的列表,用户可以选取任意一段作为reduce输出的key或value。 关于Hadoop Streaming高级编程方法,可参考这篇文章:Hadoop Streaming高级编程,Hadoop编程实例。 3、hadoop Pipes 它是为方便C/C++用户编写Mapreduce程序而设计的工具包。 Hadoop pipes允许C++程序员编写mapreduce程序,它允许用户混用C++和Java的RecordReader, Mapper, Partitioner,Rducer和RecordWriter等五个组件。 1. 什么是Hadoop pipes? Hadoop pipes允许用户使用C++语言进行MapReduce程序设计。它采用的主要方法是将应用逻辑相关的C++代码放在单独的进程中,然后通过Socket让Java代码与C++代码通信。从很大程度上说,这种方法类似于Hadoop Streaming,不同之处是通信方式不同:一个是标准输入输出,另一个是socket。 org.apache.hadoop.mapred.pipes.Submitter包中有一个public static方法用于提交作业,该方法将作业封装成一个JobConf对象和一个main方法(接收一个应用程序,可选的配置文件,输入目录和输出目录等),main方法的CLI(Client Line Interface)如下: bin/hadoop pipes \ [-input inputDir] \ #输入数据目录 [-output outputDir] \ #输出数据目录 [-jar applicationJarFile] \ #应用程序jar包 [-inputformat class ] \ #Java版的InputFormat [-map class ] \ #Java版的Mapper [-partitioner class ] \#Java版的Partitioner [-reduce class ] \#Java版的Reducer [-writer class ] \ #Java版的 RecordWriter [-program program url] \ #C++可执行程序 [-conf configuration file] \#xml配置文件 [-D property=value] \ #配置JobConf属性 [-fs local|namenode:port] \#配置namenode [-jt local|jobtracker:port] \#配置jobtracker [-files comma separated list of files] \ #已经上传文件到HDFS中的文件,它们可以像在本地一样打开 [-libjars comma separated list of jars] \#要添加到classpath 中的jar包 [-archives comma separated list of archives]#已经上传到HDFS中的jar文件,可以 在程序中直接使用 本文主要介绍了Hadoop pipes的设计原理,包括设计架构,设计细节等。 2. Hadoop pipes设计架构 用户通过bin/hadoop pipes将作业提交到org.apache.hadoop.mapred.pipes中的Submmit类,它首先会进行作业参数配置(调用函数setupPipesJob),然后通过JobClient(conf).submitJob(conf)将作业提交到Hadoop集群中。 在函数setupPipesJob中,Java代码会使用ServerScoket创建服务器对象,然后通过ProcessBuilder执行C++binary, C++binary实际上是一个Socket client,它从Java server中接收key/value数据,经过处理(map,partition或者reduce等)后,返还给Java server,并由Java Server将数据写到HDFS或者磁盘。 3. Hadoop pipes设计细节 Hadoop pipes允许用户用C++编写五个基本组件:mapper,reducer,partitioner,combiner,recordReader,这五个组件可以是Java编写的,也可以是C++编写的,下面分别介绍这几个函数的执行过程。 (1) mapper Pipes会根据用户的配置定制InputFormat,如果用户要使用Java的InputFormat(hadoop.pipes.java.recordreader=true),则Hadoop会使用户输入的InputFormat(默认为TextInputFormat);如果用户使用C++的InputFormat,则Pipes Java端的代码会读取每个InputSplit,并调用downlink.runMap(reporter.getInputSplit(), job.getNumReduceTasks(), isJavaInput);通过socket传输给C++端的runMap(string _inputSplit, int _numReduces, bool pipedInput)函数。 在C++端,RecordReader会解析整个InputSplit,获取数据来源(主要是文件路径)和每个key/value对,并交给map函数处理,map将每个key/value的处理结果通过emit(const string& key, const string& value)函数返还给Java Server。 (2) paritioner C++端处理完的结果会通过emit(const string& key, const string& value)函数传给Java Server,以便将数据写到磁盘上。在emit函数中,如果用户定义了自己的paritioner,则Pipes会通过该函数判断当前key/value将给哪个reduce task处理,并调用partitionedOutput(int reduce, const string& key,const string& value)函数将key/value传递给相应的reduce task。 (3) reducer reducer的执行过程与mapper基本一致。 4. 总结 Hadoop pipes给C++程序员提供了一个编写MapReduce作业的方案,它使用socket让Java和C++之间进行通信,这类似于thrift RPC的原理,也许Hadoop Pipes用thrift编写会更加简单。 Hadoop pipes使用Java代码从HDFS上读写数据,并将处理逻辑封装到C++中,数据会通过socket从Java传输给C++,这虽然增加了数据传输的代价,但对于计算密集型的作业,其性能也许会有改进。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5449082.html,如需转载请自行联系原作者

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

学习 MySQL 必须了解的几个 Undo 概念

Undo 模块的第一篇,聊聊 Undo 相关的几个概念。 > 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 > 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 > 本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 1. 引子 事务执行过程中,如果改变了(插入、更新、删除)表中数据,会产生 Undo 日志。 Undo 日志会存放到磁盘文件中。用于管理 Undo 日志的逻辑结构,从上往下分为 4 层: 第 1 层:Undo 表空间。 第 2 层:回滚段。 第 3 层:Undo 段。 第 4 层:Undo 页。 接下来,我们从下往上来介绍这 4 层逻辑结构。 2. Undo 页 Undo 页是用于存放 Undo 日志的直接容器。和存放表中数据的页大小一样,Undo 页的大小也默认为 16K。 一个事务产生的 Undo 日志,可能需要一个或者多个 Undo 页来存放。归属于同一个 Undo 段的多个 Undo 页,会形成一个链表。 3. Undo 段 如果一个事务产生了大量 Undo 日志,就需要有很多 Undo 页来存放这些 Undo 日志。 为了管理数量繁多的 Undo 页,InnoDB 使用了一种称为段的逻辑结构。管理 Undo 页的段,称为 Undo 段。 即使一个事务产生的 Undo 日志只需要一个 Undo 页来存放,这一个 Undo 页依然会使用 Undo 段来管理。毕竟,不到事务提交的时候,谁知道它产生的 Undo 日志需要几个 Undo 页来存放呢? 插入记录产生的 Undo 日志,只用于事务回滚,不会用于读取记录的历史版本。事务提交即将完成时,这些 Undo 日志可以直接清除。 更新、删除记录产生的 Undo 日志,既用于事务回滚,也用于读取记录的历史版本,必须等到任何事务都不需要通过这些 Undo 日志读取记录的历史版本时,它们才能被清除。 这两类操作产生的 Undo 日志的清除时机不同,InnoDB 用不同的 Undo 段,来管理存放插入记录、更新和删除记录产生的 Undo 日志的 Undo 页。 虽然 Undo 段的结构一样,但是,代码里对它们进行了区分: Insert Undo 段,用于管理存放插入记录产生的 Undo 日志的 Undo 页。 Update Undo 段,用于管理存放更新、删除记录产生的 Undo 日志的 Undo 页。 4. 回滚段 InnoDB 支持很多个事务并发执行,根据执行的操作不同、表的类型不同,每个读写事务会分配一个或者多个 Undo 段,数量繁多的 Undo 段同样需要被很好的管理起来。 和管理 Undo 页一样,InnoDB 也使用了段来管理 Undo 段,这种段称为回滚段。 每个回滚段都有个段首页,其中包含 1024 个小格子。每个格子占用 4 字节存储空间,用于保存一个 Undo 段的段首页的页号。这意味着一个回滚段可以管理 1024 个 Undo 段。 如果某个小格子暂时没有管理对应的 Undo 段(或者说这个小格子暂时空闲),那么,它存放的就是 4 字节能够表示的最大整数 4294967295,代码里用 FIL_NULL 来表示。 根据表中数据的生命周期,用户创建的表可以分为两类: 用户普通表:MySQL 重启之后,表结构和表中数据都存在。 用户临时表:MySQL 重启之后,表结构存在,表中数据被丢弃。 事务改变(插入、更新、删除)用户普通表的数据,MySQL 重启之后,回滚未提交完成的事务时,需要通过 Undo 日志来把记录恢复到改变之前的样子。这要求保证 Undo 日志不丢失,改变数据产生 Undo 日志的同时,需要产生对应的 Redo 日志,以保证 Undo 日志的持久化。 事务改变(插入、更新、删除)用户临时表的数据,MySQL 重启之后,表中数据就会被丢弃。回滚未提交完成的事务时,不需要把记录恢复到改变之前的样子。这种情况下,不需要保证 Undo 日志不丢失,改变记录产生的 Undo 日志不需要持久化,也就不会产生对应的 Redo 日志。 产生 Undo 日志时,是否需要产生对应的 Redo 日志,两者的性能不同。改变用户普通表、用户临时表的数据,InnoDB 会分配不同的回滚段。 读写事务分配回滚段,可以分为三种情况: 如果事务只改变了用户普通表的数据,分配一个回滚段。 如果事务只改变了用户临时表的数据,分配一个回滚段。 如果事务既改变了用户普通表的数据,又改变了用户临时表的数据,分配两个回滚段。 5. Undo 表空间 磁盘上用于存放 Undo 日志的文件,在逻辑上称为 Undo 表空间。 MySQL 作为一个支持高并发的数据库,允许同时执行很多个事务。根据改变数据的表的类型不同,每个读写事务会分配一个或者两个回滚段,可能会存在比事务数量更多的回滚段。 如果所有回滚段、回滚段管理的 Undo 段、Undo 段管理的 Undo 页,都存放到一个 Undo 表空间中,可能会导致 Undo 表空间文件占用磁盘空间巨大。 虽然 InnoDB 会根据系统变量 innodb_undo_log_truncate、innodb_max_undo_log_size 的值,自动截断 Undo 表空间,把 Undo 表空间文件恢复到初始创建时的大小,但是这有一个条件,就是这个 Undo 表空间中所有回滚段都处于未被使用状态。 如果读写事务不断,只有一个 Undo 表空间,显然就无法做到自动截断了。 那么,想要手动截断可行吗? 靠拼手速,找到一个没有任何读写事务的间隙,显然更不可行了。 为此,InnoDB 支持多个 Undo 表空间。Undo 表空间的数量由系统变量 innodb_undo_tablespaces 控制,默认值为 2(最小值,这意味着至少有 2 个 Undo 表空间),最大值为 127。 既然有了多个 Undo 表空间,每个 Undo 表空间中回滚段的数量,也需要确定下来,不能你多我少,你少我多,大家得一样多,这样才好管理。每个 Undo 表空间中回滚段的数量由系统变量 innodb_rollback_segments 控制,默认值及最大值都为 128,最小值为 1。 6. 总结 Undo 表空间管理回滚段、回滚段管理 Undo 段、Undo 段管理 Undo 页、Undo 页管理 Undo 日志。 InnoDB 支持 2 ~ 127 个表 Undo 表空间,每个 Undo 表空间支持 128 个回滚段,总共支持 256 ~ 16256 个回滚段。 每个回滚段管理 1024 个 Undo 段,总共支持 262144 ~ 16646144 个 Undo 段。 **留个小问题,欢迎评论区留言互动:**只考虑 Undo 段的数量限制,127 个 Undo 表空间最多、最少支持同时执行多少个读写事务? 更多技术文章,请访问:https://opensource.actionsky.com/ 关于 SQLE SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。 ✨ Github:https://github.com/actiontech/sqle 📚 文档:https://actiontech.github.io/sqle-docs/ 💻 官网:https://opensource.actionsky.com/sqle/ 👥 微信群:请添加小助手加入 ActionOpenSource 🔗 商业支持:https://www.actionsky.com/sqle 询问AI

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

PHP 在 2024 年还值得学习吗?

IOBE 在2024年 4 月榜单中曾指出,随着众多竞争对手进入市场以及语言本身出现的一些问题;PHP 已经不复往日辉煌,在 TIOBE 指数中的排名跌至历史最低点(第 17 位)。 在有关 PHP 已经日渐没落的言论四起的背景下,软件工程师 Sotiris Kourouklis近日发布了一篇名为“Is PHP still worth it in 2024 ?”的博客文章,对 PHP 语言进行了一番详尽的分析,探讨该语言在现代 Web开发中的实用性和效率。 并最终得出结论称,PHP 在 2024 年仍然是 Web 开发的一个不错选择。 以下为全文译文: 尽管许多人认为 PHP 是一种古老而不合格的语言,但在 2024 年,它仍然是所有网站中使用最多的语言。它的糟糕名声往往与 WordPress 有关,后者被认为是 21 世纪最糟糕的软件之一。 撇开 WordPress 不谈,让我们快速了解一下 PHP 以及为什么它在 2024 年可能是 Web开发的一个不错选择。 性能 PHP 随着时间的推移正在变得更快,尤其是最新版本,如 PHP 8.1 及以上版本,速度相当快。尽管在某些情况下它可能比 Go 或 Java 等编程语言慢,但在速度上,它至少可以与 Python 或 Node.js 媲美,甚至可能更快。 开发速度 即使你不熟悉PHP,它其实与 Python 非常相似,只有一些细微的差别。这种相似性有助于加快开发速度。从执行简单的CRUD操作,到处理文件、webhook和websocket,几乎所有事情都可以用最少的代码完成。这是因为几乎对于你可能需要完成的任何任务,都有现成的库可用,从而无需你自己编写大量代码。 部署 PHP 的关键优势之一是其部署的简便性,即使是在大规模应用中也是如此。只需一个简单的 PHP 服务器和 nginx,你就可以在几个小时内启动并运行 可扩展性 那么可扩展性如何呢?当然,使用任何编程语言对应用程序进行负载均衡是必要的,尤其是当你每天接到数百万个请求时。但即便你没有,只要你在端点上正确实现缓存,就不会有任何问题。 代码整洁与可读性 在编写整洁代码方面,PHP 可能会出现混乱。然而,使用像 Laravel 这样提供模板的框架就能解决这个问题。即使在拥有超过 20 万行代码(不包括自动生成的文件)的大型 API 中,只要保持代码简单,代码的可读性仍然可以非常高。 我认为唯一更适合编写简洁代码的编程语言是 Python。 结论 总之,建议使用 PHP/Laravel 构建主要的单体 API,因为其强大的框架功能能够简化大型代码库的管理。对于特殊需求,特别是涉及人工智能或其他 CPU 密集型操作的需求,可以考虑使用针对这些任务进行优化的其他编程语言。 这种战略性的划分使你能够利用每种语言和技术的优势,确保项目在效率和可维护性方面表现出色。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册