首页 文章 精选 留言 我的

精选列表

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

14% 的 Android 应用隐私政策和数据收集行为自相矛盾

在去年发表的一项学术研究中,研究人员创建了一个名为PolicyLint的工具,对11430个Play Store应用程序隐私政策中使用的文案进行分析。他们发现,14.2%的安卓应用隐私政策和数据收集行为自相矛盾。 例如,隐私政策在某一节中指出,他们不收集个人数据,而在随后的文字当中声明他们收集电子邮件或用户名,这些显然是可识别的个人信息。尽管研究团队无法确定应用程序开发者在其隐私政策中使用矛盾陈述的意图,但研究人员认为,这种做法主要目的是误导用户。 然而,他们也发现了相反的证据。例如,研究团队发现了59个APP使用在线服务自动生成隐私策略。对这些在线服务进行更深入的研究后发现,这些自相矛盾的声明是模板本身的一部分,而不是应用程序开发者添加的内容。 但是,绝大多数其他隐私策略对于每个应用程序都是唯一的。研究小组表示,在这些情况下,这些应用程序开发者可能会受到欧盟和美国隐私监管机构的罚款。自相矛盾的陈述可能导致欧盟FTC和DPA(数据保护机构)对开发者强制罚款。 研究团队也发现,在他们分析的68051个应用中,有10.5%的应用与第三方服务共享个人数据,但他们没有在隐私政策中声明。此外,在68051个应用程序中,只有22.2%的应用程序在隐私政策中明确指定了第三方合作伙伴或分支机构,绝大多数应用程序都隐藏了最终获得用户数据的第三方合作伙伴或分支机构。 稿源:cnBeta

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

Wine 项目代码接近 600 万行,提交次数约为 14 万

Wine 5.0 稳定版于昨日正式发布,作为一个具有里程碑意义的版本,我们不妨通过 Wine 5.0 Git 仓库的开发统计信息来了解一下这个在 Linux 平台上广受欢迎的程序(尤其是运行 Windows 游戏和应用方面),以及它的发展趋势。 通过在 Wine Git 仓库运行 GitStats 可以看到,目前大约有 1586 位不同的作者进行了总计 135558 次提交,而最早的 Wine 代码可追溯到其在 1993 年首次发布的时候。 在 2019 年,Wine 总计有 7373 次提交,累计增加了 478947 行代码,同时删除了226911 行代码。历史上 Wine 提交数最多的年份可追溯到2008~2009 年。同时我们也能看到,2019 年的提交数也是近几年来最高的,在一定程度上这要归功于 Valve / CodeWeavers 在游戏方面的改进。 去年,对 Wine 贡献最多的贡献者是 Zebediah Figura,大约 17% 的提交数来自于他的贡献,其次是 Wine 项目的负责人 Alexandre Julliard。在 2019 年期间,其他杰出的 Wine 开发者包括 Julliard, Nikolay Sivov, Jacek Caban, Henri Verbeet 和 Michael Stefaniuc。在这一年里,约 142 位作者为 Wine 贡献了代码,比 2018 年还要多一些。 还有一个比较有意思的数据是提交时间,可以看到,每天的 5-7 点以及 15-17点是提交数最多的时段,看来熬夜爆肝写代码的开发者也不在少数,而每周的周五至周末则是提交数的最少的几天,这也侧面反映了开发者基本都有时间来享受自己的周末。 截至 Wine 5.0,其代码库的代码总数为5,708,955 行,根据当前的趋势,Wine 6.0 的代码总数很有可能将超过 600 万行。 更多关于 Wine 项目的开发统计信息请点此查看。 稿源:Phoronix.com 作者:Michael Larabel

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

Tablestore入门手册-UpdateRow接口详解| 1月14号云栖号夜读

