Apache Spark:更改架构之前必须解决的5个陷阱

迁移到Apache Spark之前需要了解的5件事

似乎每个人都只是在谈论最热门的新技术,而忽略采用它的真正含义。 但这是自然的,对吧? 新功能和承诺胜过其他一切,而艰巨的挑战和决​​定被抛在一边。

这次不行。 软件架构很难,权衡取胜是游戏的名称。

在本文中,我们想退后一步,看看执行从头开始转向Spark的决定的真正含义。 非常感谢Kenshoo的开发人员和系统架构师Tzach Zohar ,他在本博文中与我们分享了他的经验。

为什么还要烦恼呢?

如果您从一个可以从分布式数据分析中受益的全新项目开始,无论是批处理分析还是精简分析,Spark都已将其优势确立为MapReduce的最佳实现。 主要是因为它使用内存处理的方式。 否则,如果您在一台服务器上获得了所需的吞吐量,并且使用的数据不会超出该范围,那么最好避免使用分布式的复杂性。 请注意,我们甚至一次都没有说过大数据。 哦 此外,Spark具有一个很棒且易于使用的机器学习库。
Spark与Hadoop

尽管您的起点很可能是您已经拥有的现有解决方案,但这会使事情变得多余。 我们将把重点放在那上面。 在难以应对规模的数据库之上从Hadoop或本地解决方案迁移。 性能的提高最终可以减少硬件成本,提高生产力,或者实际上只是摆脱尝试做的事情的唯一方法。

最大的好处来自批处理分析的角度,因此,如果这是您的用例–升级集群将变得更加紧迫。 就Kenshoo而言,单服务器MySQL解决方案已绰绰有余。 但是随着公司的发展和几年的过去,这已经不够了–每天要处理成千上万条记录,数百张表,较大记录上的十亿条记录以及TB级的数据。 不再是堪萨斯州了 。 有一点是,您无法进行所有优化,甚至TokuDB之类的高性能存储引擎也无法实现。 您最终要做的是在类固醇上安装了一个突变MySQL。

在海岸的另一端,有Spark公司,它解决了各种各样的问题,这些新问题却是长期存在的原则,并得到社区的Swift采用和许多积极的信号。

hdfs-cassandra-s3

1. HDFS与Cassandra与S3

您为Apache Spark选择的存储服务器应该反映出您对系统最看重的东西。 这里的3个常见选项是Hadoop的HDFS,Apache Cassandra和Amazon的S3。 当数据局部性不是关键时,S3适合非常特定的用例。 例如,每天运行一次的作业,或者实际上不需要任何数据和处理能力来共享机器的任何事情。 没有紧迫的工作。 至于HDFS与Cassandra的问题,运行HDFS的硬件成本较低,因为它旨在解决更简单的用例。 多低 高达10倍。 主要区别在于HDFS解决了分布式文件系统运行的问题,而Cassandra专门设计为高吞吐量键值存储。

尽管成本较高,但Cassandra在交互式流数据分析方面处于优势地位–与运行批处理作业相反。 您可以说HDFS喜欢大文件,而Cassandra不必加载所有数据,仅使用所需的数据即可访问

  • S3 –非紧急批处理作业。
  • Cassandra –非常适合流数据分析,并且对批处理作业有过高的要求。
  • HDFS –非常适合批处理作业,而不会影响数据局部性。

2.绿地与重构

好吧,所以您现在决定迁移到Spark,您应该从全新的项目开始还是基于当前应用程序进行重构? 每个人都有自己的警告,Kenshoo决定放弃绿地之路,以重构其当前系统。 该决定缩小为4个因素:

  1. 避免移动目标场景 –从头开始构建新系统需要花费时间和数月的开发时间。 在此期间,旧系统也在发生变化,因此您的规范实际上是随时间变化的移动目标。
  2. 零差异容限 –新系统应达到与旧系统相同的结果,对吗? 听起来很简单的过程是一个变相的问题。 经过多年的发展,针对特定分析过程的各种怪癖和定制已被硬编码到较旧的应用程序中。 例如,某些假设,四舍五入的结果以及来自各个客户的请求–已经创建了一个复杂的分析过程,很难从头开始重新创建。
  3. 代码是唯一的规范 –文档很有可能……不存在。 如果确实存在,则很可能不能反映系统的当前状态。 这是您可能与代码中的那些黑角有关的示例:

    “不应该”发生的事情,但是发生了吗?

    “不应该”发生的事情,但是它发生了吗?

  4. 测试重用 –您当前的测试与较早的实现结合在一起,并采用了不同的设置。 这里的另一个任务是重写它们以匹配新的实现。

