Spark是大数据的调度,监控和分配引擎。它是一个快速通用的集群计算平台.Spark扩展了流行的MapReduce模型.Spark提供的主要功能之一就是能够在内存中运行计算 ,但对于在磁盘上运行的复杂应用程序,系统也比MapReduce更有效。
在独立模式下,Spark使用Master守护进程来协调运行执行程序的Worker的工作。独立模式是默认模式,Worker运行executor, 但不能在安全集群上使用。当提交应用程序时,可以选择其执行程序将使用多少内存,以及所有执行程序中的内核总数。
在YARN模式下,YARN ResourceManager执行Spark Master的功能。 Workers的功能由运行执行程序的YARN NodeManager守护程序执行。 YARN模式设置稍微复杂一些,但它支持安全性。
多语言:Spark提供Java,Scala,Python和R中的高级API .Spark代码可以用这四种语言中的任何一种编写。 它为Scala和Python提供了shell。 可以通过./bin/spark-shell进入Scala Shell和通过./bin/pyspark 进入Python shell
速度:Spark的运行速度比Hadoop MapReduce快100倍,适用于大规模数据处理。 Spark能够通过控制分区实现此速度。 它使用分区管理数据,这些分区有助于以最小的网络流量并行化处理分布式数据处
多种格式:Spark支持多种数据源,如Parquet,JSON,Hive和Cassandra。 Data Sources API提供了一种可插入的机制,用于通过Spark SQL访问结构化数据。 数据源不仅仅是简单的管道,可以转换数据并将其拉入Spark。
延迟执行:Apache Spark延迟执行,直到绝对必要。 这是促进其速度的关键因素之一。 对于transformations,Spark将它们添加到计算的DAG中,并且仅当驱动程序请求某些数据时,才会实际执行此DAG。
实时计算:Spark的计算是实时的,并且由于其内存计算而具有较少的延迟。 Spark专为大规模可扩展性而设计,Spark团队已经记录了运行具有数千个节点的生产集群的系统用户,并支持多种计算模型。
Hadoop集成:Apache Spark提供与Hadoop的兼容性。 Spark是Hadoop的MapReduce的潜在替代品,而Spark能够使用YARN在现有的Hadoop集群上运行资源调度。
机器学习:Spark的MLlib是机器学习组件,在大数据处理方面很方便。 它消除了使用多种工具的需求,一种用于处理,一种用于机器学习。 Spark为数据工程师和数据科学家提供了一个功能强大,统一的引擎,既快速又易于使用。
每个应用程序都有一个协调其执行的驱动程序进程 此过程可以在前台(客户端模式)或后台(群集模式)中运行。 客户端模式稍微简单一些,但集群模式允许在启动Spark应用程序后轻松注销,而无需终止应用程序。
如何在独立客户端模式(client mode)下运行spark?
spark-submit \
class org.apache.spark.examples.SparkPi \
deploy-mode client \
master spark//$SPARK_MASTER_IP:$SPARK_MASTER_PORT \
$SPARK_HOME/examples/lib/spark-examples_version.jar 10
如何在独立群集模式(cluster mode)下运行spark?
spark-submit \
class org.apache.spark.examples.SparkPi \
deploy-mode cluster \
master spark//$SPARK_MASTER_IP:$SPARK_MASTER_PORT \
$SPARK_HOME/examples/lib/spark-examples_version.jar 10
如何在YARN客户端模式下(client mode)运行spark?
spark-submit \
class org.apache.spark.examples.SparkPi \
deploy-mode client \
master yarn \
$SPARK_HOME/examples/lib/spark-examples_version.jar 10
如何在YARN集群模式(cluster mode)下运行spark?
spark-submit \
class org.apache.spark.examples.SparkPi \
deploy-mode cluster \
master yarn \
$SPARK_HOME/examples/lib/spark-examples_version.jar 10
可以使用sparksubmit的-executor-memory参数来配置它。 默认情况下,此设置为1 GB.
RDD(弹性分布式数据集)是Apache Spark中的基本抽象,表示以对象格式进入系统的数据。 RDD以容错方式用于大型集群上的内存计算。 RDD是只读的分区,记录集合,即 - 不可变 - RDD不能改变。
弹性 - 如果持有分区的节点失败,则另一个节点获取数据。
Spark与MapReduce相比具有以下优势:
与Hadoop类似,YARN是Spark的主要功能之一,提供了一个中央和资源管理平台,可在整个群集中提供可扩展的操作。 YARN是一个分布式容器管理器,例如Mesos,而Spark是一个数据处理工具。 Spark可以在YARN上运行,就像Hadoop Map Reduce可以在YARN上运行一样。
不需要,因为Spark运行在YARN之上。 Spark独立于其安装运行。 Spark有一些选项可以在将作业分派给集群时使用YARN,而不是自己的内置管理器或Mesos。 此外,运行YARN还有一些配置。 它们包括master, deploy-mode, driver-memory, executor-memory, executor-cores, 和queue.
是的,MapReduce是包括Spark在内的许多大数据工具所使用的范例。 当数据越来越大时,使用MapReduce非常有用。 像Pig和Hive这样的大多数工具都会将查询转换为MapReduce阶段,以便更好地优化它们。
Spark提供了两种创建RDD的方法:
1.通过在Driver程序中并行化集合。
2.这使用了SparkContext的'parallelize'。
method val DataArray = Array(2,4,6,8,10)
val DataRDD = sc.parallelize(DataArray)
3.通过从外部存储器加载外部数据集,如HDFS,HBase,共享文件系统。
顾名思义,分区是一个较小的逻辑分区,类似于MapReduce中的“split”。 它是大型分布式数据集的逻辑块。 分区是导出数据逻辑单元以加速处理过程的过程。 Spark使用分区来管理数据,这些分区有助于并行化分布式数据处理,只需最少的网络流量,Spark会尝试从靠近它的节点将数据读入RDD。 由于Spark通常访问分布式分区数据,为了优化转换操作,它创建了用于保存数据块的分区。
RDD(Resilient Distributed Dataset)是Spark中的主要逻辑数据单元。 RDD是分布式集合对象。 分布式意味着,每个RDD分为多个分区。 这些分区中的每一个都可以驻留在内存中或存储在群集中不同计算机的磁盘上。 RDD是不可变(只读)数据结构。 无法更改原始RDD,但可以将其转换为所需的不同RDD。
RDD支持两种类型的操作:转换和操作。
转换(Transformations):转换从现有的RDD创建新的RDD,如map,reduceByKey和我们刚看到的过滤器(filter)。 转换按需执行。 这意味着它们是懒惰计算的。
操作(Actions):操作返回RDD计算的最终结果。 Actions使用lineage graph触发执行以将数据加载到原始RDD中,执行所有中间转换并将最终结果返回到驱动程序或将其写入文件系统。
Transformations是应用于RDD的函数,导致另一个RDD。 在动作发生之前它不会执行。 map()和filter()是转换的示例,前者应用在RDD的每个元素上传递给它的函数,并导致另一个RDD。 filter()通过从当前RDD中选择传递函数参数的元素来创建新的RDD。
val rawData=sc.textFile("path to/movies.txt")
val moviesData=rawData.map(x=>x.split("\t"))
正如我们在这里看到的,rawData RDD被转换为moviesData RDD。 Transformations延迟执行
Actions有助于将数据从RDD取到本地。Actions的执行是所有先前创建的transformation的结果。 Actions使用 lineage graph触发执行以将数据加载到原始RDD中,执行所有中间转换并将最终结果返回到驱动程序或将其写入文件系统。
reduce()是一个动作,它实现了一次又一次传递的函数,直到剩下一个值。 take()action将RDD中的所有值都带到本地节点。
moviesData.saveAsTextFile(“MoviesData.txt”)
正如我们在这里看到的,moviesData RDD被保存到名为MoviesData.txt的文本文件中。
Spark Core是大规模并行和分布式数据处理的基础引擎。 核心是分布式执行引擎,Java,Scala和Python API为分布式ETL应用程序开发提供了一个平台。 SparkCore执行各种重要功能,如内存管理,监视作业,容错,作业调度以及与存储系统的交互。 此外,在core上构建的其他库允许streaming,SQL和机器学习的各种工作负载。 它负责:
如何在Spark中实现Streaming? 用例子解释。
Spark Streaming用于处理实时流数据。 因此,它是核心Spark API的有用补充。 它支持实时数据流的高吞吐量和容错流处理。 基本流单元是DStream,它基本上是一系列用于处理实时数据的RDD(弹性分布式数据集)。 来自Flume,HDFS等不同来源的数据将进行流式处理,最终处理为文件系统,实时显示和数据库。 它类似于批处理,因为输入数据被分成像批次一样的流。
是否有用于在Spark中实现图形(graphs)的API?
GraphX是用于图形和图形并行计算的Spark API。 因此,它使用弹性分布式属性图扩展了Spark RDD。
属性图是一个有向多图,它可以有多个并行边。 每个边和顶点都有与之关联的用户定义属性。 这里,平行边缘允许相同顶点之间的多个关系。 在高层次上,GraphX通过引入弹性分布式属性图来扩展Spark RDD抽象:一个定向多图,其属性附加到每个顶点和边。
为了支持图形计算,GraphX公开了一组基本运算符(例如,subgraph,joinVertices和mapReduceTriplets)以及Pregel API的优化变体。 此外,GraphX包含越来越多的图算法和构建器,以简化图形分析任务。
GraphX中的PageRank是什么?
PageRank测量图中每个顶点的重要性,假设从u到v的边表示u对v的重要性的认可。 例如,如果Twitter用户跟随许多其他用户,则用户将被排名很高。
GraphX带有PageRank的静态和动态实现,作为PageRank Object上的方法。 静态PageRank运行固定的迭代次数,而动态PageRank运行直到排名收敛(即停止更改超过指定的容差)。 GraphOps允许直接将这些算法作为Graph上的方法调用。
2.老司机面试题:
如何在Spark中实现机器学习?
MLlib是Spark提供的可扩展机器学习库。 它旨在通过常见的学习算法和集群,回归过滤,降维等相似的用例,使机器学习变得简单和可扩展。
是否有一个模块在Spark中实现SQL? 它是如何工作的?
Spark SQL是Spark中的一个新模块,它将关系处理与Spark的函数式编程API集成在一起。 它支持通过SQL或Hive查询语言查询数据。 对于那些熟悉RDBMS的人来说,Spark SQL将很容易从之前的工具过渡到可以扩展传统关系数据处理的边界。
Spark SQL将关系处理与Spark的函数式编程集成在一起。 此外,它为各种数据源提供支持,并且可以使用代码转换编织SQL查询,从而产生一个非常强大的工具。
以下是Spark SQL的四个库。
什么是Parquet文件?
Parquet是许多其他数据处理系统支持的列式格式文件。 Spark SQL使用Parquet文件执行读写操作,并认为它是迄今为止最好的大数据分析格式之一。
Parquet是一种列式(columnar)格式,由许多数据处理系统支持。 列式存储的优点如下:
Spark如何与Hadoop一起使用?
Apache Spark的最佳部分是它与Hadoop的兼容性。 因此,这是一种非常强大的技术组合。 一起使用Spark和Hadoop可以帮助我们利用Spark的处理来充分利用Hadoop的HDFS和YARN。
Hadoop组件可以通过以下方式与Spark一起使用:
什么是RDD血统?
Spark不支持内存中的数据副本,因此,如果丢失了任何数据,则使用RDD血统进行重建。 RDD血统是一个重建丢失的数据分区的过程,因此 最好的是RDD记住如何从其他数据集构建。
什么是Spark Driver?
Spark Driver是在机器的master上运行的程序,用于声明数据RDD上的转换(transformations)和操作(actions)。 简单来说,Spark中的驱动程序创建SparkContext,连接到给定的Spark Master。
该驱动程序还将RDD graph提供给Master,其中 standalone cluster 管理器运行。
Spark支持哪些文件系统?
Spark支持以下三个文件系统:
列出Spark SQL的功能?
Spark SQL能够:
什么是Spark Executor?
当SparkContext连接到集群管理器时,它会在集群中的节点上获取Executor。 executor是Spark进程,它运行计算并将数据存储在工作节点上。 SparkContext的最终任务被转移到executors以执行它们。
Spark中的集群的类型?
Standalone:设置群集的基本manager。
Apache Mesos:通用/常用的集群manager,也运行Hadoop MapReduce和其他应用程序。
YARN:负责Hadoop的资源管理。
你对worker节点有什么了解?
Worker节点是指可以在集群中运行应用程序代码的任何节点。 驱动程序必须侦听并接受来自其executors的传入连接,并且必须可以从worker进行网络寻址。
worker节点基本上是从节点。 主节点(Master)分配工作,worker节点实际执行分配的任务。 worker节点处理存储在节点上的数据并将资源报告给Master。 基于资源可用性,Master调度任务。
说说使用Spark的一些缺点?
以下是使用Apache Spark的一些缺点:
列出一些Spark在处理过程中胜过Hadoop的用例?
什么是Sparse Vector?
Sparse Vector有两个并行数组; 一个用于索引,另一个用于值。 这些向量用于存储非零条目以节省空间。
Vectors.sparse(7,Array(0,1,2,3,4,5,6),Array(1650d,50000d,800d,3.0,3.0,2009,95054))
可以使用上述稀疏矢量代替密集矢量。
val myHouse = Vectors.dense(4450d,2600000d,4000d,4.0,4.0,1978.0,95070d,1.0,1.0,1.0,0.0)
可以使用Spark访问和分析存储在Cassandra数据库中的数据吗?
是的,如果使用Spark Cassandra Connector,则可以。要将Spark连接到Cassandra集群,需要将Cassandra Connector添加到Spark项目中。 在设置中,Spark执行程序将与本地Cassandra节点通信,并仅查询本地数据。 它通过减少网络的使用来在Spark executor(处理数据)和Cassandra节点(数据存在的地方)之间发送数据,从而加快查询速度。
在使用Spark时,如何最大限度地减少数据传输?
最大限度地减少数据传输并避免混乱有助于编写以快速可靠的方式运行的spark程序。 使用Apache Spark时,可以最大限度地减少数据传输的各种方式:
最常见的方法是避免操作ByKey,重新分区或任何其他触发shuffle的操作。
什么是广播变量?
广播变量允许程序员在每台机器上保留一个只读变量,而不是随任务一起发送它的副本。 它们可用于以有效的方式为每个节点提供大型输入数据集的副本。 Spark还尝试使用有效的广播算法来分发广播变量,以降低通信成本。
在Apache Spark中什么是累加器?
累加器是仅通过关联和交换操作添加的变量。 它们用于实现计数器或总和。 在UI中跟踪累加器对于理解运行阶段的进度非常有用。 Spark原生支持数字累加器。 我们可以创建命名或未命名的累加器。
使用Apache Spark时,为什么需要广播变量?
广播变量是只读变量,存在于每台机器上的内存缓存中。 使用Spark时,广播变量的使用消除了为每个任务发送变量副本的必要性,因此可以更快地处理数据。 广播变量有助于在内存中存储查找表,与RDD查找()相比,这提高了检索效率。
如何在Spark中触发自动清理以处理累积的元数据?
可以通过设置参数'spark.cleaner.ttl'或将长时间运行的作业分成不同的批次并将中间结果写入磁盘来触发清理。
滑动窗操作有什么意义?
滑动窗口控制电脑网络之间的数据包传输。 Spark Streaming库提供窗口计算,其中RDD上的转换应用于滑动数据窗口。 每当窗口滑动时,组合并操作落在特定窗口内的RDD以产生窗口化DStream的新RDD。
Apache Spark中的DStream是什么?
Discretized Stream(DStream)是Spark Streaming提供的基本抽象。 它是一个连续的数据流。 它是从数据源或通过转换输入流生成的已处理数据流接收的。 在内部,DStream由连续的RDD系列表示,每个RDD包含来自特定间隔的数据。 应用于DStream的任何操作都转换为底层RDD上的操作。
可以从Apache Kafka,HDFS和Apache Flume等各种来源创建DStream。 DStreams有两个操作:
Spark Streaming中可以进行许多DStream转换。 我们来看看filter(func)。 filter(func)通过仅选择,func返回true的源DStream的记录,来返回新的DStream。
解释Spark Streaming中的缓存?
DStreams允许开发人员在内存中缓存/保存流的数据。 如果DStream中的数据将被多次计算,这将非常有用。 这可以使用DStream上的persist()方法完成。 对于通过网络接收数据的输入流(例如Kafka,Flume,Sockets等),默认持久性级别设置为将数据复制到两个节点以实现容错。
Spark SQL中有哪些可用的数据源?
Parquet文件,JSON数据集和Hive表是Spark SQL中可用的数据源。
Apache Spark中的各种持久性级别是什么?
Apache Spark会自动保留来自各种shuffle操作的中间数据,但是,通常建议用户在计划重用RDD时调用RDD上的persist()方法。 Spark具有各种持久性级别,可将RDD存储在磁盘或内存中,或者作为两者的组合,具有不同的复制级别。
Spark中的各种存储/持久性级别是:
1.MEMORY_ONLY
使用未序列化的Java对象格式,将数据保存在内存中。如果内存不够存放所有的数据,则数据可能就不会进行持久化。那么下次对这个RDD执行算子操作时,那些没有被持久化的数据,需要从源头处重新计算一遍。这是默认的持久化策略,使用cache()方法时,实际就是使用的这种持久化策略。
2.MEMORY_AND_DISK
使用未序列化的Java对象格式,优先尝试将数据保存在内存中。如果内存不够存放所有的数据,会将数据写入磁盘文件中,下次对这个RDD执行算子时,持久化在磁盘文件中的数据会被读取出来使用。
3.MEMORY_ONLY_SER
基本含义同MEMORY_ONLY。唯一的区别是,会将RDD中的数据进行序列化,RDD的每个partition会被序列化成一个字节数组。这种方式更加节省内存,从而可以避免持久化的数据占用过多内存导致频繁GC。
4.MEMORY_AND_DISK_SER
基本含义同MEMORY_AND_DISK。唯一的区别是,会将RDD中的数据进行序列化,RDD的每个partition会被序列化成一个字节数组。这种方式更加节省内存,从而可以避免持久化的数据占用过多内存导致频繁GC。
5.DISK_ONLY
使用未序列化的Java对象格式,将数据全部写入磁盘文件中。
6.MEMORY_ONLY_2, MEMORY_AND_DISK_2, 等等
对于上述任意一种持久化策略,如果加上后缀_2,代表的是将每个持久化的数据,都复制一份副本,并将副本保存到其他节点上。这种基于副本的持久化机制主要用于进行容错。假如某个节点挂掉,节点的内存或磁盘中的持久化数据丢失了,那么后续对RDD计算时还可以使用该数据在其他节点上的副本。如果没有副本的话,就只能将这些数据从源头处重新计算一遍了。
Spark是否提供检查点(checkpoints)?
checkpoints类似于游戏中的检查点。 它们使它全天候运行并使其适应与应用程序逻辑无关的故障。
Lineage graph对于从故障中恢复RDD总是有用的,但如果RDD具有较长的谱系链(lineage chains),这通常很耗时。 Spark有一个用于检查点的API,即一个要保留的REPLICATE标志。 但是,决定检查点的数据 - 由用户决定。 当谱系图( lineage graphs)很长并且具有广泛的依赖性时,检查点很有用。
如何理解延迟调用?
Spark在数据运作方式很聪明。 当你告诉Spark对一个给定的数据集进行操作时,它会注意到指令并对其进行记录,这样它就不会忘记 - 但它什么也不做,除非要求最终结果。 在RDD上调用map()之类的转换时,不会立即执行该操作。Transformations不会被执行,直到action操作时,执行操作 。 这有助于优化整体数据处理工作流程。
SchemaRDD在Spark RDD中你有什么理解?
SchemaRDD是一个RDD,由行对象(基本字符串或整数数组周围的包装器)组成,其中包含有关每列中数据类型的架构信息。
SchemaRDD旨在让开发人员在日常的代码调试和SparkSQL核心模块上进行单元测试时更加轻松。 这个想法可以归结为使用类似于关系数据库模式的形式描述来描述RDD内部的数据结构。 除了常见的RDD API提供的所有基本功能之外,SchemaRDD还提供了一些通过SparkSQL实现的简单的关系查询接口函数。
现在,它正式重命名为Spark最新的主干上的DataFrame API。
Spark SQL与HQL和SQL有何不同?
Spark SQL是Spark Core引擎上的一个特殊组件,它支持SQL和Hive查询语言,而无需更改任何语法。 可以将SQL表和HQL表连接到Spark SQL。
解释你将使用Spark Streaming的场景?
用例——从Uber到Pinterest
虽然针对不同的目标和业务案例使用Spark Streaming的方式也不同,但其主要场景包括:
流ETL——将数据推入存储系统之前对其进行清洗和聚合
触发器——实时检测异常行为并触发相关的处理逻辑
数据浓缩——将实时数据与静态数据浓缩成更为精炼的数据以用于实时分析
复杂会话和持续学习——将与实时会话相关的事件(例如用户登陆Web网站或者应用程序之后的行为)组合起来进行分析。
例如,Uber通过Kafka、Spark Streaming和HDFS构建了持续性的ETL管道,该管道首先对每天从移动用户那里收集到的TB级的事件数据进行转换,将原始的非结构化事件数据转换成结构化的数据,然后再进行实时地遥测分析。Pinterest的ETL数据管道始于Kafka,通过Spark Streaming将数据推入Spark中实时分析全球用户对Pin的使用情况,从而优化推荐引擎为用户显示更相关的Pin。Netflix也是通过Kafka和Spark Streaming构建了实时引擎,对每天从各种数据源接收到的数十亿事件进行分析完成电影推荐。