点击订阅云栖夜读日刊,专业的技术干货,不容错过! 阿里专家原创好文 1.Tablestore入门手册-UpdateRow接口详解 表格存储Tablestore入门手册系列主要介绍表格存储的各个功能接口和适用场景,帮助客户了解和使用表格存储Tablestore。本文对表格存储Tablestore的UpdateRow接口进行介绍,包括其参数、功能示例、使用场景等。阅读更多》》 2.F1 Query: Declarative Querying at Scale F1 Query 是一个大一统的 SQL 查询处理平台,可以处理存储在 Google 内部不同存储介质(Bigtable, Spanner, Google Spreadsheet)上面的不同格式文件。简单来说,F1 Query 可以同时支持如下功能:OLTP 查询,低延迟 OLAP 查询,ETL 工作流。F1 Query 的特性包括: 为不同数据源的数据提供统一视图 利用数据中心的资源提供高吞吐和低延迟的查询 High Scalability Extensibility 阅读更多》》 3.标记 (TAG) 您的堡垒机(bastionhost)资源 标签是资源Meta信息,标签是一些充当元数据的词和短语,支持用户自定义和系统预制。每个标签都包含一个键(Key)和一个值(Value)。标签是一种资源的属性描述。标签与资源是 多对多的关系。标签可让您按各种标准对 阿里云 资源进行分类。这在您具有相同类型的许多资源时会很有用,您可以根据分配给资源的标签快速识别特定资源。阅读更多》》 4.如何将数据仓库从 AWS Redshift 迁移到阿里云 AnalyticDB for PostgreSQL 阿里云AnalyticDB for PostgreSQL(以下简称 ADB PG,即原HybridDB for PostgreSQL)为基于PostgreSQL内核的MPP架构的实时数据仓库服务,可以支持复杂ETL任务,也支持高性能在线查询,同阿里云生态紧密结合。AWS 的Redshift同样为基于PostgreSQL内核引擎的MPP数据仓库服务器,在AWS被广泛作为数据仓库使用。ADB PG和Redshift从架构到语法上同Redshift高度兼容。本文重点介绍两个数仓平台如何进行迁移。阅读更多》》 5.支付宝移动端 Hybrid 解决方案探索与实践 目前 mPaaS H5 容器 Demo 源码已发布至 GitHub,全新的接入方式让你可以一键集成 mPaaS 环境并快速接入 H5 容器,体验统一的容器和内核,获取媲美原生的 Hybrid 方案及完美的动态能力。阅读更多》》 往期精彩回顾 如何打造“智能助理”?阿里对话开发平台这样做| 1月13号云栖号夜读 更多干货内容 请关注阿里云云栖号微信公众号!

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

突破Java面试(14)-分布式搜索引擎的架构

以下用ES表Elastic Search 0 Github 1 面试题 说说ES的分布式架构原理 2 考点分析 在搜索这块,曾经lucene 是最流行的搜索库.几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?但现在不问了,因为现在项目基本都是采用基于 lucene 的分布式搜索引擎—— ElasticSearch. 现在分布式搜索基本已经成为互联网系统的标配,其中尤为流行的就是 ES,前几年一般用 solr。但是最近基本大部分企业和项目都开始转向 ES. 所以互联网面试,肯定会跟你聊聊分布式搜索引擎,就一定会聊到ES! 如果面试官问你第一个问题,确实一般都会问你 es 的分布式架构设计能介绍一下么?就看看你对分布式搜索引擎架构的一个基本理解。 3 详解 ES的设计理念就是分布式搜索引擎,底层其实还是基于 lucene 的.核心思

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

2018-05-14 代码考古-Python3官方教程字典例程