底线:在这种情况下,重构而不是完全重新启动是最有意义的。

3.重构挑战

选择重构路径还面临挑战,未经测试的旧代码,与其他系统组件的紧密耦合以及新体系结构的范式转换。 从类似的Hadoop架构进行切换比在单节点应用程序上进入分布式系统路径更容易。 有许多新的知识要学习,要有调整的过程,还有很多摩擦。 不论是否新建,这都是艰巨的任务,但是如果您确定这是值得的–隧道尽头便是一盏灯。

在Kenshoo的案例中,他们的任务是从一个拥有8年历史的庞大系统中释放瓶颈聚合器组件。 聚合器偶尔对数据执行批处理,并通过不同的键将其分组。

底线:在移动之前预先了解您的薄弱环节,并确保针对新实施中的关键路径具有解决方案。

4.解决方法

4.1。 核心业务规则至上

重构的主要好处之一当然是代码重用。 构建新系统的第一步是首先遵循核心业务规则,并从中创建一个独立的jar。 这些方法被重构为Java静态方法,以避免Spark中的序列化问题。

4.2。 Dropwizard指标和复杂的遗留代码

继续前进,还记得“不应该发生”的例子吗? Kenshoo使用Dropwizard Metrics计数器进行装配:

Dropwizard指标

而且你知道什么。 它确实发生了很多:

发生…..“这不应该发生”

发生…..“这不应该发生”

底线:事实证明,使用度量标准来度量遗留代码中的未知数是一个功能强大的工具,它可以将“隐藏”功能转变为明确的,经过良好记录和经过良好测试的功能。

4.3。 本地模式测试

为了应对测试挑战,Kenshoo充分利用了Spark的本地模式并从中汲取了灵感–在新的聚合组件内部创建了一个类似Spark的嵌入式实例。 此外,他们然后采用了这个新组件,并将其嵌入到旧系统中,重用了较早的测试,并确保新系统满足所有要求:

嵌入式模式

4.4。 石墨“ diffRecorder”

除了本地模式测试之外,最后的领域是测试生产中的实际数据,并查看Spark结果是否与旧系统的结果匹配。 为此,实现了与Graphite可视化挂钩的“ diffRecorder”。 差异记录器将这两个版本有所不同的每个实际输入表示为Graphite Metric(石墨度量),并指出与新实现不一致的确切输入。

diffRecorderCode

生成的数据有助于了解需要进行哪些调整以匹配旧系统(或发现系统中的隐藏故障)。 顺便说一句,要了解有关Graphite的更多信息,可以查看有关为系统选择最佳Graphite体系结构的文章 。

Kenshoo的Graphite仪表板

Kenshoo的Graphite仪表板

5.火花监控

Spark与Graphite进行了很好的集成,您可以在其中绘制任何您想要的图形。 除此之外,这里的第二个工具是Spark Web UI,用于查看您的作业和性能指标。 任何严肃的Spark部署都需要在性能和监视方面投入大量精力。 这可能会成为一个非常棘手的问题,您需要熟悉内部结构才能调整系统。 为Spark编写代码很容易,但是性能又增加了另一层复杂性。 从这个意义上讲,很容易在这里出错并产生错误的代码。

查看这篇文章,我们探讨了Taboola的Spark监视架构 ,以及为什么他们要继续将Takipi添加到其监视堆栈中。

推荐的Spark入门资源

基本文档简短,直接,可以完成工作。 有关Spark性能调整的更高级的主题主要可以在以前的Spark峰会的录制演讲中找到。

结论

