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,一经查实,立即删除!

相关文章

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

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

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

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

vaadin_Vaadin附加组件和Maven

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

Beta版本冲刺第二天

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

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

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

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

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

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

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

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

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

圣诞节,程序员应该给女朋友送一个线上圣诞树

前言:圣诞节虽然不是中国的传统节日,但当下很多时髦的年轻人却很喜欢过这个欢乐的节日,并乐于打造参与属于这个节日的仪式感。 除了所知的圣诞老人、圣诞树、互送礼物、吃大餐等传统习俗外,其实程序员能为今天的节日增加一些特别的环节。 圣诞树下载:https://download.csd…

maven 按业务拆分模块_Maven模块拆分方法

一个大项目经常要拆分成多个小模块分开打包,Maven是可以支持模块拆分的。可以包含(父模块即项目包含子模块),也可以并行(父模块和子模块是平级的)。推荐用包含方式,更清晰,更简单一些。首先建个空项目,只要个pom.xml&a…

用户注册,报修

一、需求分析 (1)还没有注册的客户,可以进入注册界面进行注册。 (2)新建一个报修表,名字为repair_info0,列有用户名、报修类型、报修地点、报修内容,报修日期和时间、用户报修次数。…

在HTML中使用css3实现雪人动画效果

背景:圣诞节又到了,拿什么来哄女朋友开心? 项目结构: html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xht…

圣诞节又到了,作为程序猿的我用代码给女朋友送了一个礼物

圣诞节又到了&#xff0c;拿什么来哄女朋友开心&#xff1f;我们先来做一个简单的雪人动画&#xff1a;项目结构&#xff1a;html:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d…

【Linux】权限篇(二)

权限目录 1. 前言2. 权限2.1 修改权限2.2 有无权限的对比2.3 另外一个修改权限的方法2.3.1 更改用户角色2.3.2 修改文件权限属性 3. 第一个属性列4. 目录权限5. 默认权限 1. 前言 在之前的一篇博客中分享了关于权限的一些知识&#xff0c;这次紧接上次的进行&#xff0c;有需要…

孙叫兽重磅推荐Chrome插件——CSDN浏览器助手

导读:解决你在浏览器上遇到的各种问题,无论你是学生小白、还是职场老鸟,都可以借助这个插件,打造个性化浏览器,提升工作学习效率。 此插件经过多轮迭代,体积小,内存占用少,便于开发者快速安装和使用。 官方地址:https://plugin.csdn.net/ 目录 安装方法:

【APICloud系列|21】使用APICloud敏捷式开发总结,回顾开发一个完整APP过程。

导读:APICloud是柚子(北京)科技有限公司创建的低代码开发平台,总部位于北京, 通过生产力工具与混合开发技术,为企业与开发者构建高效的IT环境;在APICloud平台已有80万注册用户,平台每日生成安装包超6000个。业务团队延伸至上海、深圳、重庆、青岛等10余个城市。 APICloud是…

数据湖 多维数据集_按汇总分组/多维数据集

数据湖 多维数据集时不时地&#xff0c;您会遇到一个使您达到SQL限制的要求。 我们中的许多人可能会早早放弃并使用Java / [或您的语言]计算内容。 相反&#xff0c;使用SQL可能是如此简单快捷。 如果您使用的是高级数据库&#xff0c;例如DB2 &#xff0c; Oracle &#xff0c…

FlexyPool如何同时支持连接代理和装饰器

代理人 FlexyPool监视连接池使用情况&#xff0c;因此需要拦截连接关闭方法调用。 为了简单起见&#xff0c;第一个版本为此目的依赖动态代理&#xff1a; private static class ConnectionInvocationHandler implements InvocationHandler {public static final String CLOS…

集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍...

1 创建集合视图&#xff0c;设置相关属性以满足要求 1.1 问题 集合视图控制器UIConllectionViewController是一个展示大量数据的控制器&#xff0c;系统默认管理着一个集合视图UICollectionView&#xff0c;功能几乎和UITableViewController差不多&#xff0c;能够以多行多列的…

【APICloud系列|24】 MNNavigationMenu模块(导航菜单)的实现

导读:MNNavigationMenu 是一个导航栏菜单,开发者可自定义其中的样式和按钮个数,超出屏幕部分可左右拖动查看。 模块详情:http://www.apicloud.com/mod_detail/12417 index.html <!doctype html> <html> <head><meta charset="utf-8">&…