2017-06-13 87 views
0
JavaRDD<String> textFile = sc.textFile("C://test.txt"); 

說我有1000行test.txt文件。我有一個四核處理器的單機版。這裏是我的理解火花如何實現並行性在這裏Spark在這種情況下如何工作?

  1. Spark將從單個線程中的文件讀取字符塊。不確定是否有默認的塊大小或取決於文件大小
  2. Spark將根據以下兩個參數確定要創建多少個分區 a)在步驟1中讀取的數據大小和 b)基於數字cpu中的核心數
  3. 根據步驟2中的分區大小,它會產生線程。如果有3個分區,它會產生三個線程。

我的理解是否正確?

+0

中實現,根據我的知識,Spark默認將分區等同於文本文件塊的數量。我們可以通過給出 (文件路徑,分區數量)手動定義分區 – user4342532

+0

您可以詳細說明文件中塊的含義是什麼嗎?你的意思是有1000行,spark會將它分成4塊,然後創建4個分區,然後在同一臺機器上創建4個線程,否則發送給4個工作者。這樣對嗎 ? –

+0

在Hadoop中,默認塊大小爲64 MB(apache distribution,如果cloudera爲128mb)如果你的文件大小是假設爲256mb。其默認存儲爲4個塊(4 * 64 mb)。 Spark默認將每個塊作爲每個分區,並且我們可以管理它們。 – user4342532

回答

1

在本地文件的情況下,火花將分割文件,其中n是默認的並行級和等於簇中的核心數量的n塊(例如:在local[4]情況下,這將是4) 。

我們可以提供多個分區覆蓋該行爲:

textFile = sc.textFile("C://test.txt", 8) // will create 8 spark partitions. 

我們可以檢查分區:

textFile.partitions() 
//Array[org.apache.spark.Partition] =  Array(
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected] 
) 

注意,這是底層的Hadoop文件系統實現的行爲。對於分佈式文件系統(如hdfs),Spark將使用所使用文件的分區級別。 Spark和Hadoop之間的交互在 https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/HadoopRDD.scala

+0

如果我假設n爲4,則意味着火花會將它劃分爲每行250行的4個塊。對 ?你也可以詳細說明'注意這是底層hadoop文件系統實現的行爲。對於分佈式文件系統,如hdfs,Spark將使用所使用文件的分區級別?基於系統的文件或HDFS是否有其自己的分區級別?帶有'sc.textFile(「C://test.txt」,8)的' –

+0

'文件將被分成8個塊,如果一個機器中有8個內核,每個內核可以處理一個塊。對 ? –

+0

@scottmiles在數據操作可並行化的情況下,這確實是期望值。 – maasg

相關問題