今天先簡單說說如何搭建Spark的運(yùn)行環(huán)境以及運(yùn)行一個(gè)簡單的例子坑傅。我把例子放到了Github上掰伸,也方便下載站辉。
https://github.com/githubdominic/spark-hello-world.git
Spark提供了多語言的接口,Scala兑巾,Java条获,Python等,本文以Java為例帅掘。
?
Java環(huán)境搭建
我的運(yùn)行環(huán)境是:
Macbook Pro macOS Mojave 10.14.3;2.7GHz Intel Core i5, RAM 8GB
Java 1.8
Eclipse IDE for Enterprise Java Developers. Version: 2018-12 (4.10.0)
第一步:在Eclipse中創(chuàng)建Maven工程
?
圖1 創(chuàng)建Maven工程
第二步:填寫項(xiàng)目的信息
?
圖2 基本信息
?
圖3 選擇Archetype
?
圖4 填寫Group id和Artifact id
第三步:點(diǎn)擊項(xiàng)目運(yùn)行,可以打印出'Hello World'表示Java環(huán)境已經(jīng)搭建好
?
圖5 可以正常運(yùn)行Hello World
Spark下載配置
在Spark官網(wǎng)下載Spark:https://spark.apache.org/downloads.html
?
圖6 Spark下載頁面
將下載的Spark放到本地目錄蜈首,在Eclipose Project->Properties->Java Build Path->Libraries->Add External JARs將?Spark目錄下的jars目錄下的jar包都添加進(jìn)項(xiàng)目吆寨。例如我電腦里jar文件放在目錄spark-2.4.0-bin-hadoop2.7?/jars/*
?
圖7 設(shè)置項(xiàng)目屬性
?
圖8 添加Spark jar包引用
使用Spark計(jì)算Pi
下面編輯App.java,使用蒙特卡羅(Monte Carlo)算法計(jì)算Pi的近似值掷贾。這種方法是一種利用計(jì)算機(jī)隨機(jī)數(shù)的功能基于“隨機(jī)數(shù)”的算法,通過計(jì)算落在單位圓內(nèi)的點(diǎn)與落在正方形內(nèi)的點(diǎn)的比值求Pi港准。
package spark.spark_hello_world;
/**
* Hello Spark!
*
*/
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import java.util.ArrayList;
import java.util.List;
/**
* Computes an approximation to pi
* Usage: JavaSparkPi [partitions]
*/
public final class App {
public static void main(String[] args) throws Exception {
SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi").setMaster("local");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
int slices = (args.length == 1) ? Integer.parseInt(args[0]) : 2;
int n = 100000 * slices;
List<Integer> l = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
l.add(i);
}
JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);
int count = dataSet.map(integer -> {
double x = Math.random() * 2 - 1;
double y = Math.random() * 2 - 1;
return (x * x + y * y <= 1) ? 1 : 0;
}).reduce((integer, integer2) -> integer + integer2);
System.out.println("Pi is roughly " + 4.0 * count / n);
jsc.stop();
}
}
簡單起見衩椒,通過setMaster("local")在本地使用一個(gè)worker線程運(yùn)行程序梢什。
點(diǎn)擊運(yùn)行可以看到輸出結(jié)果里面:
?
圖9 Pi計(jì)算結(jié)果
更多蒙特卡羅算法(Monte Carlo)如何計(jì)算Pi的介紹可以參考下面的鏈接:
[1] 'Estimating the value of Pi using Monte Carlo'.?https://www.geeksforgeeks.org/estimating-value-pi-using-monte-carlo/
[2] 'A Monte Carlo Approach to Estimating Pi'.?http://www.mikesovay.com/msc/3%20-%20Kent%20Collins%20Material/Monte%20Carlo%20Simulation%20of%20Pi/MonteCarloApproachToPi_StudentInstructions.pdf