spark算子知识整理2

前面有关RDD的理论已经说过其中一点就是RDD是由一系列的分区组成,所以RDD也提供了和分区相关的一系列算子,这次需要整理的是分区迭代器、重设分区以及countByKey、groupByKey等算子

package com.debug;

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

public class UseRDD04 {

	public static void main(String[] args) {
		SparkConf conf=new SparkConf();
		conf.setMaster("local");
		conf.setAppName("WordCountApp");
		
		JavaSparkContext sc=new JavaSparkContext(conf);
		
		
		List<String>  arr=Arrays.asList("上海","北京","昆明","深圳","长沙","合肥");
		JavaRDD<String> rdd1=sc.parallelize(arr,3);
		
		JavaRDD<String> rdd2=rdd1.mapPartitionsWithIndex(new Function2<Integer, Iterator<String>, Iterator<String>>() {

			public Iterator<String> call(Integer index, Iterator<String> iter) throws Exception {
				List<String> arr=new ArrayList<>();
				while(iter.hasNext()) {
					arr.add(iter.next()+"-"+index);
				}
				return arr.iterator();
			}
		
		},true);
		
		JavaRDD<String> rdd3=rdd2.coalesce(2, false);
		
		rdd3.foreach(new VoidFunction<String>() {
			
			public void call(String city) throws Exception {
				System.out.println(city);
				
			}
		});
		
		sc.stop();

	}

}

这里需要注意理解的是coalesce()方法和rePartition()方法,区别是coalesce()方法的参数shuffle默认设置为false,repartition()方法就是coalesce()方法shuffle为true的情况;shuffle就是磁盘的数据写入和读取的过程,如果为宽依赖则有shuffle过程,窄依赖则没有。如有疑问可以参考下面的文章

https://blog.youkuaiyun.com/lzq20115395/article/details/80602071

接下来再补充两个算子,作为算子知识整理的最后一段代码

package com.debug;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.VoidFunction;

import scala.Tuple2;

public class UseRDD06 {

	public static void main(String[] args) {
		SparkConf conf=new SparkConf();
		conf.setMaster("local");
		conf.setAppName("rdd06");
		
		JavaSparkContext sc=new JavaSparkContext(conf);
		
		List<Tuple2<String, Integer>> arr=Arrays.asList(
				new Tuple2<String, Integer>("u1", 20),
				new Tuple2<String, Integer>("u1", 15),
				new Tuple2<String, Integer>("u2", 18),
				new Tuple2<String, Integer>("u3", 20),
				new Tuple2<String, Integer>("u4", 20),
				new Tuple2<String, Integer>("u5", 100)
		);
		JavaPairRDD<String, Integer> rdd=sc.parallelizePairs(arr);
		
		Map<String,Object> m=rdd.countByKey();
		Set<Entry<String, Object>> se=m.entrySet();
		for(Entry<String, Object> en:se) {
			String key=en.getKey();
			String value=en.getValue().toString();
			
			System.out.println(key+","+value);
		}
		
		JavaPairRDD<String, Iterable<Integer>> rdd2=rdd.groupByKey();
		rdd2.foreach(new VoidFunction<Tuple2<String,Iterable<Integer>>>() {
			
			public void call(Tuple2<String, Iterable<Integer>> tup) throws Exception {
				System.out.println(tup);
				
			}
		});
		
		sc.stop();

	}

}

reduceByKey和groupByKey在本人看来区别主要是reduceByKey会对分组好的数据进行计算,groupByKey则只是分好组不作计算

 

