如何在googledataproc集群上运行java并行算法?

jtoj6r0c  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(275)

我用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(); 
    }
}
9njqaruj

9njqaruj1#

如果您已经有一个jarfile将“prime”指定为主类,那么在基本级别上,它非常简单:

gcloud dataproc jobs submit spark --cluster ${CLUSTER_NAME} --jar prime-jarfile.jar

如果您有一个没有指定主类的jar文件,您可以将jar文件提交为“--jars”(末尾带有“s”),并指定“--class”:

gcloud dataproc jobs submit spark --cluster ${CLUSTER_NAME} --jars prime-jarfile.jar --class Prime

但是请注意,由于您指定 setMaster("local") ,它将覆盖集群自己的spark环境设置,并且它将仅使用主节点上的线程运行。您只需删除 .setMaster("local") 而且它将自动在dataproc集群中选择yarn配置,以便在多个工作节点上实际运行。
另外,我意识到这只是一个入门练习,所以这可能无关紧要,但您几乎肯定不会在真正的分布式模式中看到任何“加速”,因为:
使用spark的计算与加载整数所需的时间相比,也太“便宜”了。
与启动远程执行的开销相比,正在处理的元素数量太少
分区(4)的数量可能太少,动态执行器分配无法启动,因此它们可能会一个接一个地运行
所以你可能会看到更“有趣”的结果,例如,如果你并行化的每个数字都代表了较大的“范围”供工作者检查;例如,如果数字“0”表示“count primes between 0 and 1000000”,“1”表示“count primes between 1000000 and 2000000”,等等,那么您可能会遇到如下情况:

// Start with rdd is just parallelize the numbers 0 through 999 inclusive with something like 100 to 1000 "slices".
JavaRDD<Integer> countsPerRange = rdd.map(e -> countPrimesInRange(e*1000000, (e+1)*1000000));
int totalCount = countsPerRange.reduce((a, b) -> a + b);

相关问题