存储,重构技术,监视,测试重用和一致的结果–我们希望您发现所提供的解决方案有用,并且知道如何在需要时应用它们。 向新技术的过渡非常困难。 除了学习曲线外,它们还使您更容易出错(也使您更有可能在半夜接听电话以解决某些关键的生产问题)。 针对这种情况,我们启动了Takipi对Spark的错误分析 。

我们要再次感谢Kenshoo的Tzach Zohar与我们分享他的经验!

翻译自: https://www.javacodegeeks.com/2015/08/apache-spark-5-pitfalls-you-must-solve-before-changing-your-architecture.html

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

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

相关文章

git config配置文件

设置 git status的颜色。 git config --global color.status auto 一.Git已经在你的系统中了,你会做一些事情来客户化你的Git环境。你只需要做这些设置一次;即使你升级了,他们也会绑定到你的环境中。你也可以在任何时刻通过运行命令来重新更改…

双清模式无命令_linux性能监控:IO性能监控命令之iotop命令

内存监控命令之iotop命令1概述:iotop命令 是一个用来监视磁盘I/O使用状况的top类工具。iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况&#xff0…

【算法图解|2】JavaScript 如何实现数组扁平化

数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组。 举个例子,假设有个名为 flatten 的函数可以做到数组扁平化, var arr [1, [2, [3, 4]]]; console.log(flatten(arr)) // [1, 2, 3, 4] 我们最一开始…

质问微软 WP8.1开发HTTPS 真费劲

本人用C#多年,WPF2年,一直想做点应用为WP生态贡献一点力量,最近终于有机会接触了 家里的本子是2年前的低压I3,不支持虚拟化,一直没有真机.最近同事妈妈换下来一个820给我拿来做开发用,非常感谢!!! 作为C#开发,一直被其他语言看不起,我想你们中的很多人遇到这个问题的不在少数,但…

多生产者_通知:生产者补贴!打卡时间!定了

【生产者补贴!打卡时间定了!9月30日前!】老道说:这几天吉林和黑龙江陆续下发了2020年玉米、大豆生产者补贴实施工作方案!连日来关于生产者补贴方面的消息,也算是逐渐浮出水面!根据黑龙江地区的方…

vaadin_Vaadin附加组件和Maven

vaadin介绍 我喜欢Vaadin的 (其中很多)一件事是它对Vaadin框架的“附加组件”社区-他们称之为Vaadin目录 。 “附加组件”是社区对框架的附加组件,可以是任何东西,例如从新的客户端小部件到数据表的延迟加载容器。 我一定会为Acti…

【算法图解|3】JavaScript 如何实现数组去重

