您好,登錄后才能下訂單哦!
我們知道Apache Spark現在是一項蓬勃發展的技術。因此,了解Apache Spark的各個方面以及Spark面試問題非常重要。我將介紹Spark的每個方面,這也可能是經常被問到的Spark面試問題。此外,我將盡力提供每個問題,從現在開始,您搜索最佳和所有Spark面試問題將在此結束。
Apache Spark面試問題答案
一,什么是Apache Spark?
Apache Spark是一個功能強大的開源靈活數據處理框架,圍繞速度,易用性和復雜的分析而構建.Apache Spark在集群計算系統中正在快速發展。Spark可以在Hadoop上運行,獨立運行或在云中運行,并且能夠訪問來自各種來源的數據,包括HDFS,HBase,Cassandra或其他。
由于Spark中的集群內計算,它不需要在磁盤內外進行混洗。這樣可以更快地處理spark中的數據。
與其他大數據和MapReduce技術(如Hadoop和Storm)相比,Spark具有多項優勢。其中很少是:
1.Speed
它可以在內存中運行程序比Hadoop-MapReduce快100倍,在磁盤上運行速度快10倍。
2.易用性
Spark具有易于使用的API,可用于大型數據集。這包括100多個用于
轉換數據的運算符和用于處理半結構化數據的熟悉數據幀API 的集合。
我們可以用Java,Scala,Python,R編寫應用程序。
Spark附帶更高級別的庫,包括對SQL查詢,流數據,機器學習和圖形處理的支持。
4.Runs Everywhere
Spark可以在Hadoop,Mesos,獨立或云端運行。
Spark生態系統
以下是Spark生態系統及其組件的簡要概述。
它包括:
Spark Streaming: Spark Streaming用于處理實時流數據。
Spark SQL: Spark SQL組件是一個位于Spark集群之上的庫,通過使用我們可以在Spark數據上運行SQL查詢。
Spark MLlib: MLlib是Spark的可擴展機器學習庫。
Spark GraphX: GraphX用于圖形和圖形并行計算。
二.為何選擇Apache Spark?
基本上,我們有很多通用的集群計算工具。例如Hadoop MapReduce,Apache Storm,Apache Impala,Apache Storm,Apache Giraph等等。但每個人的功能也有一些限制。如:
2.如果我們談論流處理,只有Apache Storm / S4可以執行。
3.再次進行交互式處理,我們需要Apache Impala / Apache Tez。
4.雖然我們需要執行圖形處理,但我們選擇Neo4j / Apache Giraph。
因此,沒有一個引擎可以一起執行所有任務。因此,對強大的引擎有很大的需求,可以實時(流)和批處理模式處理數據。
此外,它可以響應亞秒級并執行內存處理
通過這種方式,Apache Spark出現了。它是一個功能強大的開源引擎,提供交互式處理,實時流處理,圖形處理,內存處理以及批處理。即使速度非常快,易于使用,同時也是標準接口。
三. Apache Spark Ecosystem的組件是什么?
Apache spark由以下組件組成:
1.Spark Core
2.Spark SQL
3.Spark Streaming
4.MLlib
5.GraphX
spark streaming:spark streaming包含的基本功能spark,包括任務調度,內存管理,故障恢復成分,與存儲系統交互,等等。Spark Core也是API的所在地,它定義了彈性分布式數據集(RDD),這是Spark的主要編程抽象。它還提供了許多用于構建和操作這些RDDS的API。
Spark SQL:Spark SQL提供了一個處理結構化數據的接口。它允許在SQL中查詢以及SQL(HQL)的Apache Hive變體。它支持許多源。
Spark Streaming:Spark組件,可以處理實時數據流。
MLlib:Spark附帶了一個名為MLlib的通用機器學習包
GraphX:GraphX是一個用于操縱圖形(例如,社交網絡的朋友圖)和執行圖形并行計算的庫。
四,.什么是Spark Core?
Spark Core是整個Spark項目的基本單元。它提供了各種功能,如任務調度,調度和輸入輸出操作等.Spark使用稱為RDD(彈性分布式數據集)的特殊數據結構。它是API的主頁,用于定義和操作RDD。Spark Core是分布式執行引擎,其頂部附加了所有功能。例如,MLlib,SparkSQL,GraphX,Spark Streaming。因此,允許單一平臺上的各種工作負載。Apache Spark的所有基本功能類似于內存計算,容錯,內存管理,監控,任務調度由Spark Core提供。
除此之外,Spark還提供與數據源的基本連接。例如,HBase,Amazon S3,HDFS等。
五,Apache Spark支持哪些語言?
Apache Spark是用Scala語言編寫的。Spark在Scala,Python和Java中提供了一個API,以便與Spark進行交互。它還提供R語言的API。
六,Apache Spark如何比Hadoop更好?
Apache Spark正在提升快速集群計算工具。由于其非常快速的內存數據分析處理能力,它比 Hadoop MapReduce快100倍。
Apache Spark是一個大數據框架。Apache Spark是一種通用數據處理引擎,通常用于HDFS之上。Apache Spark適用于從批處理到數據流的各種數據處理要求。
Hadoop是一個開源框架,用于處理存儲在 HDFS中的數據。Hadoop可以處理結構化,非結構化或半結構化數據。Hadoop MapReduce只能以批處理模式處理數據。
在許多情況下,Apache Spark超過Hadoop,例如
1.處理內存中的數據,這在Hadoop中是不可能的
.2。處理批量,迭代,交互和流式傳輸的數據,即實時模式。而Hadoop僅以批處理模式處理。
4上.Apache Spark很容易編程,因為它有數百個帶RDD的高級操作符(彈性分布式數據集)
5.與Hadoop MapReduce相比,Apache Spark代碼更緊湊。使用Scala使其非常簡短,減少了編程工作。另外,星火提供了豐富的各種語言,比如Java,API的斯卡拉,Python和[R 。
7.在Hadoop集群中運行的Spark應用程序在磁盤上的速度比Hadoop MapReduce快10倍。
七,在Apache Hadoop上運行Spark有哪些不同的方法?
而不是MapReduce,我們可以在Hadoop生態系統上使用spark -spark with HDFS 你可以在HDFS中讀取和寫入數據 -spark with Hive 你可以讀取和分析并寫回到hive
八,Apache Spark中的SparkContext是什么?
SparkContext是Spark執行環境的客戶端,它充當Spark應用程序的主服務器。SparkContext設置內部服務并建立與Spark執行環境的連接。您可以在創建SparkContext之后創建RDD,累加器和廣播變量,訪問Spark服務并運行作業(直到SparkContext停止)。每個JVM只能激活一個SparkContext。您必須在創建新的SparkContext之前停止()活動的SparkContext。
在Spark shell中,已經為名為sc的變量中的用戶創建了一個特殊的解釋器感知SparkContext。
任何Spark驅動程序應用程序的第一步是創建SparkContext。SparkContext允許Spark驅動程序應用程序通過資源管理器訪問集群。資源管理器可以是YARN,也可以是Spark的Cluster Manager。
SparkContext提供的功能很少:
1。我們可以獲取Spark應用程序的當前狀態,例如配置,應用程序名稱。
2.我們可以設置配置,如主URL,默認日志級別。
3.可以創建像RDD這樣的分布式實體。
九, Apache Spark中的SparkSession是什么?
從Apache Spark 2.0開始,Spark Session是Spark應用程序的新入口點。
在2.0之前,SparkContext是spark工作的切入點。RDD是當時的主要API之一,它是使用Spark Context創建和操作的。對于每個其他API,都需要不同的上下文 - 對于SQL,需要SQL上下文; 對于Streaming,需要Streaming Context; 對于Hive,需要Hive Context。
但是從2.0開始,RDD以及DataSet及其子集DataFrame API正在成為標準API,并且是Spark中數據抽象的基本單元。所有用戶定義的代碼都將根據DataSet和DataFrame API以及RDD進行編寫和評估。
因此,需要一個新的入口點構建來處理這些新的API,這就是引入Spark Session的原因。Spark Session還包括不同上下文中可用的所有API - Spark Context,SQL Context,Streaming Context,Hive Context。
十,Apache Spark中的SparkSession vs SparkContext。
在 Spark 2.0.0之前,sparkContext被用作訪問所有spark功能的通道。
spark驅動程序使用spark context通過資源管理器( YARN或 Mesos ..)連接到集群。
sparkConf是創建spark上下文對象所必需的,它存儲配置參數,如appName(用于標識您的spark驅動程序),應用程序,核心數量以及在工作節點上運行的執行程序的內存大小。
為了使用SQL,HIVE和Streaming的 API, 需要創建單獨的上下文。
示例:
創建sparkConf:
val conf = new SparkConf().setAppName(“RetailDataAnalysis”).setMaster(“spark://master:7077”).set(“spark.executor.memory”, “2g”)
creation of sparkContext:
val sc = new SparkContext(conf)
Spark會議:
從SPARK 2.0.0開始,SparkSession提供了與基礎Spark功能交互的單一入口點,并
允許使用DataFrame和Dataset API 編寫Spark 。sparkContext中提供的所有功能也可在sparkSession中使用。
為了使用SQL,HIVE和Streaming的API,不需要創建單獨的上下文,因為sparkSession包含所有API。
一旦SparkSession被實例化,我們就可以配置Spark的運行時配置屬性。
例:
創建Spark會話:
val spark = SparkSession
.builder
.appName(“
WorldBankIndex ”)。getOrCreate()
配置屬性:
spark.conf.set(“spark.sql.shuffle.partitions”,6)
spark.conf.set(“spark.executor.memory”,“2g”)
從Spark 2.0.0開始,最好使用sparkSession,因為它提供了對sparkContext所具有的所有spark功能的訪問。此外,它還提供了API來處理DataFrame和數據集。
十一,Apache Spark的抽象是什么?
Apache Spark有幾個抽象:
RDD指的是彈性分布式數據集。RDD是記錄的只讀分區集合。它是Spark的核心抽象,也是Spark的基本數據結構。它提供在大型集群上進行內存計算。即使是以容錯的方式。有關RDD.follow鏈接的更詳細見解:Spark RDD - RDD的簡介,功能和操作
它是一個組織成命名列的數據集。DataFrames等同于R / Python 中的關系數據庫或數據框架中的表。換句話說,我們可以說它是一個具有良好優化技術的關系表。它是一個不可變的分布式數據集合。允許更高級別的抽象,它允許開發人員將結構強加到分布式數據集合上。有關DataFrame的更詳細的見解。參考鏈接:Spark SQL DataFrame教程 - DataFrame簡介
它是Spark的核心擴展,允許從多個來源進行實時流處理。例如Flume和Kafka。為了提供可用于交互式和批量查詢的統一,連續的DataFrame抽象,這兩個源一起工作。它提供可擴展,高吞吐量和容錯處理。有關Spark Streaming的更詳細的見解。參考鏈接:初學者的Spark Streaming教程
這是專門數據抽象的又一個例子。它使開發人員能夠分析社交網絡。此外,其他圖表與Excel類似的二維數據一起。
十二,如何在Apache Spark中創建RDD?
彈性分布式數據集(RDD)是spark的核心抽象,是一個彈性分布式數據集。
它是一個不可變(只讀)的分布式對象集合。RDD中的
每個數據集被劃分為邏輯分區,
其可以在集群的不同節點上計算。
包括用戶定義的類,RDD可以包含任何類型的Python,Java或Scala對象。
我們可以通過3種方式在Apache Spark中創建RDD :
1。通過分發對象集合
2.通過加載外部數據集
3.從現有的Apache Spark RDDs
RDD通常通過并行化現有集合來創建,
即通過在程序中獲取現有集合并將
其傳遞給SparkContext的 parallelize()方法。
scala> val data = Array(1,2,3,4,5)
scala> val dataRDD = sc.parallelize(data)
scala> dataRDD.count
在Spark中,可以從Hadoop支持的任何數據源構建分布式數據集。
val dataRDD = spark.read.textFile(“F:/BigData/DataFlair/Spark/Posts.xml”)。rdd
轉換是從現有RDD創建RDD的方法。
轉換作為一種功能,可以吸收RDD并產生另一個結果RDD。
輸入RDD不會改變,RDD上應用的
一些操作是:filter,Map,FlatMap
val dataRDD = spark.read.textFile(“F:/Mritunjay/BigData/DataFlair/Spark/Posts.xml”)。rdd
val resultRDD = data.filter {line => {line.trim()。startsWith(“<row”)} }
十三,為什么Spark RDD不可變?
以下是原因:
不可變數據始終可以安全地共享多個進程以及多個線程。
由于RDD是不可變的,我們可以隨時重新創建RDD。(來自譜系圖)。
如果我遺漏了某些東西,請添加更多分數
RDD也是容錯的,并且可以懶惰地評估以獲取更多信息。
十四,在Apache Spark中解釋配對RDD這個術語
簡介
配對RDD是具有鍵值對的分布式數據集合。它是Resilient Distributed Dataset的子集。因此它具有RDD的所有功能和鍵值對的一些新功能。配對RDD 有許多轉換操作可用。配對RDD上的這些操作對于解決許多需要排序,分組,減少某些值/功能的用例非常有用。
配對RDD上常用的操作有:groupByKey()reduceByKey()countByKey()join()等
創建配對RDD:
val pRDD:[(String),(Int)] = sc.textFile(“path_of_your_file”)。
flatMap( line => line.split(“”))。map
{word =>(word,word.length)}
同樣使用subString方法(如果我們有一個帶有id和某個值的文件,我們可以創建配對的rdd,id為key,value為其他細節)
val pRDD2 [(Int),(String)] = sc.textFile(“path_of_your_file”)。
keyBy(line => line.subString(1,5).trim()。toInt)
。mapValues(line => line.subString (10,30).trim())
十五,Spark中的RDD與Distributed Storage Management有何不同?
RDD和分布式存儲之間的一些區別如下:
彈性分布式數據集(RDD)是Apache Spark框架的主要數據抽象。
分布式存儲只是一個可在多個節點上運行的文件系統。
RDD將數據存儲在內存中(除非顯式緩存)。
Distributed Storage將數據存儲在持久存儲中。
在發生故障或數據丟失的情況下,RDD可以重新計算自身。
如果數據從分布式存儲系統中丟失,它將永遠消失(除非有內部復制系統)
十六,在Apache Spark中解釋RDD中的轉換和操作
轉換是對RDD的操作,用于創建一個或多個新RDD。例如map,filter,reduceByKey等。換句話說,轉換是將RDD作為輸入并產生一個或多個RDD作為輸出的函數。輸入RDD沒有變化,但它總是通過應用它們所代表的計算產生一個或多個新的RDD。變換是惰性的,即不立即執行。只有在調用動作后才會執行轉換。
操作是生成非RDD值的RDD操作。換句話說,返回任何類型但RDD的值的RDD操作是一個動作。它們觸發執行RDD轉換以返回值。簡單地說,一個動作評估RDD沿襲圖。例如收集,減少,計數,foreach等。
十七,Apache Spark轉換的類型有哪些?
為了更好地理解轉換的類型,讓我們從Apache Spark中的轉換簡介開始 。
Spark
Spark Transformation中的轉換是一種從現有RDD生成新RDD的函數。它將RDD作為輸入并生成一個或多個RDD作為輸出。每當我們應用任何轉換時它都會創建新的RDD。由于RDD本質上是不可變的,因此無法更改輸入RDD。
RDD譜系,通過應用使用最終RDD的整個父RDD構建的轉換構建。換句話說,它也被稱為RDD運算符圖或RDD依賴圖。它是一個邏輯執行計劃,即它是RDD的整個父RDD的有向無環圖(DAG)。
轉換本質上是懶惰的,即當我們調用一個動作時它們會被執行。它們不會立即執行。兩種最基本的轉換類型是map(),filter()。
結果RDD始終與其父RDD不同。它可以更小(例如過濾,計數,不同,樣本),更大(例如flatMap(),union(),Cartesian())或相同大小(例如map)。
現在,讓我們關注這個問題,基本上有兩種類型的轉換:
1.窄變換 -
在討論窄變換時,在單個分區中計算記錄所需的所有元素都位于父RDD的單個分區中。為了計算結果,使用有限的分區子集。此轉換是map(),filter()的結果。
2.廣泛轉換 -
廣泛轉換意味著計算單個分區中記錄所需的所有元素可能存在于父RDD的許多分區中。分區可以駐留在父RDD的許多不同分區中。此轉換是groupbyKey()和reducebyKey()的結果
十八,解釋RDD屬性
RDD(彈性分布式數據集)是Apache Spark中的基本抽象。
RDD是群集上不可變的,分區的元素集合,可以并行操作。
每個RDD的特點是五個主要屬性:
以下操作是譜系操作。1.列表或分區集。
2.其他(父)RDD的依賴關系列表
3.計算每個分區的函數
以下操作用于執行期間的優化。
4.可選的首選位置[即HDFS文件的塊位置] [它是關于數據位置]
5.可選的分區信息[即鍵/值對的哈希分區 - >當數據混洗時數據將如何傳播]
示例:
#HadoopRDD:
HadoopRDD 使用舊版MapReduce API(org.apache.hadoop.mapred)提供讀取存儲在Hadoop(HDFS,HBase,Amazon S3 ..)中的數據的核心功能
HadoopRDD的屬性:
1.分區列表或分區:每個HDFS塊一個
2.父RDD依賴項列表:無
3.計算每個分區的功能:讀取相應的HDFS塊
4.可選首選位置:HDFS塊位置
5.可選分區信息:沒有
#FilteredRDD:
FilteredRDD的屬性:
1.分區列表或分區集:與父RDD相同的分區數
在譜系圖上添加更多點:
您可以使用rdd0.toDebugString檢查兩個RDD之間的譜系。這會返回從當前rdd到RDD之前所有依賴關系的沿襲圖。見下文。每當你看到toDebugString輸出中的“+ - ”符號時,就意味著從下一個操作開始就會有下一個階段。這表示識別創建了多少個階段。
scala> val rdd0 = sc.parallelize(List(“Ashok Vengala”,“Ashok Vengala”,“DataFlair”))
rdd0:org.apache.spark.rdd.RDD [String] = ParallelCollectionRDD [10]并行化在<console >:31
scala> val count = rdd0.flatMap(rec => rec.split(“”))。map(word =>(word,1))。reduceByKey( + )
count:org.apache.spark.rdd.RDD [(String,Int)] =在<console>:33處的reduceByKey處的ShuffledRDD [13]
scala> count.toDebugString
res24:String =
(2)在<console>處的reduceByKey處的ShuffledRDD [13]:33 []
| MapPartitionsRDD [11]在flatMap的<console>:33 []
| ParallelCollectionRDD [10]并行化在<console>:31 []
從下到上(即最后三行):這些將在階段0中執行。第一行(ShuffledRDD):這將在第一階段進行操作。
在toDebugString輸出中,我們看到的是ParallelCollectionRDD,MapPartitionsRDD和ShuffleRDD。這些都是RDD抽象
二十,解釋術語Spark Partitions和Partitioners
分區:
分區在HDFS中也稱為“分裂”,是數據集的邏輯塊,可以在Petabyte,Terabytes范圍內并分布在群集中。
默認情況下,Spark為文件的每個塊創建一個分區(對于HDFS)
HDFS塊的默認塊大小為64 MB(Hadoop版本1)/ 128 MB(Hadoop版本2),因此分割大小。
但是,可以明確指定要創建的分區數。
分區基本上用于加速數據處理。
分區:
定義鍵值對RDD中的元素如何按鍵分區的對象。將每個鍵映射到分區ID,從0到(分區數 - 1)
分區程序捕獲輸出處的數據分布。調度程序可以根據分區程序的類型優化將來的操作。(即如果我們執行任何操作,說需要在節點之間移動的轉換或動作,我們可能需要分區器。請在論壇中引用reduceByKey()轉換)
Spark中基本上有三種類型的分區器:
(1)哈希分區程序(2)范圍分區程序(3)可以制作自定義分區程序
屬性名稱: spark.default.parallelism
默認值:對于像reduceByKey和join這樣的分布式shuffle操作,是父RDD中最大的分區數。對于沒有父RDD并行化的操作,它取決于集群管理器:
?本地模式:本地計算機上的核心數量
?Mesos細粒度模式:8
?其他:所有執行程序節點上的核心總數或2,以較小者為準更大
含義:通過轉換(如join)返回的RDD中的默認分區數
二十一,默認情況下,Apache Spark中的RDD中創建了多少個分區?
默認情況下,Spark為文件的每個塊創建一個分區(對于HDFS)
HDFS塊的默認塊大小為64 MB(Hadoop版本1)/ 128 MB(Hadoop版本2)。
但是,可以明確指定要創建的分區數。
例1:
沒有指定分區
val rdd1 = sc.textFile("/home/hdadmin/wc-data.txt")
例2:
以下代碼創建了10個分區的RDD,因為我們指定了no。分區。
val rdd1 = sc.textFile("/home/hdadmin/wc-data.txt", 10)
可以通過以下方式查詢分區數:
rdd1.partitions.length
<strong>
OR
</strong>
rdd1.getNumPartitions
最佳情況是我們應該按照以下方式制作RDD:
Cluster中的核心數量=否。分區
二十二,什么是Spark DataFrames?
DataFrame由兩個單詞data和frame組成,意味著數據必須適合某種幀。我們可以將框架理解為關系數據庫的模式。
在Spark中,DataFrame是通過網絡和一些模式的分布式數據的集合。我們可以將其理解為格式化為行/列方式的數據。可以從Hive數據,JSON文件,CSV,結構化數據或可以在結構化數據中構建框架的原始數據創建DataFrame。如果可以在該RDD上應用某些模式,我們還可以從RDD創建DataFrame 。
臨時視圖或表也可以從DataFrame創建,因為它具有數據和模式。我們還可以在創建的表/視圖上運行SQL查詢以獲得更快的結果。
它也被懶惰地評估(懶惰評估)以獲得更好的資源利用率。
二十三,Spark中DataFrame的好處是什么?
以下是DataFrames的優點。
1.DataFrame是分布式數據集合。在DataFrames中,數據在命名列中組織。
它們在概念上類似于關系數據庫中的表。此外,還有更豐富的優化。
4.我們可以通過它處理結構化和非結構化數據格式。如:Avro,CSV,彈性搜索和Cassandra。此外,它還涉及存儲系統HDFS,HIVE表,MySQL等。
5.在DataFrames中,Catalyst支持優化(催化劑優化器)。有一般庫可用于表示樹木。在四個階段中,DataFrame使用Catalyst樹轉換:
分析邏輯計劃以解決參考
邏輯計劃優化
物理規劃
7.它提供Hive兼容性。我們可以在現有的Hive倉庫上運行未修改的Hive查詢。
8.它可以從單個筆記本電腦上的千字節數據擴展到大型集群上的數PB數據。
二十四,什么是Spark數據集?
甲數據集是對象的不可變集合,那些被映射到一個關系模式。它們本質上是強類型的。
數據集API的核心有一個編碼器。該編碼器負責在JVM對象和
表格表示之間進行轉換。通過使用Spark的內部二進制格式,存儲表格表示,允許對序列化數據執行操作并提高內存利用率。它還支持為各種類型自動生成編碼器,包括基本類型(例如String,Integer,Long)和Scala案例類。它提供了許多功能轉換 (例如map,flatMap,filter)。
二十五,數據集在spark中有哪些優點?
1)靜態類型 -
使用Dataset的靜態類型功能,開發人員可以在編譯時捕獲錯誤(這節省了時間和成本)。
2)運行時安全性: -
數據集 API都表示為lambda函數和JVM類型對象,
在編譯時將檢測到任何類型參數的不匹配。此外,使用數據集時,也可以在編譯時檢測分析錯誤,
從而節省開發人員的時間和成本。
3)性能和優化
數據集API構建于Spark SQL引擎之上,它使用Catalyst生成優化的邏輯和物理查詢計劃,提供空間和速度效率。
4)處理需求,如高級表達式,過濾器,地圖,聚合,平均值,總和,
SQL查詢,列式訪問以及在半結構化數據上使用lambda函數,DataSet最好。
5)數據集提供豐富的語義,高級抽象和特定于域的API
二十六,Apache Spark中的定向非循環圖是什么?
在數學術語中,有向無環圖是具有不定向的循環的圖。DAG是一個圖表,其中包含應用于RDD的所有操作的集合。在調用任何操作時的RDD上。Spark創建DAG并將其提交給DAG調度程序。只有在構建DAG之后,Spark才會創建查詢優化計劃。DAG調度程序將運算符劃分為任務階段。階段由基于輸入數據的分區的任務組成。DAG調度程序將運營商連接在一起。
使用有向非循環圖在Spark中實現容錯。通過使用DAG,可以在Spark中進行查詢優化。因此,我們通過使用DAG獲得更好的性能。
二十七, Spark DAG需要什么?
在Spark中需要DAG
我們知道Hadoop MapReduce存在一些局限性。為了克服這些限制,Apache Software在Spark中引入了DAG 。讓我們首先研究MapReduce的計算過程。它通常分三步進行:
2.之后,我們應用Map和Reduce操作。
3.再次將計算結果寫回HDFS。
在Hadoop中,每個MapReduce操作都是相互獨立的。甚至HADOOP也不知道接下來會有哪些Map減少。因此,有時在一些迭代中讀取和寫回兩個map-reduce作業之間的立即結果是無關緊要的。結果,磁盤存儲器或穩定存儲器(HDFS)中的存儲器被浪費。
當我們談論多步驟時,所有作業從一開始就被阻止,直到完成上一個作業。因此,復雜的計算可能需要較長的時間和較小的數據量。
但是,在Spark中引入DAG之后,執行計劃已經過優化,例如,最大限度地減少了混亂數據。由于形成了連續計算級的DAG(有向無環圖)。
二十八,DAG和Lineage有什么區別?
為了更好地理解這些差異,我們將逐一討論每個主題:
譜系圖
我們知道,只要在RDD上執行一系列轉換,就不會立即評估它們,而是懶惰(懶惰評估)。當從現有RDD創建新RDD時,該新RDD包含指向父RDD的指針。同樣,RDD之間的所有依賴關系都將記錄在圖形中,而不是實際數據中。該圖稱為譜系圖。
現在來到DAG,
Apache Spark中的定向非循環圖(DAG)
DAG 是頂點和邊緣的組合。在DAG中,頂點表示RDD,邊表示要應用于RDD的操作。DAG中的每個邊緣都是從一個序列中的較早到后一個。當我們調用一個Action時,創建的DAG將被提交給DAG Scheduler,后者會進一步將圖形拆分為任務的各個階段
二十九,Apache Spark中的緩存和持久性有什么區別?
Cache和Persist都是Spark計算的優化技術。
Cache是??具有MEMORY_ONLY存儲級別的Persist的同義詞(即)使用Cache技術我們可以僅在需要時將中間結果保存在內存中。
Persist 使用存儲級別為持久性標記RDD,存儲級別可以是MEMORY,MEMORY_AND_DISK,MEMORY_ONLY_SER,MEMORY_AND_DISK_SER,DISK_ONLY,MEMORY_ONLY_2,MEMORY_AND_DISK_2
僅僅因為你可以在內存中緩存RDD并不意味著你應該盲目地這樣做。根據訪問數據集的次數以及執行此操作所涉及的工作量,通過增加的內存壓力可以更快地重新計算。
不言而喻,如果你只讀一個數據集,一旦沒有緩存它,它實際上會使你的工作變慢
三十,Apache Spark有哪些限制?
現在,Apache Spark被認為是行業廣泛使用的下一代Gen Big數據工具。但Apache Spark存在一定的局限性。他們是:
Apache Spark的局限性:
1.無文件管理系統
Apache Spark依賴于其他平臺,如Hadoop或其他基于云的平臺文件管理系統。這是Apache Spark的主要問題之一。
2.延遲
使用Apache Spark時,它具有更高的延遲。
3.不支持實時處理
在Spark Streaming中,到達的實時數據流被分成預定義間隔的批次,每批數據被視為Spark Resilient Distributed Database(RDD)。然后使用map,reduce,join等操作處理這些RDD。這些操作的結果是批量返回的。因此,它不是實時處理,但Spark接近實時數據的實時處理。微批處理在Spark Streaming中進行。
4.手動優化
手動優化是優化Spark作業所必需的。此外,它適用于特定數據集。如果我們想要在Spark中進行分區和緩存是正確的,我們需要手動控制。
少一點。算法
Spark MLlib在Tanimoto距離等許多可用算法方面落后。
6.窗口標準
Spark不支持基于記錄的窗口標準。它只有基于時間的窗口標準。
7.迭代處理
在Spark中,數據分批迭代,每次迭代都是單獨調度和執行的。
8.
當我們想要經濟高效地處理大數據時,昂貴內存容量可能成為瓶頸,因為在內存中保存數據非常昂貴。此時內存消耗非常高,并且不以用戶友好的方式處理。Spark的成本非常高,因為Apache Spark需要大量的RAM才能在內存中運行
三十一,Apache Spark的不同運行模式
我們可以用四種模式啟動spark應用程序:
1)本地模式(本地[*],本地,本地[2] ......等)
spark-shell --master local [1 ]
2)Spark Standalone集群管理器:
> spark-shell --master spark:// hduser:7077
3)紗線模式(客戶端/群集模式):
(或)
以上兩個命令都是相同的。
要在集群模式下啟動spark應用程序,我們必須使用spark-submit命令。我們不能通過spark-shell運行yarn-cluster模式,因為當我們運行spark應用程序時,驅動程序將作為部件應用程序主容器/進程運行。因此無法通過spark-shell運行集群模式。
> spark-submit --class com.df.SparkWordCount SparkWC.jar yarn-client
4)Mesos模式:
三十二,在Spark中表示數據的不同方法有哪些?
基本上,在Apache Spark中有3種不同的方式來表示數據。要么我們可以通過RDD表示它,要么我們使用DataFrames,或者我們也可以選擇DataSet來表示我們在Spark中的數據。讓我們詳細討論它們中的每一個:
RDD指的是“彈性分布式數據集”。RDD是Apache Spark的核心抽象和基礎數據結構。它是一個不可變的對象集合,可以在集群的不同節點上進行計算。我們知道RDD是不可變的,雖然我們不能對其進行任何更改,但我們可以對它們應用以下操作,如Transformation和Actions。它以容錯方式對大型集群執行內存計算。基本上,有三種方法可以在Spark中創建RDD,例如 - 穩定存儲中的數據,其他RDD,以及并行化驅動程序中已有的集合。按照此鏈接詳細了解Spark RDD。
在DataFrame中,數據組織成命名列。此表與關系數據庫中的表類似。DataFrames也是一個不可變的分布式數據集合。它允許開發人員將結構強加到分布式數據集合上,從而實現更高級別的抽象。請點擊此鏈接詳細了解Spark DataFrame。
它是DataFrame API的擴展。它提供了類型安全的,面向對象的編程接口。它利用Spark的Catalyst優化器,將數據字段和表達式公開給查詢計劃器。
三十三,什么是Spark中的日志寫入(日志記錄)?
任何Apache Spark作業中都有兩種類型的故障- 驅動程序故障或工作程序故障。
當任何工作節點發生故障時,將終止在該工作節點中運行的執行程序進程,并且在該工作節點上調度的任務將自動移動到任何其他正在運行的工作節點,并且將完成任務。
當驅動程序或主節點發生故障時,運行執行程序的所有關聯工作程序節點將與每個執行程序內存中的數據一起被終止。在從可靠和容錯的文件系統(如HDFS)讀取文件的情況下,始終保證零數據丟失,因為數據隨時可以從文件系統中讀取。通過定期以特定間隔保存應用程序數據,檢查點還可確保Spark中的容錯。
在Spark Streaming應用程序的情況下,并不總是保證零數據丟失,因為數據將被緩沖在執行程序的內存中,直到它們被處理為止。如果驅動程序失敗,則所有執行程序都將被終止,其內存中的數據將無法恢復。
為了克服這種數據丟失情況,Apache Spark 1.2中引入了寫入前向記錄(WAL)。啟用WAL后,首先在日志文件中記下操作的意圖,這樣如果驅動程序失敗并重新啟動,則該日志文件中的注釋操作可以應用于數據。對于讀取流數據的源,如Kafka或Flume,接收器將接收數據,這些數據將存儲在執行程序的內存中。啟用WAL后,這些接收的數據也將存儲在日志文件中。
可以通過執行以下操作啟用WAL:
1.使用streamingContext.checkpoint(path)設置檢查點目錄
2.通過將spark.stream.receiver.WriteAheadLog.enable設置為True來啟用WAL日志記錄
三十四,在Apache Spark中解釋催化劑查詢優化器。
pache Spark最重要的組件是Spark SQL,它處理DataFrame API和SQL查詢。在Spark SQL中,有一個名為Catalyst Query Optimizer的優化器。使用此Spark創建可擴展的查詢優化器。此查詢優化器Spark基于Scala的函數式編程構造。
需要查詢優化器:
要獲得解決方案來解決Bigdata的各種問題。
作為擴展優化器的解決方案。
我們分四個階段使用催化劑通用樹轉換框架工作
分析
邏輯優化。
物理規劃。
代碼生成。
三十五,Apache Spark中的共享變量是什么?
共享變量只不過是可以在并行操作中使用的變量。默認情況下,當Apache Spark并行運行一個函數作為不同節點上的一組任務時,它會將函數中使用的每個變量的副本發送給每個任務。有時,變量需要跨任務共享,或者在任務和驅動程序之間共享。Spark支持兩種類型的共享變量:廣播變量,可用于緩存所有節點的內存中的值; 累加器,它們是僅“添加”到的變量,例如計數器和總和。
三十六,Apache Spark如何處理累積的元數據?
由于隨機操作,元數據在驅動程序上累積。在長期工作中變得特別乏味。
要處理累積元數據的問題,有兩種選擇:
首先,設置spark.cleaner.ttl參數以觸發自動清理。但是,這將消除任何持久的RDD。
另一種解決方案是簡單地將長時間運行的作業分成批處理并將中間結果寫入磁盤。這有利于每個批次的新環境,而不必擔心元數據的建立。
三十七,什么是Apache Spark Machine學習庫?
Apache Spark中的機器學習庫
它是一個可擴展的機器學習庫,可以討論高速和高質量的算法。
為了使機器學習可擴展且簡單,創建了MLlib。有機器學習庫包括各種機器學習算法的實現。例如,聚類,回歸,分類和協同過濾。MLlib中也存在一些較低級別的機器學習原語,如通用梯度下降優化算法。
在Apache Spark Version 2.0中,基于RDD的API在spark中。MLlib包進入維護模式。在此版本中,基于DataFrame的API是Spark的主要機器學習API。因此,MLlib不會向基于RDD的API添加任何新功能。
基于 DataFrame的API是它比 RDD更加用戶友好,因此MLlib正在切換到DataFrame API。使用DataFrames的一些好處是它包括Spark數據源, Spark SQL DataFrame查詢Tungsten和 Catalyst優化,以及跨語言的統一API。這個機器學習庫也使用線性代數包Breeze。Breeze是用于數值計算和機器學習的庫的集合。
三十八,列出常用的機器學習算法。
基本上,有三種類型的機器學習算法:
(1)監督學習算法
(2)無監督學習算法
(3)強化學習算法
最常用的機器學習算法如下:
(1)線性回歸
(2)Logistic回歸
(3)決策樹
(4)K-Means
(5)KNN
(6)SVM
(7)隨機森林
(8)樸素貝葉斯
(9) 降維算法
(10)梯度升壓和Adaboos
三十九,DSM和RDD有什么區別?
在幾個特征的基礎上,RDD和DSM之間的區別是:
一世。讀
RDD -在讀操作RDD要么是粗粒度或細粒度。粗粒度意味著我們可以轉換整個數據集,但不能轉換數據集上的單個元素。雖然細粒度意味著我們可以轉換數據集上的單個元素。
DSM - 分布式共享內存中的讀取操作是細粒度的。
II。寫
RDD - RDD中的寫操作是粗粒度的。
DSM - Write操作在分布式共享系統中是細粒度的。
III。一致性
RDD - RDD的一致性是微不足道的,這意味著它本質上是不可變的。我們無法識別RDD的內容,即RDD的任何變化都是永久性的。因此,一致性水平非常高。
DSM - 系統保證如果程序員遵守規則,內存將保持一致。此外,內存操作的結果將是可預測的。
IV。故障恢復機制
RDD - 通過隨時使用沿襲圖,可以在Spark RDD中輕松恢復丟失的數據。因此,對于每次轉換,形成新的RDD。由于RDD本質上是不可變的,因此很容易恢復。
DSM - 通過檢查點技術實現容錯,該技術允許應用程序回滾到最近的檢查點而不是重新啟動。
v。斯特拉格勒減災
總的來說,Stragglers是那些比同齡人需要更多時間才能完成的人。這可能是由于許多原因造成的,例如負載不平衡,I / O塊,垃圾收集等。
落后者的問題是當并行計算之后是同步,例如減少導致所有并行任務等待其他人。
RDD - 可以通過在RDD中使用備份任務來緩解落后者。
DSM - 實現落后緩解,非常困難。
六。行為如果沒有足夠的RAM
RDD - 由于沒有足夠的空間將RDD存儲在RAM中,因此RDD會轉移到磁盤。
DSM - 如果RAM用完存儲,性能會降低,在這種類型的系統中
四十,列出Apache Spark中Parquet文件的優點
Parquet是Hadoop的開源文件格式。與傳統方法相比,Parquet以扁平柱狀格式存儲嵌套數據結構,其中數據以行面向方式存儲,鑲木地板在存儲和性能方面更有效。
柱狀格式有幾個優點:
1)按列進行組織可以實現更好的壓縮,因為數據更加均勻。在Hadoop集群的規模上,節省的空間非常明顯。
2)I / O將減少,因為我們可以在讀取數據時有效地僅掃描列的子集。更好的壓縮還可以減少讀取輸入所需的帶寬。
3)當我們在每列中存儲相同類型的數據時,我們可以通過使指令分支更可預測來使用更適合現代處理器管道的編碼
四十一,什么是Spark的懶惰評估?
簡介
延遲評估意味著在觸發操作之前不會啟動執行。轉換本質上是懶惰的,即當我們在RDD上調用某些操作時,它不會立即執行。Spark將它們添加到DAG計算中,并且只有當驅動程序請求某些數據時,才會執行此DAG
懶惰評估的優點。
1)這是一種優化技術,即它通過減少查詢數量來提供優化。
2)它節省了驅動程序和集群之間的往返,從而加快了進程
四十二, Spark懶惰評估的好處是什么?
Apache Spark使用延遲評估以獲得好處:
1)對RDD應用轉換操作或“將數據加載到RDD”不會立即執行,直到它看到一個動作。對RDD的轉換和在RDD中存儲數據進行了懶惰的評估。如果Spark使用惰性評估,將以更好的方式利用資源。
2)Spark使用延遲評估來減少通過將操作分組在一起而必須接管的數據。在MapReduce的情況下,用戶/開發人員必須花費大量時間來將操作組合在一起,以便最小化MapReduce傳遞的數量。在spark中,編寫單個復雜映射而不是將許多簡單操作鏈接在一起沒有任何好處。用戶可以將他們的火花程序組織成較小的操作。通過使用延遲評估,Spark將非常有效地管理所有操作
3)延遲評估有助于優化Spark中的磁盤和內存使用。
4)一般來說,在對數據進行計算時,我們必須考慮兩個方面,即空間和時間的復雜性。使用火花懶惰評估,我們可以克服兩者。僅在需要數據時才會觸發操作。它減少了開銷。
5)它還節省了計算量并提高了速度。延遲評估將在節省計算開銷方面發揮關鍵作用。
只計算必要的值而不是整個數據集(它全部取決于操作操作,也很少
轉換)
四十三,Apache火花比Hadoop快多少?
當數據適合內存時, Apache Spark工作得更快,Spark處理內存中的數據,這使得處理速度更快,而 MapReduce在處理后將數據推送到磁盤。使用 DAG有助于進行大量優化,它可以在一個階段中優化和進行計算,并且還可以避免不必要的減速器任務。Spark可以在內存中緩存部分或完整數據,從而避免大量磁盤I / O. 據說商業Spark比 Hadoop快100倍
四十四,通過YARN啟動Apache Spark有哪些方法?
Apache Spark有兩種在YARN上運行應用程序的模式:集群和客戶端
spark-submit或spark-shell --master yarn-cluster或--master yarn-client
四十五。.解釋Apache Spark中的各種集群管理器?
Apache Spark是一種可以在群集上以分布式模式運行的大型數據處理引擎。Spark應用程序作為集群上的獨立進程集運行,所有這些都由中央協調器協調。這個中央協調器可以連接三個不同的集群管理器,Spark的Standalone,Apache Mesos和Hadoop YARN。
在群集上以分布式模式運行應用程序時,Spark使用主/從體系結構和中央協調器,也稱為驅動程序
此驅動程序進程負責將用戶應用程序轉換為稱為任務的較小執行單元。然后,這些任務由執行程序執行,執行程序是運行各個任務的工作進程。
Spark Standalone
Spark Standalone集群管理器是一個簡單的集群管理器,可作為Spark發行版的一部分。它具有主服務器的HA,對工作人員故障具有彈性,具有管理每個應用程序資源的功能,并且可以與現有Hadoop部署一起運行并訪問HDFS(Hadoop分布式文件系統)數據。該分發包括腳本,以便在Amazon EC2上本地或在云中輕松部署。它可以在Linux,Windows或Mac OSX上運行。
Apache Mesos
Mesos通過動態資源共享和隔離來處理分布式環境中的工作負載。在大規模集群環境中部署和管理應用程序是健康的Mesos許多物理資源都是俱樂部成為單個虛擬資源Apache Mesos的三個組件是Mesos master,Mesos slave,Frameworks。
Mesos Master是群集的一個實例。群集具有許多提供容錯的Mesos主服務器。從屬是Mesos實例,為群集提供資源。Mesos Framework允許應用程序從集群請求資源
YARN> / strong>
YARN數據計算框架是ResourceManager,Nodemanager的組合。
資源管理器 - 管理系統中所有應用程序之間的資源。在資源管理器具有調度器和應用程序管理器。
Scheduler將資源分配給各種正在運行的應用程序。它是純調度程序,執行應用程序狀態的監視或跟蹤。
Application Manager管理所有節點上的應用程序。
紗線節點管理器包含應用程序主和容器。容器是一個工作單元發生的地方。Application Master是一個特定于框架的庫。它旨在協調資源管理器中的資源。它繼續使用節點管理器來執行和觀察任務。
四十六,什么是Apache Spark中的推測執行?
在投機性任務在Apache的火花是驗證任務推測,這意味著運行速度比成功完成任務的任務表中位數較慢的任務任務的運行速度比在job.It任務的其余部分慢是健康檢查過程。這些任務被提交給另一名工人。它并行運行新副本,而不是關閉慢速任務。
在集群部署模式,線程開始為TaskSchedulerImp1 與啟用spark.speculation 。它在初始spark.speculation.interval通過后定期執行每個spark.speculation.interval
四十七,.使用Apache Spark時,如何最大限度地減少數據傳輸?
在Spark中,可以通過避免導致數據混洗的操作來減少數據傳輸。
避免重新分區和合并,ByBey操作(如groupByKey和reduceByKey)以及聯合操作(如cogroup和join)之類的操作。
Spark Shared Variables有助于減少數據傳輸。共享變量有兩種類型 - 廣播變量和累加器。
廣播變量:
如果我們有一個大型數據集,而不是為每個任務傳輸數據集的副本,我們可以使用一個廣播變量,該變量可以一次復制到每個節點,
并為該節點中的每個任務共享相同的數據。廣播變量有助于為每個節點提供大型數據集。
首先,我們需要使用SparkContext.broadcast創建一個廣播變量,然后將其廣播到驅動程序的所有節點。值方法
可用于訪問共享值。僅當多個階段的任務使用相同數據時,才會使用廣播變量。
累加器:
Spark函數使用驅動程序中定義的變量,并生成變量的本地復制。累加器是共享變量,有助于
在執行期間并行更新變量,并將工作者的結果共享給驅動程序。
四十八。 Apache Spark超越Hadoop的情況是什么?
我們可以比較下面區域的Hadoop和Spark:
存儲
計算
計算速度
資源
與Hadoop相比,Spark的主要優勢在于其計算速度.Spark具有:
閃電般快速的集群計算。
Apache Spark是一種用于大規模數據處理的快速通用引擎。
這個優點是因為RDD是火花的基本抽象。
除此之外,Spark架構和Spark執行引擎是Apache Spark與Hadoop相比速度更快的兩個原因。
Hadoop是批處理的理想選擇,而Spark可以進行批處理以及迭代,交互式流處理。
四十九。什么是動作,它如何在apache spark中處理數據
動作返回RDD計算/操作的最終結果。它使用沿襲圖觸發執行以將數據加載到原始RDD中,并執行所有中間轉換并將最終結果返回給Driver程序或將其寫出到文件系統。
例如:首先,take,reduce,collect,count,aggregate是spark中的一些動作。
Action會將值返回給Apache Spark驅動程序。它可能會觸發先前構造的,懶惰的RDD進行評估。這是一個生成非RDD值的RDD操作。Action函數實現Spark程序中的值。所以基本上一個動作是RDD操作,它返回任何類型的值,但RDD [T]是一個動作。操作是從執行程序向驅動程序發送數據的兩種方法之一(另一種是累加器)
五十,如何在Apache Spark中實現容錯?
Apache Spark中容錯的基本語義是,所有Spark RDD都是不可變的。它通過在DAG中創建的沿襲圖表記住操作中涉及的每個RDD之間的依賴關系,并且在任何失敗的情況下,Spark指的是應用相同操作來執行任務的沿襲圖。
有兩種類型的故障 - 工作者或驅動程序故障。如果工作程序失敗,該工作節點中的執行程序將與其內存中的數據一起被終止。使用沿襲圖,這些任務將在任何其他工作節點中完成。數據也會復制到其他工作節點以實現容錯。有兩種情況:
2.已接收但尚未復制的數據 - 從源接收數據但緩沖以進行復制。如果發生任何故障,則需要從源檢索數據。
對于基于接收器的流輸入,容錯基于接收器的類型:
可靠的接收器 - 一旦接收和復制數據,就會向源發送確認。如果接收器發生故障,源將不會收到對接收數據的確認。當接收器重新啟動時,源將重新發送數據以實現容錯。
不可靠的接收器 - 接收的數據將不會被確認。在這種情況下,如果發生任何故障,源將不知道數據是否已被接收,并且它將不會重新發送數據,因此會丟失數據。
為了克服這種數據丟失情況,Apache Spark 1.2中引入了寫入前向記錄(WAL)。啟用WAL后,首先在日志文件中記下操作的意圖,這樣如果驅動程序失敗并重新啟動,則該日志文件中的注釋操作可以應用于數據。對于讀取流數據的源,如Kafka或Flume,接收器將接收數據,這些數據將存儲在執行程序的內存中。啟用WAL后,這些接收的數據也將存儲在日志文件中。
可以通過執行以下操作啟用WAL:
使用streamingContext.checkpoint(path)設置檢查點目錄
通過將spark.stream.receiver.WriteAheadLog.enable設置為True來啟用WAL日志記錄
希望大家多多關注,明天更新下半部。
有什么問題可以加群,里面有大數據的學習資料哦! 群號:871056591
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。