1. 程式人生 > >《Spark 官方文件》在Amazon EC2上執行Spark

《Spark 官方文件》在Amazon EC2上執行Spark

在Amazon EC2上執行Spark

Spark的ec2目錄下有一個spark-ec2指令碼,可以幫助你在Amazon EC2上啟動、管理、關閉Spark叢集。該指令碼能在EC2叢集上自動設定好Spark和HDFS。本文將會詳細描述如何利用spark-ec2指令碼來啟動和關閉叢集,以及如何在叢集提交作業。當然,首先你必須在Amazon Web Services site上註冊一個EC2的賬戶。

spark-ec2可以管理多個命名叢集。你可以用它來啟動一個新叢集(需要提供叢集大小和叢集名稱),關閉一個已有的叢集,或者登陸到一個叢集。每一個叢集的機器將會被劃分到不同的EC2安全組(EC2 security groups)當中,而這些安全組的名字是由叢集的名稱派生而來。例如,對於一個命名為test的叢集,其主節點(master)將被分到一個叫test-master的安全組,而其他從節點(slave)將被分配到test-slaves安全組。spark-ec2指令碼會自動根據你提供的叢集名稱,來建立安全組。你可以在EC2的控制檯(Amazon EC2 Console)中使用這些名字。

準備工作

  • 首先,你需要建立Amazon EC2 key pair 。這需要登陸Amazon Web Services賬號,在AWS控制檯(AWS console)上點選側邊欄上的Key Pairs來建立,並下載。同時,你要確保給這私匙檔案附上600許可權(即:可讀可寫)以便使用ssh登陸。
  • 使用spark-ec2的時候,一定要設定好這兩個環境變數, AWS_ACCESS_KEY_ID 和AWS_SECRET_ACCESS_KEY,並使其指向你的Amazon EC2 access key ID 和 secret access key。這些都可以在AWS主頁(AWS homepage)上,點選 Account > Security Credentials > Access Credentials獲得。

啟動叢集

  • 切換到你下載的spark的ec2目錄下
  • 執行命令./spark-ec2 -k <keypair> -i <key-file> -s <num-slaves> launch <cluster-name>,其中<keypair>是你的Amazon EC2 key pair的名字(你建立Amazon EC2 key pair的時候所指定的名字),<key-file>是Amazon EC2 key pair的私鑰(private key)檔案,<num-slaves>是slave節點個數(至少是1),<cluster-name>是你指定的叢集名稱。

例如:

bash export AWS_SECRET_ACCESS_KEY=AaBbCcDdEeFGgHhIiJjKkLlMmNnOoPpQqRrSsTtU \
export AWS_ACCESS_KEY_ID=ABCDEFG1234567890123

