探索BI系统搭建的必要性与AI技术的应用潜力
495
2022-05-29
什么是Apache Spark
原文:https://medium.com/@ashish1512/what-is-apache-spark-e41700980615
大多数人都会听说过Apache Spark和世界各地使用的其他大数据技术(Hadoop,Hive,Cassandra)。但是什么是Spark让它在现场爆炸?
资料来源:EasyLearning
在其网站上,Apache Spark被解释为“用于大规模数据处理的快速通用引擎”。但这甚至没有开始说明它在大数据领域成为如此重要的参与者的原因。大数据公司的采用率一直在以惊人的速度增长。了解Spark崛起背后的原因有助于预测即将推出的大数据解决方案的发展轨迹。
是一种用于实时处理的快速通用集群计算系统。它于2009年在加州大学伯克利分校的AMPLab开发,后来由Apache捐赠并开源。它拥有蓬勃发展的开源社区,是目前最活跃的Apache项目。
开发人员提出的一个常见问题是,Spark是否只是另一种与Hadoop竞争的技术(旨在取代Hadoop),或者他们是否能够保留现有代码库并在其上使用Spark来利用它的功能。
嗯,是的,不。它是在考虑Hadoop的基础上构建的。它是Hadoop MapReduce的潜在替代品,但它也扩展了MapReduce模型,以便与YARN和HDFS一起使用。Spark可以在HDFS之上运行,以利用分布式复制存储。
大数据技术堆栈
速度:内存处理
随着信息的大量增长,计算效率对于帮助解决高时间和空间复杂性变得非常关键。Spark能够一次处理数PB的数据,分布在数千个物理或虚拟服务器的集群中。它通过内存处理实现这一点,这使得它能够以闪电般的速度提供实时分析(比Hadoop快100倍)。
支持:开发人员友好的API
Spark提供了许多比MapReduce提供的更高抽象级别的指令。它不仅支持Java,还支持Python和Scala,它是一种较新的语言,包含一些用于处理数据的有吸引力的属性。它具有开发人员友好的API,并且通常与Hadoop的数据存储模块 - HDFS一起使用 - 但它可以与其他流行的数据存储子系统(如HBase,Cassandra,MongoDB和Amazon的S3)同样良好地集成。
简单:懒惰评估
Apache Spark延迟评估,直到绝对必要。这是促进其速度的关键因素之一。它听你要求它做什么,写下一些速记,所以它不会忘记,然后绝对没有。它会继续无所作为,直到你问它最后的答案。对于转换,Spark将它们添加到计算的DAG(有向无环图)中,并且仅当驱动程序请求某些数据时,才会实际执行此DAG。
Apache Spark的核心是弹性分布式数据集(RDD)的概念。它是一种编程抽象,表示可以在计算集群中拆分的不可变对象集合。这就是Spark如何轻松实现快速,可扩展的并行处理。
Spark Core主要包含以下4个库。
Spark核心组件
Spark SQL对Apache Spark项目变得越来越重要。它是当今开发人员在创建应用程序时最常用的界面。Spark SQL专注于结构化数据的处理,使用从R和Python(在Pandas中)借用的数据帧方法。
从数据框中选择一些列就像这一行一样简单:
将数据帧注册为临时表后,我们可以使用SQL来查询它。
如今,我们看到的大多数数据都是从各种来源的“流”中生成的。虽然将这些数据流存储在磁盘上并在以后批量分析它们当然是可行的,但有时在数据实时到达时处理和处理数据是明智或重要的。
早些时候,Hadoop中的流处理必须以繁琐的方式完成。开发人员将使用MapReduce进行批处理,然后必须使用Apache Storm进行实时处理。这导致了现在的问题,开发人员必须管理在不同框架上运行的代码库,并且需要彼此保持同步。
Spark通过将流分解为一系列连续的微批次,将批量处理的概念引入流式传输,然后可以使用Apache Spark API进行操作。这减少了开销,因为现在批处理和流操作共享大部分代码并在同一框架上运行。
资料来源:Datanami
Spark MLLib包含一个框架,用于直接从任何数据集的预处理,特征提取,选择和转换创建机器学习模型。Spark能够将数据存储在内存中并快速运行重复查询,这使其成为培训机器学习算法和缩短培训时间的理想选择。模型可以由Apache Spark中的数据科学家使用R或Python进行训练,使用MLLib保存,然后导入基于Java或基于Scala的管道。
该库包括用于处理图结构的各种分布式算法。这些算法使用Spark Core的RDD方法来建模数据; 在GraphFrames包可以让你做dataframes图操作,包括图形查询取催化剂优化的优势。
Databricks(由Apache Spark的创建者创建的公司)列出了Spark的以下用例:
数据集成和ETL
高性能批量计算
机器学习分析
实时流处理
这些应用程序根本不是新的。但是他们在Spark上要快得多。
谢谢阅读!
如果您有兴趣,请查看我的文章如何开始使用Apache Spark!
原文:https://towardsdatascience.com/apache-spark-101-3f961c89b8c5
Apache Spark的n00bs指南
我编写本指南是为了帮助我自己理解Spark的基本底层功能,它适用于Hadoop生态系统以及它如何在Java和Scala中工作。我希望它对你有所帮助。
什么是Spark?
Spark是内存框架中的通用计算引擎。它允许您以各种语言的脚本方式执行实时和批处理工作,具有强大的容错能力。你为什么要关心Spark是什么?说白了,它解决了Hadoop MapReduce的许多缺点,比Hadoop MapReduce大约快10到100倍。Spark在数据科学方面是一个大问题; 一些使用Spark的着名组织是; 亚马逊,NASA喷气推进实验室,IBM和日立。本文的目的是让您快速了解Spark提供的功能,基本的内部工作以及让您了解Spark的精彩程度。
大数据环境中的Sparks上下文
Spark旨在与外部集群管理器或其自己的独立管理器一起使用。Spark还依赖于分布式存储系统来运行,它可以从中调用它要使用的数据。支持以下系统:
Spark Standalone Manager
Hadoop YARN
Apache Mesos
Hadoop分布式文件系统(HDFS)
MapR文件系统(MapR-FS)
卡桑德拉
OpenStack Swift
亚马逊S3
库杜
出于安全考虑,我将只关注Hadoop生态系统中的Spark。
Spark Core提供了一个平台,解决了Hadoop MapReduce的许多缺点,因为它允许我们从必须将任务分解为小型原子作业,以及不得不在分布式系统开发中构建解决方案的复杂性。
赛门铁克注意:术语 Hadoop可互换使用,指 Hadoop生态系统或 Hadoop MapReduce或 Hadoop HDFS。在线阅读“Spark取代Hadoop”或“Spark是新的Hadoop”,然后倾向于相信他们意味着Spark正在取代所有Hadoop服务,这是很常见的但是!他们真正的意思是Spark在许多用例中扮演Hadoop MapReduce功能的角色。
Spark Core功能多样,专为Hadoop生态系统而设计; 它可以与MapReduce一起工作,或者为PIG,HIVE和SEARCH提供备用平台。见图1
Spark Streaming:管理来自各种来源的数据的实时微博。它允许通过在实时流上实现ML Lib和Graphx来计算实时结果。
GraphX:一个非常强大的库来处理图并行计算。不要将此与“Power Point图”混淆,这个库是关于数学中的一个领域,称为图论和建模对象之间的成对关系。
ML Lib:用于在本机分布式环境中对大型数据集运行机器学习算法的库。与在Python或Matlab中找到的更强大的机器学习库相比,该库仍处于起步阶段。
Spark SQL:允许使用SQL采石场来采集非关系分布式数据库。
Spark Steaming,GraphX,MLLib和Spark SQL都会在适当的时候收到他们自己的文章,但与此同时请不要犹豫查找官方文档[1] [2] [3] [4]。
是什么让Spark,Spark?
在最高级别的抽象中,Spark包含三个组件,使其成为唯一的Spark; Driver,Executer和DAG。
司机和执行者
Spark使用主从架构。驱动程序协调许多分布式工作程序,以便以分布式方式执行任务,同时资源管理器处理资源分配以完成任务。
把它想象成“Orchestrator”。驱动程序是主方法运行的地方。它将程序转换为任务,然后将任务计划到执行程序。司机可以使用3种不同的方式与执行者沟通; Broadcast,Take,DAG - 这些将在短期内详细阐述。
执行程序在JVM实例中从驱动程序执行委派任务。执行程序在Spark应用程序的开头启动,通常在应用程序的整个生命周期内运行。此方法允许数据在内存中持久存在,而不同的任务在整个应用程序的生命周期中加载进出执行。
驱动程序可以与执行程序通信的方法有多种。作为开发人员或数据科学家,了解不同类型的通信及其用例非常重要。
广播操作:驱动程序将必要的数据传输给每个执行程序。对于数百万条记录,+ - 1gb数据的数据集,此操作是最佳的。此操作可能会成为一项非常昂贵的任务。
采取行动:驱动程序从所有执行程序获取数据。此操作可能是非常昂贵且危险的操作,因为驱动程序可能会耗尽内存并且网络可能会变得不堪重负。
DAG行动:这是三者中最便宜的行动。它将控制流逻辑从驱动程序传输到执行程序。
Spark比Hadoop MapReduce具有相当大的性能提升,但它在内存中运行时也具有更高的运营成本,并且需要高带宽网络环境(建议+ 10Gb / s)。建议Spark群集中的内存应至少与您需要处理的数据量一样大。如果没有足够的内存用于作业,Spark有几种方法可以将数据溢出到磁盘上。有关硬件要求和建议的更多信息。
发展议程集团
DAG是一个有向无环图,概述了从A点到B点所需的一系列步骤。与大多数其他计算引擎一样,Hadoop MapReduce独立于DAG工作。这些DAG独立计算引擎依赖于诸如HIVE或PIG之类的脚本平台来将作业链接在一起以实现期望的结果。让Spark在比较中如此强大的原因在于它是DAG的认知并积极管理DAG。这允许Spark优化作业流以获得最佳性能,并允许回滚和作业冗余功能。
请看图3.我将通过讨论其组件来详细说明DAG及其运行方式。
源可以是Spark支持的任何数据源。其中一些是:HDFS,关系数据库,CSV文件等。稍后您将看到我们在环境上下文设置中定义它。
弹性分布式数据集本质上是无法更改的数据集。这些实体存在于内存中,并且它们本质上是不可变的。由于这种不变性; 在对现有RDD执行的每个转换之后创建新的RDD。这种设计的结果是冗余; 如果在DAG执行中的任何时刻出现故障,则可以回滚到正常运行状态并重新尝试失败的操作/转换。
原始形式的RDD没有附加到它们的模式,但可以使用称为DataFrames的东西进行扩展。DataFrames为其中包含的数据集添加模式功能; 这在处理关系数据集时非常有用。
转换将RDD转换为另一个RDD。一些示例转换是:
地图
reduceByKey
GroupByKey
JoinByKey
SparkSQL
操作是检索数据以回答问题的任何操作。一些例子是; 数数,拿,每个。
执行DAG
Spark做了一个叫懒惰评估的事情。DAG本身是由转换构造的,但在调用Action之前没有任何反应。执行操作时,Spark将查看DAG,然后在需要执行的作业的上下文中对其进行优化,以达到要求执行的操作步骤。最终执行DAG时,驱动程序会将转换命令发送给集群上的执行程序。
APACHE FLUME API
Apache Flume的开发理念是允许开发人员使用与非分布式编程相同的代码创建可在分布式系统上运行的程序。换句话说,Apache Flume允许我们编写可以在单个线程和多个线程机器上运行而没有问题的代码。Apache Flume的含义是我们现在可以在本地计算机上运行代码并对其进行调试,同时确保它可以在我们的Spark Hadoop集群上运行。进一步的影响是,您可以从群集中提取数据并在本地计算机上运行它以进行测试和开发。
支持以下语言:
斯卡拉
Java的
蟒蛇
[R
为了演示Spark的一些内部工作原理,我将在ScalaFlume和JavaFlume中运行一个字数计算示例。
第1行到第2行初始化我们的Spark Context并定义我们的源代码。在第3行中,我们定义了初始RDD。在第4到第6行中,我们定义了RDD的转换并定义了一些新的RDDS。注意第7行,没有执行任何代码; 只有我们的DAG已经建成。在第7行,我们最终有一个动作然后执行转换。重要的是要注意,在集群中分配的唯一工作是蓝色的,因为那些lambda表达式是由执行者运行的转换!其他所有内容都在驱动程序上执行。
斯卡拉宣传方注:Scala是一种构建在JVM编译器之上的令人惊叹的语言。它为具有OOP背景的开发人员提供了一个环境,可以轻松实现最适合分布式计算编程的函数式编程思维模式。Scala通过同时为OO和函数式编程范例提供支持来实现这一点。你为什么要关心?Spark是使用Scala构建的,因此Spark中的最新功能将始终首先在Scala中实现。在处理大型数据集时,Scala与其他语言相比也提供了最佳性能 - 例如:根据用例,Scala比Python大约快10到225倍。Scala也被数据科学和分布式计算领域的一些知名人士,亚马逊和谷歌等人使用。
以蓝色突出显示的代码是转换并构建DAG。更重要的是,请注意,基本上每个转换都是一个对象,然后发送给所有分布式执行程序。这也发生在Scala示例中,但lambda表达式隐藏了您的这一层交互。转换对象不会由集群中的执行程序执行,直到驱动程序执行第27行中的操作代码(以红色突出显示)。
结论
总之,我希望本文能帮助您掌握使Spark成为数据科学和数据工程的有趣且强大的平台的基础知识。
本文的内容应该是:
Spark Core与Hadoop MapReduce并行或取代。
与其他计算引擎相比,Spark更快!火花的速度来自于DAG的认知并可以优化它; 它通过保持JVM状态为整个作业保持数据在内存中的最终目标是最小化I / O到磁盘。
Spark拥有一些用于机器学习,图形理论,数据流和SQL的优秀数据科学和数据工程API。
Spark中认知的主要组件是驱动程序和执行程序。这两个组件通过称为DAG的东西运行,由Spark直接管理。有一种称为转换的东西,它构建DAG并从现有RDD生成新的RDD。RDD是一个不可变的数据实体,提供; 借助DAG实现冗余和回滚功能。只有在执行了一个动作后才会执行DAG。
Apache Flume允许您在本地计算机上使用一些完善的编程语言编写程序,以进行开发和调试。然后,可以在不需要更改的分布式系统中部署相同的Apache Flume代码。Scala太棒了。
参考书目
针对Java和Scala开发人员的Apache Spark简介 - Ted Malaska(Cloudera)
什么是Apache Spark?
官方文件
原文:https://www.toptal.com/spark/introduction-to-apache-spark
使用示例和用例介绍Apache Spark
我在2013年末第一次听说Spark,当时我开始对Scala这种语言感兴趣。一段时间后,我做了一个有趣的数据科学项目,试图预测泰坦尼克号的生存。这被证明是进一步介绍Spark概念和编程的好方法。我强烈建议任何有抱负的Spark开发人员寻找一个开始的地方。
今天,Spark被亚马逊,eBay和雅虎等主要厂商采用。许多组织在具有数千个节点的集群上运行Spark。根据Spark FAQ,已知最大的集群有超过8000个节点。确实,Spark是值得注意和学习的技术。
本文介绍Spark,包括用例和示例。它包含来自Apache Spark网站的信息以及Learning Spark - Lightning-Fast Big Data Analysis一书。
什么是Apache Spark?一个介绍
Spark是一个宣传为“闪电般快速集群计算”的Apache项目。它拥有蓬勃发展的开源社区,是目前最活跃的Apache项目。
Spark提供了更快,更通用的数据处理平台。与Hadoop相比,Spark使您可以在内存中运行速度提高100倍,在磁盘上运行速度提高10倍。去年,Spark通过完成100 TB TB Daytona GraySort比赛,以十分之一的速度完成了Hadoop,并且成为了分类PB级的最快的开源引擎。
Spark还可以更快地编写代码,因为您可以使用80多个高级操作员。为了演示这一点,让我们看一下BigData的“Hello World!”:Word Count示例。用Java编写的MapReduce有大约50行代码,而在Spark(和Scala)中你可以像这样简单地执行:
sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")
学习如何使用Apache Spark的另一个重要方面是交互式shell(REPL),它提供了开箱即用的功能。使用REPL,可以测试每行代码的结果,而无需首先编写代码并执行整个作业。因此,工作代码的路径要短得多,并且可以进行临时数据分析。
Spark的其他主要功能包括:
目前提供Scala,Java和Python API,并在途中支持其他语言(如R)
与Hadoop生态系统和数据源(HDFS,Amazon S3,Hive,HBase,Cassandra等)完美集成
可以在由Hadoop YARN或Apache Mesos管理的集群上运行,也可以独立运行
Spark核心由一组功能强大的高级库补充,可以在同一个应用程序中无缝使用。这些库目前包括SparkSQL,Spark Streaming,MLlib(用于机器学习)和GraphX,本文将进一步详细介绍每个库。目前正在开发其他Spark库和扩展。
Spark Core
Spark Core是大规模并行和分布式数据处理的基础引擎。它负责:
内存管理和故障恢复
在集群上调度,分发和监视作业
与存储系统交互
Spark引入了RDD(弹性分布式数据集)的概念,这是一种不可变的容错,分布式对象集合,可以并行操作。RDD可以包含任何类型的对象,并通过加载外部数据集或从驱动程序分发集合来创建。
RDD支持两种类型的操作:
转换是在RDD上执行并产生包含结果的新RDD的操作(例如map,filter,join,union等)。
操作是在RDD上运行计算后返回值的操作(例如reduce,count,first等)。
Spark中的转换是“懒惰的”,这意味着它们不会立即计算结果。相反,它们只是“记住”要执行的操作以及要对其执行操作的数据集(例如,文件)。只有在调用操作并将结果返回给驱动程序时,才会实际计算转换。这种设计使Spark能够更有效地运行。例如,如果一个大文件以各种方式转换并传递给第一个动作,Spark只会处理并返回第一行的结果,而不是为整个文件执行工作。
默认情况下,每次对其执行操作时,都可以重新计算每个转换后的RDD。但是,您也可以使用persist或cache方法在内存中保留RDD,在这种情况下,Spark会在群集上保留元素,以便在下次查询时更快地访问。
SparkSQL
SparkSQL是一个Spark组件,支持通过SQL或Hive查询语言查询数据。它起源于运行在Spark(代替MapReduce)之上的Apache Hive端口,现在与Spark堆栈集成。除了为各种数据源提供支持外,还可以使用代码转换编写SQL查询,从而生成一个非常强大的工具。下面是Hive兼容查询的示例:
// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")// Queries are expressed in HiveQLsqlContext.sql("FROM src SELECT key, value").collect().foreach(println)
Spark Streaming
Spark Streaming支持实时处理流数据,例如生产Web服务器日志文件(例如Apache Flume和HDFS / S3),Twitter等社交媒体以及Kafka等各种消息队列。在引擎盖下,Spark Streaming接收输入数据流并将数据分成批次。接下来,它们由Spark引擎处理并分批生成最终结果流,如下所示。
Spark Streaming API与Spark Core的API紧密匹配,使程序员可以轻松地在批处理和流数据的世界中工作。
MLlib
MLlib是一个机器学习库,提供各种算法,旨在扩展到集群上进行分类,回归,聚类,协同过滤等等(查看Toptal关于机器学习的文章,了解有关该主题的更多信息)。其中一些算法也适用于流数据,例如使用普通最小二乘法或k均值聚类的线性回归(以及更多的方法)。Apache Mahout(Hadoop的机器学习库)已经脱离了MapReduce,并加入了Spark MLlib。
GraphX
GraphX是一个用于操作图形和执行图形并行操作的库。它为ETL,探索性分析和迭代图计算提供了统一的工具。除了图形操作的内置操作外,它还提供了一个常用图算法库,如PageRank。
如何使用Apache Spark:事件检测用例
现在我们已经回答了“什么是Apache Spark?”的问题,让我们想一想最有效地使用哪些问题或挑战。
我最近发现了一篇关于通过分析Twitter流来检测地震的实验。有趣的是,据证明,这种技术很可能比日本气象厅更快地通知你日本的地震。即使他们在文章中使用了不同的技术,我认为这是一个很好的例子,看看我们如何将Spark用于简化的代码片段并且没有胶水代码。
首先,我们必须过滤看似相关的推文,如“地震”或“摇晃”。我们可以很容易地将Spark Streaming用于此目的,如下所示:
TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))
// We would prepare some earthquake tweet data and load it in LIBSVM format.val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt")// Split data into training (60%) and test (40%).val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)val training = splits(0).cache()val test = splits(1)// Run training algorithm to build the modelval numIterations = 100val model = SVMWithSGD.train(training, numIterations)// Clear the default threshold.model.clearThreshold()// Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label)}// Get evaluation metrics.val metrics = new BinaryClassificationMetrics(scoreAndLabels)val auROC = metrics.areaUnderROC()println("Area under ROC = " + auROC)
如果我们对模型的预测率感到满意,我们可以进入下一阶段并在发现地震时做出反应。为了检测一个,我们在定义的时间窗口中需要一定数量(即密度)的正推文(如文章中所述)。请注意,对于启用了Twitter位置服务的推文,我们还会提取地震的位置。有了这些知识,我们可以使用SparkSQL并查询现有的Hive表(存储有兴趣接收地震通知的用户)来检索他们的电子邮件地址并向他们发送个性化的警告电子邮件,如下所示:
// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)// sendEmail is a custom functionsqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)
其他Apache Spark用例
Spark的潜在用例当然远远超出了地震的检测范围。
这是一个快速(但肯定无法详尽!)的其他用例的抽样,需要处理大数据的速度,种类和数量,Spark非常适合:
在游戏行业中,处理和发现实时游戏内事件的潜在消息并能够立即响应它们的模式是一种可以产生利润丰厚的业务的能力,用于诸如玩家保留,目标广告,汽车等目的 - 复杂程度的调整,等等。
在电子商务行业中,实时交易信息可以传递给流式聚类算法,如k-means或协同过滤,如ALS。结果甚至可以与其他非结构化数据源(例如客户评论或产品评论)结合使用,并用于随着时间的推移不断改进和调整建议的新趋势。
在金融或安全行业中,Spark堆栈可以应用于欺诈或入侵检测系统或基于风险的身份验证。通过收集大量存档日志,将其与外部数据源(如有关数据泄露和受损帐户的信息(例如,请参阅https://haveibeenpwned.com/)和来自连接的信息/)相结合,可以获得一流的结果。IP地理定位或时间等请求。
结论
总而言之,Spark有助于简化处理大量实时或归档数据(包括结构化和非结构化)的挑战性和计算密集型任务,无缝集成相关的复杂功能,如机器学习和图形算法。Spark为大众带来了大数据处理。看看这个!
原文:https://medium.com/plumbersofdatascience/apache-spark-101-971aaf5d4334
Apache Spark 101
Apache Spark™是用于大规模数据处理的统一分析引擎。它最初于2009年在加州大学伯克利分校的AMPLab中开发,并于2010年作为Apache项目开源。它是用Scala编写的,但API可用于Scala,Python,Java和R.您还可以在Spark SQL中像Hive查询一样运行SQL。我将使用Spark 2.4和Scala进行此介绍。现在Spark拥有超过1300名贡献者和非常好的社区支持。
Spark的历史:加州大学伯克利分校的团队正在构建Mesos,这是一个集群管理框架,他们希望展示在Mesos中从头开始构建框架是多么容易。这就是Spark诞生的方式!关于Spark的起源故事,在这部关于Ion Stoica的Oreilly 播客中有更多细节。
为何选择Spark?
它是针对不同种类的大数据问题的一站式解决方案,是批量,实时(几乎),机器学习,深度学习和图形的统一平台。
您可以使用Yarn或Kubernetes或Mesos在现有Hadoop集群上运行spark。
适合所有人,Digaset适用于Scala粉丝,Spark SQL适用于过去10年在Oracle工作过的人,Teradata(遗留系统),数据框架python pandas粉丝。
显然,速度是由众多基准,图表和所有好东西支持的。
建筑
Spark有Master和Slave架构,我更喜欢称它为Master-Worker架构(不是奴隶这个词的忠实粉丝)。Master是托管驱动程序的实例,Worker是托管执行程序的实例。这些可以托管在同一节点(在您的Mac上)或不同的节点(具有多个EC2实例的EMR集群)上。基本上,有一个驱动程序,一个worker,一个执行程序和Cluster Manager。
驱动程序:Spark上下文对象主程序是驱动程序。它是一个JVM进程,负责执行任务。
Worker:Worker是执行程序在集群中执行用户编写的应用程序代码的实例。
集群管理器:它负责在spark应用程序中分配资源。除了Spark的独立集群管理器之外,Spark上下文还能够连接到几种类型的集群管理器,如Mesos,Yarn或Kubernetes。
执行程序:它是为工作节点上的应用程序启动的JVM进程,它运行任务并将数据保存在内存或磁盘存储中。每个应用程序都有自己的执行程序。
PS:一些假设:你熟悉Scala和Sbt。
首先是在你的build.sbt。中添加Spark依赖项。
name := "spark-examples"
version := "0.1"
scalaVersion := "2.12.8"
val sparkVersion = "2.4.0"
resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven"libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % sparkVersion,
"org.apache.spark" %% "spark-sql" % sparkVersion,
"org.apache.spark" %% "spark-sql-kafka-0-10" % sparkVersion,
"org.postgresql" % "postgresql" % "42.2.5",
// "com.holdenkarau" %% "spark-testing-base" % "2.2.0_0.8.0" % "test"
//tests
"MrPowers" % "spark-fast-tests" % "0.17.1-s_2.12"
)
您可以通过创建Spark Context开始,
import org.apache.spark.sql.SparkSession
object Runner {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.appName("SparkSessionExample")
.master("local[4]") // To runn locally; use 4 cores
.config("spark.sql.warehouse.dir", "target/spark-warehouse")
.getOrCreate
}
}
Spark API
Apache Spark中有3个主要抽象:
1)RDD:这是Spark中最基本的数据抽象,是弹性分布式数据集的缩写。它是一个容错的容错集合,可以并行操作.RDD是一个不可变的分布式数据元素集合,在集群中的节点之间进行分区,可以与提供转换的低级API并行运行和行动。创建RDD有两种方法,可以通过并行化驱动程序中的现有集合,也可以通过从外部存储系统读取数据,例如共享文件系统,HDFS,HBase或任何提供Hadoop InputFormat的数据源。
要创建RDD,
val sc = spark.sparkContext
val myRdd:RDD [(String,Int)] = sc.parallelize(
Seq(
(“Jon”,1),
(“Tyrion”,2),
(“Bronn”,3)
)
)
SparkContext是一个Scala实现入口点。SparkContext表示与Spark群集的连接,可用于在该群集上创建RDD,累加器和广播变量。
注意:RDD现在更像是一个低级代码,因为spark已经演变为更高的抽象,从而提供更好的性能。如果我们必须以牺牲一些优化和性能优势为代价来处理非结构化数据,那么它仍然是一个不错的选择。
2)Dataframe:它是组织成命名列的分布式数据集合。它在概念上等同于关系数据库或数据框架中的表,但引擎盖下的内容更多。DataFrame允许开发人员将结构强加到分布式数据集合上,从而允许更高级别的抽象。从2.0开始,Dataframe API与Dataset合并。现在,DataFrame是一个组织成命名列的数据集。
type DataFrame = Dataset[Row]
可以从RDD创建数据帧。
val
注意:import spark.implicits._使用$stringto a column类型将常见Scala对象转换为Dataset所需的导入。
可以从各种数据源读取数据帧,例如csv,jdbc,json,parquet,s3等等。
spark.read.csv("users.txt")
可以推断出数据帧的模式:
dfWithColumnNames.printSchema() root | — name: string (nullable = true) | — id: integer (nullable = false)
此外,可以执行SQL查询:
df.createOrReplaceTempView("people") dfWithColumnNames.createOrReplaceTempView("got") val sqlDF = spark.sql("SELECT * FROM got where name = 'Jon' ") sqlDF.show() +----+---+ |name| id| +----+---+ | Jon| 1| +----+---+
除了方便的DSL之外,还有许多隐藏的好东西,例如Catalyst优化器,基于成本的优化器,用于火花和模式推理。
Dataframes还尝试解决许多性能问题,这些问题与非jvm语言(如python和R)有关。从历史上看,在python中使用RDD比在Scala中慢得多。使用Dataframes,编写所有语言的代码执行相同但有一些例外。
3)数据集: 它是强类型特定于域的对象的集合,可以使用函数或关系运算并行转换。为 每个转换创建并更新逻辑计划,并在 调用操作时将最终逻辑计划转换为物理计划。Spark的催化剂
优化器优化了逻辑计划,并 以并行和分布式方式生成有效执行的物理计划。此外,还有编码器生成优化的,更低内存占用的二进制结构。编码器知道记录的模式。这就是它们如何提供明显更快的
序列化和反序列化(与默认的Java或Kryo序列化器相比)。
case class Characters(name: String, id: Int)//Note this class should be outside your main object.
数据集的主要优点是类型安全。使用数据集时,我们可以确保在编译期间捕获语法错误和分析错误。与Dataframes相比,在编译期间可以捕获语法错误,但只有在运行它时才会捕获诸如引用不存在的列名之类的Analysis错误。运行时间可能非常昂贵,而且作为开发人员,让编译器和IDE为您完成这些工作会很不错。
数据集建立在spark SQL引擎上,它使用Catalyst生成优化的逻辑和物理查询计划,是一个很好的权衡数据帧和RDD。它具有Dataframes的性能和灵活性RDD,可以执行更精细的粒度操作,例如lambda操作,这是SQL方法无法实现的。数据集为我们提供了两全其美的优势。
此外,还有一个名为Tungsten的Spark 中令人兴奋的功能,它可以理解数据集类型的JVM对象,并使用编码器将特定于类型的JVM对象映射到Tungsten的内部存储器表示。基本上,钨以更有效的方式将数据存储在Java堆中,因为Spark有更多关于正在存储的数据的信息,并尝试创建缓存感知计算,并且还在运行时生成动态代码。有很多基准来支持这些性能增强,并且随着Spark接近3.0,它会变得更好。许多这些新功能在2.0中引入,许多功能都标记为实验性的。但尽管如此,这是一个了解更多Spark的激动人心的时刻。
https://zookeeper.apache.org/
https://github.com/antirez/redis
https://stackoverflow.com/questions/37293928/zookeeper-vs-in-memory-data-grid-vs-redis
https://zookeeper.apache.org/doc/current/zookeeperOver.html
多实例模式vs多租户模式
https://blog.csdn.net/nimeijian/article/details/49614853
多租户模式
SaaS现在已成为一股潮流,它将颠覆传统的软件交付方式
其实从架构层面来分析,SaaS区别于传统技术的重要差别就是Multi-Tenant模式。多租户就是说多个租户共用一个实例,租户的数据既有隔离又有共享,说到底就是如何解决数据存储的问题。
现在SaaS Multi-Tenant在数据存储上存在三种主要的方案,分别是—
方案一:独立数据库
这是第一种方案,即一个Tenant一个Database(见图3-14),这种方案的用户数据隔离级别最高,安全性最好,但成本也高。
优点:
为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复数据比较简单。
缺点:
增大了数据库的安装数量,随之带来维护成本和购置成本的增加。
这种方案与传统的一个客户、一套数据、一套部署类似,差别只在于软件统一部署在运营商那里。如果面对的是银行、医院等需要非常高数据隔离级别的租户,可以选择这种模式,提高租用的定价。如果定价较低,产品走低价路线,这种方案一般对运营商来说是无法承受的。
方案二:共享数据库,隔离数据架构.即多个或所有租户共享Database,但一个Tenant一个Schema。
优点:
为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可以支持更多的租户数量。
缺点:
如果出现故障,数据恢复比较困难,因为恢复数据库将牵扯到其他租户的数据;如果需要跨租户统计数据,存在一定困难。
方案三:共享数据库,共享数据架构.即租户共享同一个Database、同一个Schema,但在表中通过TenantID区分租户的数据。这是共享程度最高、隔离级别最低的模式。
优点:
三种方案比较,第三种方案的维护和购置成本最低,允许每个数据库支持的租户数量最多。
缺点:
隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。如果希望以最少的服务器为最多的租户提供服务,并且租户接受以牺牲隔离级别换取降低成本,这种方案最适合。
CRM系统未来将以中低端市场为主,所以采用第三种方案,只要做好数据隔离比较好了。千万不可掉以轻心,SaaS下的安全性设计很重要。一般常见的安全性设计分为两类:系统级和程序级。
系统级:
使用HTTPS协议以SSL(Security Socket Layer)交换数据,增强通信安全;通过数字签名防止传输过程篡改;对用户身份识别的UserToken使用DES算法数据加密;业务数据定时自动备份。
程序级:
完整的权限配置,包括功能权限和数据权限;客户端输入校验,防止JS攻击、XSS攻击、SQL注入等;辅助安全设计,比如密码控件、图片验证码、手机确认码等。
Hadoop集群
YARN是Hadoop集群的默认资源管理器和任务调度器
Terraform
Terraform是一个批量管理资源的工具,可以十分方便地对资源进行增删改查等操作。如果两个资源之间存在依赖关系,比如VPC和ECS,这种情况下我们可以使用outputs.tf文件,将创建的VPC和subnet信息通过outputs.tf文件传给ECS。
MPP(Massive Parallel Processing)架构,支持行存储和列存储,提供PB(Petabyte,2的50次方字节)级别数据量的处理能力。
DLF包含三种业务:DLF、DI、DG。
DLF:即数据湖工厂(Data lake factory),它可管理多种大数据服务,提供一站式的大数据开发环境、全托管的大数据调度能力,极大降低用户使用大数据的门槛,帮助用户快速构建大数据处理中心。
DI:即数据融合(Data Integration)。提供同构/异构数据源之间批量数据迁移服务,帮助客户实现数据自由流动。支持客户各种类型数据源之间的数据迁移,支持的类型包括:文件系统,关系数据库,数据仓库,NoSQL,大数据服务等数据源。DI:即数据融合(Data Integration)服务提供同构/异构数据源之间批量数据迁移服务,帮助客户实现数据自由流动。支持客户各种类型数据源之间的数据迁移,支持的类型包括:文件系统,关系数据库,数据仓库,NoSQL,大数据服务等数据源。
DG:即数据治理(Data Goverance),对数据资产进行梳理、质量监控、标准化、清洗等操作,提供一站式数据管控平台。对企业的数据资产提供标准建设、资产管理、质量监控、安全共享的智能数据治理能力,助力打造资产化、服务化、标准化的数据体系。
https://blog.csdn.net/u012152619/article/details/52901319
ZooKeeper之(一)ZooKeeper是什么
通讯相关:
https://github.com/openvswitch/ovs
Open vSwitch是一个在开源Apache 2许可下获得许可的多层软件交换机
Open vSwitch非常适合在VM环境中用作虚拟交换机
DHCP二三层配置实验
PPPoE拨号实验
CM上线实验
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。