Spark編程指南入門之Java篇一-基本知識

1. Spark的Java開發包

Spark提供Java的開發包,當前最新版本是2.0.2版本:spark-core_2.11-2.0.2.jar,可以從下面鏈接下載:

http://central.maven.org/maven2/org/apache/spark/spark-core_2.11/2.0.2/spark-core_2.11-2.0.2.jar

或者通過Maven配置:

<dependency>
    <groupId>org.apache.spark</groupId>
	<artifactId>spark-core_2.11</artifactId>
	<version>2.0.2</version>
</dependency>

* Spark 2.0.2版本需要Java 7或以上,本文使用Java 1.8.0_72版本

2. 初始化Spark

要使用Spark,第一步必須創建JavaSparkContext對象:

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

public class HelloSpark {
	
	public static void main(String[] args) {
		SparkConf conf = new SparkConf().setMaster("local").setAppName("HelloSpark");
		try (JavaSparkContext jsc = new JavaSparkContext(conf)) {
			// do something here
		}
	}

}

上述代碼通過SparkConf創建JavaSparkContext,SparkConf默認去讀取Spark.*的配置文件,也可以通過調用set的方法配置屬性,例如上述的setMaster和setAppName。通過set方法配置的屬性會覆蓋讀取的配置文件屬性,SparkConf裏面的所有set方法都支持鏈式調用chaining,例如上述的setMaster("local").setAppName("HelloSpark")。

* 上述代碼使用了Java 7的try-with-resources語句,用於自動關閉JavaSparkContext
* setAppName:設置應用名字,此名字會在Spark web UI顯示
* setMaster:設置主節點URL,本例使用“local”是指本機單線程,另外還有以下選項:

local[K]:本機K線程
local[*]:本機多線程,線程數與服務器核數相同
spark://HOST:PORT:Spark集羣地址和端口,默認端口爲7077
mesos://HOST:PORT:Mesos集羣地址和端口,默認端口爲5050
yarn:YARN集羣

詳細請參考以下鏈接:

http://spark.apache.org/docs/latest/submitting-applications.html#master-urls

3. 彈性分佈式數據集Resilient Distributed Datasets(RDDs)

Spark使用了一個叫彈性分佈式數據集resilient distributed dataset(RDD),它是支持並行操作的容錯性元素集合。RDD可以通過2種方式創建:

- 並行化一個存在的集合
- 引用外部存儲系統(例如共享文件系統、HDFS、HBase或者任何支持Hadoop InputFormat的數據源)的數據集

3.1 並行集合Parallelized Collections

並行集合Parallelized Collections可以通過調用JavaSparkContext的parallelize方法創建,例如:

import java.util.Arrays;
import java.util.List;

List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
// jsc是上述代碼已經創建的JavaSparkContext實例
JavaRDD<Integer> distData = jsc.parallelize(data);

上述JavaRDD一旦被創建,它就可以被並行操作,例如調用reduce方法計算集合裏面所有元素的總和:

distData.reduce((a, b) -> a + b)

* 上述代碼使用Java 8的lambda語法(這裏不做介紹),在Java 8之前,上述代碼可以使用下面代碼實現:

import org.apache.spark.api.java.function.Function2;

distData.reduce(new Function2<Integer, Integer, Integer>() {
			
	private static final long serialVersionUID = 1L;

	@Override
	public Integer call(Integer a, Integer b) throws Exception {
		return a + b;
	}
	
});

並行集合的一個重要參數是用於分佈數據集的分區數量,Spark會對每一個數據分區執行一個任務,通常地,每一個CPU可以處理2到4個分區。一般地,Spark會基於集羣的資源情況自動設定分區數量,不過也可以使用parallelize的第二個參數自定義,例如jsc.parallelize(data, 5),這樣的話,數據就會被分爲5個分區,Spark可以並行處理這5個分區,提高處理效率。

3.2 外部數據集External Datasets

上面提過,Spark可以從任何支持Hadoop InputFormat的數據源創建分佈式數據集,包括本地文件系統,HDFS,Cassandra, HBase, Amazon S3等等,Spark支持文本文件,序列化文件和其它Hadoop InputFormat。例如,以下代碼通過調用SparkContext的textFile方法讀取本地文件系統創建一個文本格式的RDD:

JavaRDD<String> distFile = sc.textFile("data.txt");

* HDFS的路徑是以hdfs://開頭,Amazon S3的路徑是以s3://開頭

3.3 Spark讀取文件的一些注意事項


- 如果路徑是本地的文件系統路徑,那麼這個路徑必須能夠被在所有工作節點的同樣路徑訪問,你可以把文件複製到所有工作節點的對應路徑或者使用共享文件系統

- 所有基於文件輸入的Spark方法,包括textFile,路徑可以是目錄,壓縮文件和通配符。例如,textFile("/my/directory"), textFile("/my/directory/*.txt"), and textFile("/my/directory/*.gz")

- textFile方法的第二個參數是可選的,用於控制文件的分區數量。Spark默認對文件的每一個block都創建一個分區(HDFS的默認block大小是64MB),通過設置該參數可以修改文件的分區數量,但是分區數量不能少於block的數量

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