./spark-ec2 --key-pair=awskey \
--identity-file=awskey.pem \
--region=us-west-1 \
--zone=us-west-1a \
launch my-spark-cluster
  • 叢集啟動完成後,檢查一下叢集排程器是否啟動,同時,你可以在Web UI上檢視是否所有的slave節點都正確的展示出來了,Web UI的連結在指令碼執行完以後會列印在螢幕上(通常這個連結是 http://<master-hostname>:8080)

你可以執行./spark-ec2 –help 來檢視更多的選項。以下是比較重要的一些選項:

  • –instance-type=<instance-type> 可以指定EC2機器的例項型別。目前,該指令碼只支援64-bit的例項型別。
  • –region=<ec2-region>可以指定EC2叢集部署於哪個地域,預設地域是 us-east-1。
  • –zone=<ec2-zone>可以指定EC2叢集例項部署在哪些地區(EC2的可用地區)。指定這個引數時注意,有時候因為在某些地區可能出現容量不夠,因此你可能需要在其他地區啟動EC2叢集。
  • –ebs-vol-size=<GB>可以在每個節點上附加一個EBS(彈性可持續儲存)卷,並指定其總容量,這些儲存時可持久化的,即使叢集重啟也不會丟失。
  • –spot-price=<price> 將啟動競價型例項(Spot Instances)工作節點,這些節點可以按需分配,可競價,並且可以設定競價最高價格(以美元計)。
  • –spark-version=<version> 可以在叢集中預先載入指定版本的spark。<version>可以是一個版本號(如:0.7.3)或者是一個git hash值。預設會使用最新版本的spark。
  • –spark-git-repo=<repository url> 可以指定一個自定義的git庫,從而下載並部署該git庫中特定的spark構建版本。預設使用Apache Github mirror 。如果同時指定了spark版本,那麼–spark-version引數值不能使用版本號,而必須是一個git提交對應的git commit hash(如:317e114)。
  • 如果啟動過程中由於某些原因失敗了(如:沒有給private key檔案設定正確的檔案許可權),你可以用–resume選項來重啟並繼續已有叢集的部署過程。

在VPC(Amazon Virtual Private Cloud)上啟動叢集

  • 執行 ./spark-ec2 -k <keypair> -i <key-file> -s <num-slaves> –vpc-id=<vpc-id> -subnet-id=<subnet-id> launch <cluster-name>,其中,<keypair>是你的EC2 key pair(之前已經建立的),<key-file>是key pair中的私鑰檔案,<num-slaves> 是從節點個數(如果你是第一次用,可以先設成1),<vpc-id> 是VPC的名稱,<subnet-id> 是你的子網名稱,最後<cluster-name>是你的叢集名稱。

例如:

bash export AWS_SECRET_ACCESS_KEY=AaBbCcDdEeFGgHhIiJjKkLlMmNnOoPpQqRrSsTtU \
export AWS_ACCESS_KEY_ID=ABCDEFG1234567890123 

./spark-ec2 --key-pair=awskey \
--identity-file=awskey.pem \
--region=us-west-1 \
--zone=us-west-1a \
--vpc-id=vpc-a28d24c7 \
--subnet-id=subnet-4eb27b39 \
--spark-version=1.1.0 \
launch my-spark-cluster

執行應用

  • 轉到你下載的spark的ec2目錄下
  • 執行 ./spark-ec2 -k <keypair> -i <key-file> login <cluster-name> 遠端登入到你的EC2叢集,其中,<keypair> 和<key-file> 的說明見本文上面(這裡只是為了方便說明,你也可以使用EC2的控制檯)
  • 如果需要把程式碼或資料部署到EC2叢集中,你可以在登入後,使用指令碼 ~/spark-ec2/copy-dir,並指定一個需要RSYNC同步到所有從節點(slave)上的目錄。
  • 如果你的應用需要訪問一個很大的資料集,最快的方式就是從Amazon S3或者Amazon EBS裝置上載入這些資料,然後放到你叢集中的HDFS上。spark-ec2指令碼已經為你設定好了一個HDFS,其安裝目錄為/root/ephemeral-hdfs,並且可以使用該目錄下的bin/hadoop指令碼訪問。需要特別注意的是,這個HDFS上的資料,在叢集停止或重啟後,會被自動刪掉。
  • 叢集中也有可以持久的HDFS,其安裝路徑為/root/persistent-hdfs,這個HDFS儲存的資料即使叢集重啟也不會丟失。但一般情況下,這個HDFS在每個節點上可使用的空間較少(約為3GB),你可以用spark-ec2的選項–ebs-vol-size來指定每個節點上持久化HDFS所使用的空間大小。
  • 最後,如果你的應用出錯,你可以看看改應用在slave節點的日誌,日誌位於排程器工作目錄下(/root/spark/work)。當然,你也可以通過web UI(http://<master-hostname>:8080)檢視一下叢集狀態。

配置

你可以編輯每個節點上的/root/spark/conf/spark-env.sh檔案來設定Spark配置選項(如:JVM選項引數)。這個檔案一旦更改,你必須將其複製到叢集中所有節點上。最簡單的方式仍然是使用 copy-dir 這個指令碼。首先,編輯主節點(master)上的spark-env.sh檔案,然後,執行 ~/spark-ec2/copy-dir  /root/spark/conf 將conf目錄RSYNC到所有工作節點上。

終止叢集

請注意,如果EC2節點被關閉後,是沒有辦法恢復其資料的!所以,請務必確保在關閉節點之前,將所有重要的資料複製出來,備份好。

  • 切換到spark下的ec2目錄
  • 執行命令 ./spark-ec2 destroy <cluster-name>

暫停和重啟叢集

spark-ec2指令碼同樣支援暫停叢集。這種情況下,叢集例項所使用的虛擬機器都是被停止,但不會銷燬,所以虛擬機器上臨時盤資料都會丟失,但root分割槽以及持久HDFS(persistent-hdfs)上的資料不會丟失。停止機器例項不會多花EC2週期(意味著不用為機器例項付費),但會持續EBS儲存的計費。

  • 要停止一個叢集,你需要切到ec2目錄下,執行 ./spark-ec2 –region=<ec2-region> stop <cluster-name>
  • 如果過後又要重啟,請執行 ./spark-ec2 -i <key-file> –region=<ec2-region> start <cluster-name>
  • 如果需要最終銷燬這個叢集,並且不再佔用EBS儲存空間,需要執行 ./spark-ec2 –region=<ec2-region> destroy <cluster-name>(如前一小節所述)

限制

  • 對“叢集計算”的支援有個限制 – 無法指定一個區域性群組。不過,你可以在<cluster-name>-slaves群組中手工啟動一些slave節點,然後用 spark-ec2 launch –resume 這個命令將手工啟動的節點組成一個叢集。

如果你發現一些新的限制或者有什麼建議,歡迎貢獻(contribute)到社群。

訪問S3上的資料

Spark檔案介面允許你通過相同的URI格式訪問所有在Amazon S3上的資料,當然這些資料格式必須是Hadoop所支援的。你可以通過這種URI格式指定S3路徑 s3n://<bucket>/path。在啟動Spark叢集的時候,可以使用選項–copy-aws-credentials來指定訪問S3的AWS證書。更完整的訪問S3所需的Hadoop庫可以在這裡檢視 Hadoop S3 page.

另外,訪問S3的時候,你不僅可以將單個檔案路徑作為輸入,同時也可以將整個目錄路徑作為輸入。