知乎原链 Data Structures中的第一个例程: >>> tel = {'jack': 4098, 'sape': 4139} >>> tel['guido'] = 4127 >>> tel {'sape': 4139, 'guido': 4127, 'jack': 4098} >>> tel['jack'] 4098 >>> del tel['sape'] >>> tel['irv'] = 4127 >>> tel {'guido': 4127, 'irv': 4127, 'jack': 4098} >>> list(tel.keys()) ['irv', 'guido', 'jack'] >>> sorted(tel.keys()) ['guido', 'irv', 'jack'] >>> 'guido' in tel True >>> 'jack' not in tel False 大多数读者也许都认为这些字符串和数字并没有特别意义. 如果真是这样, 这个例程还不如用 dict = {'aa': 100, 'bb': 200} 之类来的一目了然, 省去多余的猜度. 不巧发现"guido"是Python创作者的名字(Guido van Rossum), 就觉得不该这么简单. 根据python源码27年前的commit6fc178f46d40aa068a713b509904d343ee55cfa6, 这个教程中的示例代码是Guido本人编写的. 因此与他1991年8月附近的经历应该有关. 接着找到他的简历中的: From 1986 till 1991 I was with the Amoeba project, headed by Sape Mullender 发现Sape也是人名, 基本可以确定是他的同事的名字. 接下去搜到这里"Open Software Foundation"文末, Sape Mullender的电话是+20-592 4139, 可以印证例程中的变量tel应该指的是当时他们的电话号码后四位. 接着找到Jack的号码: +31 20 592 4098 另外还找到Guido用过4127这一号码, 也许这是CWI那时的一个多人号码, 如此文, 就能解释这个代码示例中还有"irv"也映射到了这个号码. 原来, 这是一个电话簿. 考虑到Python创造之初, 主要用户都是Guido的同事, 也是当时他写教程的读者, 这个示例代码对于他们来说是很容易理解的. 但随着几十年Python的推广, 它的含义也就被掩埋了. 英文代码风格中不提倡缩写名词挺合理的. 如果原例程中的变量名是phone或者telephone, 也会比tel好理解一些. 字符串的首字母大写也会更易于理解它们是人名. 汉化示例代码时, 打算就用"电话簿"作变量名.

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

【Java入门提高篇】Day14 Java中的泛型初探

