我用spark实现了一个简单的java并行算法。但我不知道如何在googledataproc集群上运行它。我在网上找到了很多使用python或scala的资源,但对java来说还不够。这是密码
public class Prime {
List<Integer> primes = new ArrayList<>();
//Method to calculate and count the prime numbers
public void countPrime(int n){
for (int i = 2; i < n; i++){
boolean isPrime = true;
//check if the number is prime or not
for (int j = 2; j < i; j++){
if (i % j == 0){
isPrime = false;
break; // exit the inner for loop
}
}
//add the primes into the List
if (isPrime){
primes.add(i);
}
}
}
//Main method to run the program
public static void main(String[]args){
//creating javaSparkContext object
SparkConf conf = new SparkConf().setAppName("haha").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
//new prime object
Prime prime = new Prime();
prime.countPrime(100000);
//parallelize the collection
JavaRDD<Integer> rdd = sc.parallelize(prime.primes , 4);
long count = rdd.filter(e -> e == 2|| e % 2 != 0).count();
}
}
1条答案
按热度按时间9njqaruj1#
如果您已经有一个jarfile将“prime”指定为主类,那么在基本级别上,它非常简单:
如果您有一个没有指定主类的jar文件,您可以将jar文件提交为“--jars”(末尾带有“s”),并指定“--class”:
但是请注意,由于您指定
setMaster("local")
,它将覆盖集群自己的spark环境设置,并且它将仅使用主节点上的线程运行。您只需删除.setMaster("local")
而且它将自动在dataproc集群中选择yarn配置,以便在多个工作节点上实际运行。另外,我意识到这只是一个入门练习,所以这可能无关紧要,但您几乎肯定不会在真正的分布式模式中看到任何“加速”,因为:
使用spark的计算与加载整数所需的时间相比,也太“便宜”了。
与启动远程执行的开销相比,正在处理的元素数量太少
分区(4)的数量可能太少,动态执行器分配无法启动,因此它们可能会一个接一个地运行
所以你可能会看到更“有趣”的结果,例如,如果你并行化的每个数字都代表了较大的“范围”供工作者检查;例如,如果数字“0”表示“count primes between 0 and 1000000”,“1”表示“count primes between 1000000 and 2000000”,等等,那么您可能会遇到如下情况: