Spark介紹,安裝

1.簡單介紹和安裝:

(1)Spark使用scala編寫,運行在JVM(java虛擬機)上。所以,安裝Spark需要先安裝JDK。安裝好java後,到官網下載安裝包(壓縮文件):http://spark.apache.org/downloads.html ,當前使用的版本是:spark-1.6.1-bin-hadoop2.4.tgz。

(2)解壓,查看目錄內容:

tar -zxvf spark-1.6.1-bin-hadoop2.4.tgz
cd spark-1.6.1-bin-hadoop2.4

這樣我們可以在單機模式下運行Spark了,Spark也可以運行在Mesos、YARN等上。


2.Spark交互式shell:

(1) Spark只支持Scala和Python兩種Shell。爲了對Spark Shell有個感性的認識,我們可以follow官網的quick-start教程:http://spark.apache.org/docs/latest/quick-start.html

首先啓動Spark shell,Scala和Python有2種不同啓動方式(下面,我們以Scala爲例介紹):

Scala:

./bin/spark-shell

scala啓動shell參數:

./bin/spark-shell --name "axx" --conf spark.cores.max=5 --conf spark.ui.port=4041

Python:

./bin/pyspark

啓動後有如下界面:

wKioL1fHwgazekPdAAIh682S4Uk397.png-wh_50

如果需要修改顯示的日誌級別,修改$SPARK_HOME/conf/log4j.properties文件。

(2)Spark中第一個重要名詞:RDD(Resilient Distributed Dataset),彈性分佈式數據集

在Spark中,使用RDD來進行分佈式計算。RDD是Spark對於分佈數據和分佈計算的基本抽象。


RDD包括兩類操作,actions 和 transformations;

行動操作(actions):會產生新的值。會對RDD計算出一個結果,並把結果返回到驅動器程序中(例如shell命令行中,我們輸入一個計算指令,spark爲我們返回的結果值),或把結果存儲到外部存儲系統(如HDFS)中(我們在後邊還會看到rdd.saveAsTextFile())。

轉化操作(transformations):會產生一個新的RDD。

val lines = sc.textFile("file:///spark/spark/README.md")

通過讀取文件的方式來定義一個RDD。默認地,textFile會讀取HDFS上的文件,加上file://指定讀取本地路徑的文件。

lines.count()
lines.first()

上邊是2個actions操作,分別返回RDD的行數和第一行數據。

val linesWithSpark = lines.filter(line=>lines.contains("spark"))

上邊是一個transformations操作,生成一個新的RDD,該RDD是lines的一個子集,只返回包含spark的行。


3.Spark核心概念:

每個Spark應用都包含一個驅動程序,該驅動程序在集羣中執行並行計算。在前面的事例中,驅動程序就是spark shell本身。驅動程序通過SparkContext對象(對計算集羣的一個連接)來訪問Spark。

爲了運行RDD操作,驅動程序會管理一些叫做執行器的節點。當在分佈式系統中運行時,架構圖如下:

wKiom1fICEazHWfyAAEJURdhEKg479.png-wh_50


4.獨立應用:

除了在shell中運行,還可以運行獨立應用。與Spark Shell主要區別是,當開發獨立應用時,你需要自己初始化SparkContext。


4.1 初始化SparkContext

首先,需要創建SparkConf對象來配置應用,然後通過SparkConf來創建SparkContext。初始化SparkContext對象:

SparkConf conf = new SparkConf().setAppName("wc_ms");
JavaSparkContext sc = new JavaSparkContext(conf);

setAppName可以設置這個獨立應用的名稱,後期我們可以在WebUI上監控這個應用。


4.2 開發WordCount程序:

通過Maven構建Spark程序,pom只需要引入一個依賴(根據具體的Spark版本而定):

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.10 -->
	<dependency>
	    <groupId>org.apache.spark</groupId>
	    <artifactId>spark-core_2.10</artifactId>
	    <version>1.6.1</version>
	</dependency>

WordCount.java

package com.vip.SparkTest;

import java.util.Arrays;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;

import scala.Tuple2;


public class WordCount {
	public static void main(String[] args) {
		
		String inputfile = args[0];
		String outputfile = args[1];
		
		//得到SparkContext
		SparkConf conf = new SparkConf().setAppName("wc_ms");
		JavaSparkContext sc = new JavaSparkContext(conf);
		
		//加載文件到RDD
		JavaRDD<String> input = sc.textFile(inputfile);
		
		//flatMap方法,來自接口JavaRDDLike,JavaRDD繼承接口JavaRDDLike。
		//將文件拆分成一個個單詞(通過空格分開);transformation操作,生成一個新的RDD。
		JavaRDD<String> words = input.flatMap(
				new FlatMapFunction<String,String>()
				{
					@Override
					public Iterable<String> call(String content) throws Exception {
						// TODO Auto-generated method stub
						return Arrays.asList(content.split(" "));
					}
				}
			);
		//先轉換成元組(key-value),word - 1  word2 - 1;
		//再Reduce彙總計算
		JavaPairRDD<String,Integer> counts = words.mapToPair(
				new PairFunction<String,String,Integer>(){
					@Override
					public Tuple2<String, Integer> call(String arg0) throws Exception {
						// TODO Auto-generated method stub
						return new Tuple2<String, Integer>(arg0,1);
					}
				}	
			).reduceByKey(
					new Function2<Integer,Integer,Integer>(){
						@Override
						public Integer call(Integer x, Integer y) throws Exception {
							// TODO Auto-generated method stub
							return x+y;
						}
					}
					)
				;			
		counts.saveAsTextFile(outputfile);		
		sc.close();
	}

}

上邊對應的步驟做了註釋。


4.3 發佈應用到Spark(單機或者集羣):

(1)首先,要將開發好的程序打包:

mvn package

得到jar包:SparkTest-0.0.1-SNAPSHOT.jar

(2)將相關文件上傳到服務器上:

將要做count的文本文件、jar文件上傳服務器。

(3)使用spark-submit啓動應用:

$SPARK_HOME/bin/spark-submit \
--class "com.vip.SparkTest.WordCount" \
--master local \
./SparkTest-0.0.1-SNAPSHOT.jar "輸入目錄" "輸出目錄"

說明: --class 指定程序的主類;

    --master 指定Spark的URL,因爲是在本機,所以指定了local

    輸入目錄:包含所有輸入的文本文件(可能是一個或多個文件)。

    輸出目錄:這塊要特別注意,首先這是一個目錄,不能是文件;再次這個目錄不能事先創建,否則報錯。

(4) 運行結果:

最後執行成功後,生成了2個文件:

part-00000  _SUCCESS

part-00000文件內容:

wKioL1fJV1bj-jCCAABPVvxaWI4304.png-wh_50

至此,我們的wordcount程序結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章