泛型是一个很有意思也很重要的概念,本篇将简单介绍Java中的泛型特性,主要从以下角度讲解: 1.什么是泛型。 2.如何使用泛型。 3.泛型的好处。 1.什么是泛型? 泛型,字面意思便是参数化类型,平时所面对的类型一般都是具体的类型,如果String,Integer,Double,而泛型则是把所操作的数据类型当作一个参数。如,ArrayList<String>(),通过传入不同的类型来指定容器中存储的类型,而不用为不同的类型创建不同的类,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 2.如何使用泛型? 我们先来看看泛型是什么样子的: public interface List<E> { void add(E); Iterator<E> iterator(); } 这是List接口,这里用E来代替具体类型,这样就可以往里面传入任意类型,也许你要问了,直接使用Object不好吗?我们来用一个栗子比较一下: 先用非泛型方式来实现一下: public class ObjHolder { private Object a; public ObjHolder(Object a) { this.a = a; } public void set(Object a) { this.a = a; } public Object get(){ return a; } public static void main(String[] args) { ObjHolder holderA = new ObjHolder("Frank"); System.out.println((String) holderA.get()); holderA.set(233); System.out.println((Integer) holderA.get()); } } 这样就实现了一个包装类,可以用来存取一个任意类型的对象。但是每次取出来都需要进行类型转化,如果方法的参数类型是ObjHolder的话,无法知道它里面存放的对象的确切类型,这样就反而带来很多不必要的麻烦。 现在来看一下用泛型实现是怎样的: public class GenericHolder<T> { private T obj; public GenericHolder(T obj){ this.obj = obj; } public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } public static void main(String[] args) { GenericHolder<String> holderA = new GenericHolder<String>("Frank"); System.out.println(holderA.getObj()); //holderA.set(233);无法编译通过,因为只能往holderA中存入String类型 GenericHolder<Integer> holderB = new GenericHolder<Integer>(233); System.out.println(holderB.getObj()); } } 这样通过传入类型信息如String和Integer,来代替其中的泛型参数T,这里的T可以理解为一个占位符,用其他字母也是可以的,一旦传入具体类型,如String,则所有使用T的地方都会用String类型替换。 对比一下上面两种方式,区别在哪呢?打个比方,不用泛型的实现方式,相当于一个袋子,里面可以装任意类型的黑盒子,你什么都可以往里放,但是你可能不知道你下一个取出来的是什么东西,而泛型的实现方式,相当于一个贴了标签的黑盒子,标签上可以写任何信息,如写上水果,那么这个盒子就只能装水果,你也会知道每次取出来的肯定是水果而不是其它东西,同理类似如写上杂粮,那么这个袋子就只能用来装杂粮,但其实上都是同一种袋子,并不是为每一种类型的东西准备一种袋子。(因为Java的泛型使用了类型擦除机制,至于类型擦除是什么,暂时不做过多介绍,以后会有文章做更详细的说明)。 泛型被广泛应用在容器类中,如ArrayList<T>() 表示用于存储特定类型的数组,除此之外,还有很多泛型接口,如Comparable<T>。使用泛型能带来极大的便利性。 在泛型中可以对类型进行限制,如:<T extends Comparable<T>>表示只能传递已经实现了Comparable接口的类型对象,这里是使用extends而不是implement,而且对于接口也只能写一个。<T extends Number>表示只能接收Number类或者其子类的对象。与之相反的边界通配符是super,如:<T extends Phone>表示只能接收类型为Phone或其父类的对象。 在使用extends和super的时候需要特别注意,因为使用它们是有副作用的,比如: List<T extends Number> list = new ArrayList<Number>(); list.add(4.0);//编译错误 list.add(3);//编译错误 因为泛型是为了类型安全设计的,如果往List<? extends Number> list 塞值的话,在取的时候就无法确认它到底是什么类型了,编译器只知道它是Number类型或者它的派生类型,但无法确定是哪个具体类型。通配符T表示其中存的都是同一种类型,因此使用extend下边界的话是无法进行存操作的。同理super下边界是不能取值的。 那什么时候该用extends,什么时候该用super呢?先说结论: PECS原则: 频繁往外读取内容的,适合用上界Extends。 经常往里插入的,适合用下界Super。 3.泛型的好处? 泛型看起来很炫酷,但初看起来,好像没什么卵用?客官且慢,进屋里坐(滑稽)。 使用泛型的好处我们来一项一项列出来: 1,类型安全。 这是最显而易见的,泛型的主要目标是提高 Java 程序的类型安全。通过使用泛型定义的变量的类型限制,可以很容易实现编译期间的类型检测,避免了大量因为使用Object带来的不必要的类型错误。 没有泛型,这些对Object变量的类型假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中),而且每次使用前还需要进行不安全的强制类型转换。 2,代码复用。 泛型的一个很大好处就是增加了代码的复用性,比如上面的 GenericHolder 类,就能存取任意类型的对象,而不用为每种类型写一个包装类。 3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。 至此,本篇讲解完毕,如果想要更好的理解,还需要多写代码,在实践中去应用。 欢迎大家继续关注! 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan真正重要的东西,用眼睛是看不见的。

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

MapReduce与批处理------《Designing Data-Intensive Applications》读书笔记14

之前的文章大量的内容在和大家探讨分布式存储,接下来的章节进入了分布式计算领域。坦白说,个人之前专业的重心侧重于存储,对许多计算的内容理解可能不是和确切,如果文章中的理解有所不妥,愿虚心赐教。本篇将和大家聊一聊分布式计算的一个子集:批处理。 批处理系统通常也叫脱机系统,需要大量的输入数据,运行一个作业来处理它,并产生一些输出数据。工作通常需要一段较长的时间(从几分钟到几天)。批处理作业通常是周期性地运行的(例如,一天一次)。批处理作业的主要性能度量通常是吞吐量。 1.MapReduce 批处理是我们构建可靠、可扩展和可维护应用程序的重要组成部分。而谷歌在2004年发布的批处理算法:MapReduce,是处理大规模数据集的重要模型,虽然与为数据仓库专门开发的并行处理系统相比,MapReduce是一种相当低级的编程模型,但它依然对批处理的模型理解有很大的帮助,所以我们以MapReduce作为起点,开启我们的批处理的计算之旅。 分布式存储系统与MapReduce MapReduce是一种相当生硬,野蛮的工具,但却十分有效。单个MapReduce作业:可以有一个或多个输入,并生成一个或多个输出。 MapReduce作业是函数式编程的模型,不会修改输入,除了生成输出之外,不会产生任何副作用。输出文件按顺序编写一次(不修改已写入文件的任何现有部分)。 MapReduce作业需要读、写文件的分布式文件系统。如:HDFS,GFS,GlusterFS,Amazon S3 等等。之后我们使用HDFS作为运行环境,但这些原则适用于任何的分布式存储系统。HDFS是基于无共享的存储集群,而共享磁盘存储由集中式存储设备实现,通常使用定制硬件和特殊的网络基础设施(如光纤通道)。所以HDFS不需要特殊的硬件,只需要由传统的数据中心网络连接的计算机。HDFS的守护进程的每台计算机上运行,将允许其他节点访问存储在该计算机上文件的数据,而中央服务器NameNode跟踪哪些文件块存储在哪台机器。因此,创建一个大的文件HDFS上,可以使用集群之中的所有计算机。 为了容忍机器和磁盘故障,可以在集群的多台机器上复制文件块。所以多台机器上的同一数据的几个副本,当然这里也可以使用纠删码技术,可以允许丢失的数据以比完全复制更低的存储开销被存储。纠删码技术类似于RAID,它在同一台机器上的多个磁盘上提供冗余。不同之处在于,对纠删码的副本进行读写时需要额外的编解码计算。 MapReduce的工作流程 MapReduce与传统的UNIX命令管道的主要区别在于,MapReduce可以跨越多台计算机并行计算,手动编写的Mapper和Reducer不需要了解输入来自何处或输出的去处,由框架来处理机器之间移动数据的复杂性。 下图展示了一个MapReduce作业的工作流程,作业的输入是HDFS的一个目录,目录内每个文件块作为一个单独的分区,由一个单独的Map任务处理,每个输入文件的大小通常是数百兆字节(取决于HDFS的块大小)。MapReduce的调度器试图在存储输入文件副本块机器上运行Mapper,只要该机器有足够内存和CPU资源来运行Map任务。通过这样的方式节省了在网络上复制文件块的带宽,减少了网络负载,利用了分布式计算的局部性原理。 MapReduce的工作数据流 应用程序代码被打包成Jar文件,上传到分布式存储系统之上,对应的节点会下载应用程序的Jar文件,然后启动Map任务并开始读取输入文件,每次将一条记录传递给Mapper的回调函数,并输出Map处理过后的键值对。Map的任务的数量取决于输入文件块的数量,但是Reduce任务的数量由作业作者配置,为了确保同一个键的所有键值对都由同一个Reducer处理,框架使用一个散列键来确定键值对应该对应的Reduce任务。 MapReduce需要对键值对进行排序,但数据集可能太大,无法用一台机器上的常规排序算法进行排序。所以,每个Map任务根据散列将键值对输出到对应的Reducer的磁盘分区,并对键值对进行排序。每当Mapper完成工作时,MapReduce调度器通知Reducer,它们可以开始从Mapper获取输出文件。Reducer从Mapper端获取对应的输出的键值对文件,并进行归并排序,保持排序顺序,这个过程称之为Shuffle。 最后,Reducer调用Reduce函数来处理这些有序的键值对,并且可以生成任意数量的输出记录,并写入分布式存储系统。这便是一次完整的MapReduce任务的全过程。 MapReduce作业的链式调度 一个MapReduce作业可以解决的问题范围是有限的。因此,MapReduce的作业需要被链接到工作流中,这样一个作业的输出就成为下一个作业的输入。Hadoop的MapReduce框架,可以隐式的通过目录名来链接:第一个MapReduc的作业配置写输出到HDFS的指定的目录,第二个MapReduce作业读取相同的目录名作为输入。从MapReduce的框架来看,它们是两个独立的工作。 只有当前一个作业成功完成时,下一个作业的输入才会被认为是有效的(失败的MapReduce作业的结果会被丢弃)。所以不同的作业之前会产生依赖关系的有向无环图,来处理这些依赖关系的工作执行,目前Hadoop有许多对批处理的调度程序,如:Oozie,Azkaban, Luigi, Airflow,等。在一个大型公司之中,许多不同的团队可能运行不同的工作,它们读取彼此的输出,所以通过工具支持管理等复杂的数据流是很重要的。 2.MapReduce作业的业务场景 我们通过一个实例,来具体了解类MapReduce作业的业务场景。如下图所示:左边是一个由日志记录的行为描述,称为用户活动,右边是一个数据库的用户用户表。 用户活动日志与用户的信息表 数据分析人员的任务可能需要将用户活动与用户的信息关联起来:分析哪些页面最受年龄组的欢迎。但是用户活动日志之中,只包含了用户的ID,而不包含完整的用户信息。这时候就需要一个Join操作,最简单的实现思路是逐一检查用户活动,并对每个用户ID来查询用户数据库,显然,这样的实现会带来很糟糕的性能表现。任务吞吐量将受到数据库服务器往返时间的限制,并且本地缓存的有效性将非常依赖于数据的分布,并行运行海量的查询可能会超出数据服务器的处理能力。为了在作业过程之中有更大的吞吐量,计算必须(尽可能地)在一台机器上进行。通过网络上随机访问请求要处理的每一条记录是十分缓慢的。此外,查询远程数据库将意味着批处理作业变得不确定,因为远程数据库中的数据随时可能会更改。 因此,更好的方法是获取用户数据库的副本(使用ETL将数据库的数据中提取到“数据仓库”),并将其放入分布式存储系统之中。这样,我们可以使用MapReduce这样的工具来更加有效地处理。如下图所示:由MapReduce框架按键对Mapper输出进行分区,然后对键值对排序时,其效果是所有活动事件和具有相同用户ID的用户记录在同一个Reducer之中并且彼此相邻。之后,Reducer可以很容易地执行实际的Join逻辑:每个用户ID都调用一次Reduce函数,输出活动的URL和用户的年龄。随后可以启动一个新的MapReduce作业来计算每个URL的查看器年龄分布,并按年龄组分组。 通过MapReduce作业来处理的业务逻辑 接下来,我们来梳理一些业务层面的细节,以及用MapReduce框架的一些细节: 业务逻辑分离 在上述的业务场景之中,最重要的就是保证同一个用户ID的活动需要汇集到同一个Reducer来进行处理,这个就是前文我们聊到Shuffle的功能,所有键值相同的键值对都会被传递到相同的目的地。MapReduce编程模型将计算的通信协作与应用程序逻辑处理分离。这就是MapReduce框架的高明之处,由MapReduce的框架本身处理所有的网络通信,业务人员专注于应用程序代码的实现,如果在这个过程之中出现了节点的故障,MapReduce透明的失败重试来确保应用程序逻辑不受影响。 数据分组 数据除了Join场景之外,通过键值对对数据进行分组也是数据系统常用的操作:对所有具有相同键的记录都形成一个组,之后对组内的数据进行操作。 现在问题来了?我们怎么样使用MapReduce来实现这样的分组操作呢?实现方式也很简单,通过在Map函数之中对键值对进行改造,插入使键值对产生预期分组的Key,之后分区和排序将相同的Key汇集到同一个Reducer之中。在MapReduce上实现时,分组和Join看起来非常相似。 数据倾斜 如果同一个键相关的数据量非常大,对于MapReduce框架来说可能会成为一个挑战,因为相同键会汇集到同一个Reducer进行处理。例如,在社交网络中,少数名人可能有数以百万计的追随者。(第一章我们就举过这个例子)所以在MapReduce作业之中存在数据倾斜,如何来进行补偿呢?在Pig之中,会先运行一个采样任务来确定哪个键是热的,在作业实际执行时,Mapper会把出现数据倾斜的键值对通过随机选择分发个指定的多个Reducer。而Hive的倾斜连接优化采用了另一种方法。它需要在表元数据中显式指定热键,它将与这些键相关的记录存储在元数据之中,后续对表进行操作时,采用类似于Pig的优化思路。 3.批处理的意义 前文已经讨论了MapReduce作业的工作流程,现在我们回到一个问题来:所有处理的结果是什么?为什么我们一开始就要做所有这些工作? 批处理操作的核心是对数据系统之中的数据进行解析,这类操作需要扫描大量的记录,进行分组和聚合,并输出到数据库以报告的形式呈现,通过报告给消费者或分析师进行数据决策。 同样,批处理适合建立搜索索引。谷歌最初使用MapReduce是为它的搜索引擎构建索引,通过5到10个MapReduce作业的工作流来实现实现的。如果需要执行全文搜索一组文件中,通过批处理过程是一个非常有效的方法:由每个Map任务对数据分区,之后每个Reducer建立分区索引,将索引文件写入到分布式文件系统。因为通过关键字查询搜索索引是只读操作,这些索引文件在创建后是不可变的。 如果索引的文档集发生变化,一个选项是周期性地为整个文档集重新运行整个索引工作流程,并在完成新索引文件时将以前的索引文件替换为新的索引文件。(如果只是少量文件的变化,则不适用批处理任务进行处理) 批处理的作业的将输入视为不可变且避免副作用(如向外部数据库写入),不仅实现了良好的性能,而且变得更容易维护。如果您在代码中引入了一个bug,输出错误,可以简单地回滚到以前版本的代码并重新运行该作业,并且再次输出正确的结果。更简单的解决方案,可以将旧输出保存在不同的目录中,然后简单地进行切换。由于这种易于回滚的特性,功能开发可以比在不能回滚的环境中进行得更快。有利于敏捷的软件开发。批处理将逻辑处理代码与配置分离,这里便允许优雅地重用代码:一个团队可以专注于实现逻辑处理,而其他团队可以决定何时何地运行该作业。 小结: 本篇我们梳理了MapReduce的处理框架,并探讨了许多批处理作业的特点。除了MapReduce的模型,数据系统中仍然有许多处理数据的计算模型,接下来会和大家来继续探讨数据系统之中的计算模型..............

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

福利 | 14篇精选行业热点、实战指导、资源整合干货合集

以下为选文组出品的文章: 时事热点系列:与你一起关注当下的社会热点问题。 AI系统首次实现自主编程,完爆初级程序员! 本文为你介绍首个能够自动生成完整软件程序的机器学习系统。 人工智能堵住了应试教育的华容道 本文针对人工智能学习的特点,探讨现行学科教育模式存在的问题及未来的改变。 最顶级的AI科学家正在离开大学:不止财务自由的诱惑 越来越多的顶级AI研究员离开高校走入业界,这是学以致用还是杀鸡取卵? 入门指南系列:世界顶级数据科学家为你指导,带你轻松入门。 吴恩达推荐好文:中国人工智能的崛起 本文为你描述中国的人工智能发展状况,并对其未来发展进行了预测。 Michael I. Jordan:我们并非处于AI大爆炸时代 在人工智能成为炙手可热的话题之后,前百度首席科学家吴恩达的导师、被誉为人工智能领域的“根目录”之一的Michael I. Jordan教授

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Sublime Text

Sublime Text

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

用户登录
用户注册