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

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

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

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

为什么还要烦恼呢?

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

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

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

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

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计数器进行装配:

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

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

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

4.3。 本地模式测试

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

4.4。 石墨“ diffRecorder”

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

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

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

  1. apache spark_Apache Spark:更改架构之前必须解决的5个陷阱

    apache spark 迁移到Apache Spark之前需要了解的5件事 似乎每个人都只是在谈论最热门的新技术,而忽略采用它的实际含义. 但这是自然的,对吧? 新功能和承诺胜过其他所有事物,而艰难 ...

  2. Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法

    Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法 参考文章: (1)Spark运行程序异常信息: o ...

  3. Apache Spark软件包,从XML到JSON

    Apache Spark社区为扩展Spark付出了很多努力. 最近,我们希望将XML数据集转换为更易于查询的内容. 我们主要对每天进行的数十亿笔交易之上的数据探索感兴趣. XML是一种众所周知的格式, ...

  4. spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable...

    import org.elasticsearch.cluster.routing.Murmur3HashFunction; import org.elasticsearch.common.math.M ...

  5. Apache Spark技术实战之6 -- spark-submit常见问题及其解决

    除本人同意外,严禁一切转载,徽沪一郎. 概要 编写了独立运行的Spark Application之后,需要将其提交到Spark Cluster中运行,一般会采用spark-submit来进行应用的提交 ...

  6. spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable

    出现"task not serializable"这个错误,一般是因为在map.filter等的参数使用了外部的变量,但是这个变量不能序列化.特别是当引用了某个类(经常是当前类)的 ...

  7. 解决Exception in thread “main“ org.apache.spark.SparkException: When running with master ‘yarn‘ either

    Exception in thread "main" org.apache.spark.SparkException: When running with master 'yarn ...

  8. Apache Spark 3.0 结构化Streaming流编程指南

    目录 总览 快速范例 Scala语言 Java语言 Python语言 R语言 程式设计模型 基本概念 处理事件时间和延迟数据 容错语义 使用数据集和数据帧的API 创建流数据框架和流数据集 流数据帧/ ...

  9. Apache Spark 3.0 预览版正式发布,多项重大功能发布

    今天早上 06:53(2019年11月08日 06:53) 数砖的 Xingbo Jiang 大佬给社区发了一封邮件,宣布 Apache Spark 3.0预览版正式发布,这个版本主要是为了对即将发布 ...

最新文章

  1. R语言将多张可视化结果图像保存到PDF中实战:多图保存到同一PDF页、将多个绘图保存到PDF格式的不同页面
  2. 一文看懂BCH减半时间计算及减半影响
  3. Android 实现简单的插件化模块化
  4. 15个学习习惯,受益一生(强烈推荐)
  5. android开启前台服务_如何在PC端一次性开启Tasker的所有权限和服务
  6. 女程序员怀孕7个月坚持上班敲代码
  7. Android模拟器启动3个g,android,模拟器_android 模拟器用3.18的内核无法启动,一直黑屏。,android,模拟器,内核 - phpStudy...
  8. 一只老猴子说的话,太经典了!
  9. 深入剖析Java类加载机制
  10. 第一天 渗透的基本概念
  11. 红米note3android驱动,红米Note3手机驱动
  12. 互联网广告的盈利模式
  13. ISIS与OSPF区别
  14. SWOT分析法——进行项目管理的高效方法
  15. 英语构词法软件wordformation发布全新1.0版本
  16. c++内存管理1:primitives
  17. python写情人节女朋友的EXCEL画像!
  18. 微信支付发放现金红包
  19. c语言打开文件保存文件格式,文件的打开与保存(C语言)
  20. brooks levitate_Brooks Levitate开箱测评 布鲁克斯Levitate实物赏析

热门文章

  1. spring boot连接数据库
  2. 使用枚举定义常量更好点儿
  3. 19级:班级日常分享 | 一天一瞬间
  4. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Dept实体类和对应的配置信息
  5. hibernate注解的测试
  6. 要么干,要么滚,千万别混
  7. git删除本地分支、删除远程分支 复制分支
  8. vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!
  9. python网络模块_Python的pyroute2网络模块-阿里云开发者社区
  10. 华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)