forked from baifendian/SparkDemo
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathJavaSparkPi.java
70 lines (60 loc) · 2.64 KB
/
JavaSparkPi.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/**
* Copyright (C) 2015 Baifendian Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.spark.examples;
import java.util.ArrayList;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
/**
* 计算π的近似值
* <p>
* <b>用法:</b> JavaSparkPi [slices] <br>
* <b>原理:</b> 使用蒙特卡罗方法计算圆周率,假想有一个 2 * 2 的正方形,在里面画一个内切圆(r = 1),
* 假想有一个点随机扔到正方形中(假设有 N 次),那么恰好也在圆中的次数为(C),如果 N 足够大,那么 C/N 逼近于 圆的面积/正方形面积,也就是说
* pi/4,那么 pi/4 = C/N, pi = 4*C/N.
*/
public final class JavaSparkPi {
public static void main(String[] args) throws Exception {
SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
// slices 对应于 partition 个数
int slices = (args.length == 1) ? Integer.parseInt(args[0]) : 2;
int n = 100000 * slices; // 每个 partition 中设置 100000 个点
List<Integer> l = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
l.add(i);
}
JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);
int count = dataSet.map(new Function<Integer, Integer>() {
@Override
public Integer call(Integer integer) {
double x = Math.random() * 2 - 1;
double y = Math.random() * 2 - 1;
return (x * x + y * y < 1) ? 1 : 0; // 在圆内返回 1,否则返回 0
}
}).reduce(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
return integer + integer2;
}
}); // count表示在圆内的点的数目
System.out.println("Pi is roughly " + 4.0 * count / n);
jsc.close();
}
}