spark partition(task)的并行执行

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.Function2;
import org.apache.spark.api.java.function.VoidFunction;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;



public class Test {

    public static void main(String[] args) {
        SparkConf sparkConf = new SparkConf()
                .setAppName("NodeMonitor").setMaster("local[*]");
        JavaSparkContext javaSparkContext=new JavaSparkContext(sparkConf);

        List<Integer> data = Arrays.asList(1,2,3,4,5,6,7,8);
        JavaRDD<Integer> javaRDD = javaSparkContext.parallelize(data,8);

//获得分区ID
        JavaRDD<String> partitionRDD = javaRDD.mapPartitionsWithIndex(new Function2<Integer, Iterator<Integer>, Iterator<String>>() {
            @Override
            public Iterator<String> call(Integer v1, Iterator<Integer> v2) throws Exception {
                LinkedList<String> linkedList = new LinkedList<String>();
                while(v2.hasNext()){
                    linkedList.add(v1 + "=" + v2.next());
                }
                return linkedList.iterator();
            }
        },false);
        System.out.println(partitionRDD.collect());
        javaRDD.foreachPartition(new VoidFunction<Iterator<Integer>>() {
            @Override
            public void call(Iterator<Integer> integerIterator) throws Exception {
                System.out.println("___________begin_______________");
                while(integerIterator.hasNext())
                System.out.print(integerIterator.next() + "      ");
                Thread.sleep(3000);
                System.out.println("\n___________end_________________");
            }
        });
    }
//    static class Sum implements Function2 {
//        public Integer call(Integer a, Integer b) {
//            return a + b;
//        }
//    }

}

  • local: 所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式。
  • local[K]: 指定使用几个线程来运行计算,比如local[4]就是运行4个worker线程。通常我们的cpu有几个core,就指定几个线程,最大化利用cpu的计算能力
  • local[*]: 这种模式直接帮你按照cpu最多cores来设置线程数了。
  • parallelize表示所切割的partition个数。
  • 当使用local,parallelize为4时结果(退化成单线程执行4个任务):
    spark partition(task)的并行执行_第1张图片在这里插入图片描述
  • 当使用local[*],parallelize为4时结果(4线程执行4个任务):
    spark partition(task)的并行执行_第2张图片
  • parallelize为8时(本机为4核CPU)(4线程执行8个任务):
    spark partition(task)的并行执行_第3张图片
    spark partition(task)的并行执行_第4张图片
    https://blog.csdn.net/weixin_38750084/article/details/82769600

你可能感兴趣的:(spark partition(task)的并行执行)