<think>好的,我现在需要帮用户整理Spark的高频面试题汇总。首先,用户提供了几个参考引用,我需要确保答案里正确引用这些内容。用户提到系统级指令,要求用中文回答,行内公式用$...$,独立公式用$$...$$,还要生成相关问题。不过根据用户的实际查询内容,可能数学公式的需求不多,但要注意LaTeX的正确使用。 首先,我要回顾用户提供的引用内容。引用[1]介绍了Spark的基本概念,引用[2]关于RDD和算子操作,引用[3]数据倾斜的表现,引用[4]Stage划分,引用[5]shuffle的问题和预聚合。这些内容应该涵盖在面试题中。 接下来,我需要组织这些内容成结构化的面试题,每个问题下给出答案,并适当引用对应的参考。用户希望问题汇总,所以可能需要分几个大类,比如核心概念、工作机制、性能优化、应用场景等。例如: 1. Spark的核心概念和优势? - 这里需要结合引用[1],提到内存计算、统一分析引擎,处理大规模数据的能力,支持离线、实时、交互式查询。 2. RDD的两种算子操作? - 引用[2],transformation和action的区别,举例说明,如map是转换,collect是动作。 3. 数据倾斜的表现和处理方法? - 引用[3]中的四个表现,然后解决方案如预聚合(引用[5])、调整分区、使用随机前缀等。 4. Stage划分依据? - 引用[4],宽依赖划分Stage,每个Stage是TaskSet,根据分区数划分Task。 5. Shuffle操作的性能问题? - 引用[5],shuffle必须落盘导致性能低,预聚合如reduceByKey优化。 此外,可能还需要补充其他常见问题,比如Spark和Hadoop的区别,DAG的作用,checkpoint机制,内存管理,Spark SQL和DataFrame等,但用户提供的引用中没有这些,可能需要避免加入未引用的内容,或者确认是否有其他引用来源。不过用户只给了引用1-5,所以应集中在这些内容上。 生成相关问题部分,用户需要系统自动生成的问题,可能涉及每个知识点的延伸,比如如何解决数据倾斜,Shuffle优化方法,Stage划分的具体例子等。需要确保问题与提供的引用内容相关,并且符合高频面试题的特点。 最后,检查格式是否符合要求:使用中文,引用标记自然,代码块用正确语法(如果有的话),分点清晰。数学公式部分可能较少,但如果有的话,比如涉及算法复杂度,需用$...$包裹。</think>### Spark高频面试题汇总 #### 1. **Spark的核心优势是什么?** Spark基于内存计算,支持大规模数据处理的统一分析引擎,覆盖离线计算、实时计算和快速查询场景[^1]。其内存计算特性相比Hadoop MapReduce的磁盘IO大幅提升性能,尤其适用于迭代式算法和交互式分析。 #### 2. **RDD的两种算子操作是什么?区别是什么?** - **Transformation(转换算子)**:延迟执行,仅记录操作逻辑,例如`map`、`filter`。 - **Action(行动算子)**:触发实际计算并返回结果,例如`collect`、`count`[^2]。 只有遇到Action时,Spark才会提交Job执行整个计算链。 #### 3. **Spark数据倾斜的表现和解决方法?** **表现**: - Executor因OOM丢失或Shuffle报错 - Driver内存溢出 - 单个Task执行时间极长[^3] **解决方法**: - **预聚合**:使用`reduceByKey`替代`groupByKey`[^5] - **加盐处理**:对Key添加随机前缀分散数据 - **调整并行度**:增加Shuffle分区数 #### 4. **Spark如何划分Stage?** - 根据**宽依赖**(Shuffle依赖)切分Stage,每个Stage包含一组窄依赖的Task[^4]。 - 例如:`reduceByKey`会触发宽依赖,其前后的操作会被划分到不同Stage。 #### 5. **为什么Shuffle操作性能较低?如何优化?** - **原因**:Shuffle需将数据落盘,无法完全内存计算,且涉及网络传输。 - **优化方法**: - 使用`reduceByKey`替代`groupByKey`(预聚合减少数据量) - 调整`spark.sql.shuffle.partitions`增加并行度 - 启用`spark.shuffle.compress`压缩Shuffle数据 #### 6. **Spark执行流程中的核心概念(Job/Stage/Task)?** - **Job**:由Action触发的完整计算任务。 - **Stage**:根据宽依赖划分的任务集,一个Job包含多个Stage。 - **Task**:Stage按分区拆分的并行单元,每个分区对应一个Task[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值