数组去重方法老生常谈,既然是常谈,我也来谈谈。 也许我们首先想到的是使用 indexOf 来循环判断一遍,但在这个方法之前,让我们先看看最原始的方法: var array [1, 1, 1, 1];function unique(array) {// res用来存储结…

angular 数字逗号分隔_angular 实现的输入框数字千分位及保留几位小数点功能示例...

摘要:这篇AngularJS栏目下的“angular 实现的输入框数字千分位及保留几位小数点功能示例”,介绍的技术点是“angular、保留几位小数、千分位、小数点、输入框、示例”,希望对大家开发技术学习和问题解决有帮助。本文实例讲述了angular 实现的…

单页应用程序的Spring Boot静态Web资源处理

诸如gulp和grunt之类的Javascript构建工具确实让我大吃一惊,我看着这些工具的构建脚本之一,发现很难理解它,无法想象从头开始编写其中一个构建脚本。 这就是yeoman出现的地方,它是一种非常方便的工具,它可以使用无数种…

Beta版本冲刺第二天

队伍CleanCode 031302505 黄晓辉031302223 翁瀚帅031302511 林培兴031302632 张衍坤031302536 苏丽玲一.完成的情况: 继续熟悉了github的使用,开始配置Tomcat服务器环境,增加了号码百事通的号码和游玩福州的一些资料,想要改进α版…

华字后面配什么字比较好_女孩叫华什么名字好听 华字和什么字搭配取名最好...

女孩叫华什么名字好听华鹭 华朦 华芮 华云 华徘 华葛 华馥华苹 华闵 华松 华娴 华红 华幽 华枫华双 华娉 华媚 华蝴 华胭 华瑷 华瑶华任 华智 华妮 华菀 华嫙 华笙 华楚华寐 华萱 华葵 华岱 华勤 华湘 华宜华咏 华欣 华娓 华穎 华兰 华汐 …

【算法图解|4】JavaScript 如何求数组的最大值和最小值

取出数组中的最大值或者最小值是开发中常见的需求 最原始的方法&#xff0c;莫过于循环遍历一遍&#xff1a; var arr [6, 4, 1, 8, 2, 11, 23];var result arr[0]; for (var i 1; i < arr.length; i) {result Math.max(result, arr[i]); } console.log(result); 通过…

elf 取路径_c – 获取主要可执行文件的ELF标题

由dlopen(0,RTLD_LAZY)返回的void *指针给出一个对应于主可执行文件的struct link_map *.调用dl_iterate_phdr也会在首次执行回调时返回主可执行文件的条目.你可能会被链接映射中的.l_addr 0这个事实所困惑,而使用dl_iterate_phdr的那个dlpi_addr 0.这正在发生,因为l_addr(和…

【算法图解|5】javaScript求两个数的最大公约数

思路&#xff1a;采用辗转相除的方法&#xff0c;用大的数去除以小的那个数&#xff0c;然后再用小的数去除以的得到的余数&#xff0c;一直这样递归下去&#xff0c; 直到余数为0时&#xff0c;最后的被除数就是两个数的最大公约数。 function getMaxCommonDivisor(a, b) {if …

多线程编程反模式_编程反模式

多线程编程反模式您是否曾经进行过代码审查&#xff0c;记录了非常高的WTF / m&#xff1f; 您是否想知道所有这些错误代码的原因是什么&#xff1f; 在大多数情况下&#xff0c;导致原因1的原因是使用设计和编码反模式。 如果您喜欢定义&#xff0c;请参见以下内容&#xff1…

JavaScript 如何求两个数的最小公倍数

1 .用辗转相除法求最大公约数 算法描述: m对n求余传给自己&#xff0c;再次求余, 若余数等于0 则 n 为最大公约数 2.最小公倍数 两个数的积 / 最大公约数 基本思想是采用将两个数相乘&#xff0c;然后除以它们的最大公约数 function getMinCommonMultiple(a, b){return a * b …

数据挖掘10大算法详细介绍

想初步了解下怎样数据挖掘&#xff0c;看到一篇不错的文章转载过来啦~ 转自:http://blog.jobbole.com/89037/ 在一份调查问卷中&#xff0c;三个独立专家小组投票选出的十大最有影响力的数据挖掘算法&#xff0c;今天我打算用简单的语言来解释一下。 一旦你知道了这些算法是什么…

孙叫兽带你了解腾讯位置服务的认证与接入,多种行业方案参考!

前言:腾讯位置服务为各类应用厂商和开发者提供领先的LBS服务和解决方案;有针对Web应用的JavaScript API, 适合手机端Native APP的各种SDK, WebService接口,适合小程序的插件和各类地图API等。 目录 接入指南 地图组件(H5) 地图javaScri

svn切换分支 如何判断 是否完成_SVN创建分支/合并分支/切换分支

在建立项目版本库时&#xff0c;可首先建好项目文件夹&#xff0c;并在其中建立trunk, branches, tags三个空的子目录。这样在trunk中开始进行开发trunk是主分支&#xff0c;是日常开发进行的地方。branches是分支。一些阶段性的release版本&#xff0c;这些版本是可以继续进行…

java文件读写操作类

借鉴了项目以前的文件写入功能&#xff0c;实现了对文件读写操作的封装 仅仅需要在读写方法传入路径即可&#xff08;可以是绝对或相对路径&#xff09; 以后使用时&#xff0c;可以在此基础上改进&#xff0c;比如&#xff1a; 写操作&#xff1a; 1&#xff0c;对java GUI中文…