1、13、hadoop 和 spark 的都是并行计算,那么他们有什么相同和区别? 两者都是用 mr 模型来进行并行计算,hadoop 的一个作业称为 job,job 里面分为 map task 和 reduce task,每个 task 都是在自己的进程中运行的,当 task结束时,进程也会结束。 spark 用户提交的任务成为 application,一个 application 对应一个sparkcontext,app 中存在多个 job,每触发一次 action 操作就会产生一个job。 这些 job 可以并行或串行执行,每个 job 中有多个 stage,每个 stage 里面有多个 t
2、ask,组成 taskset 由 TaskSchaduler 分发到各个 executor 中执行,executor 的生命周期是和 app 一样的,即使没有 job 运行也是存在的,所以task 可以快速启动读取内存进行计算。 hadoop 的 job 只有 map 和 reduce 操作,表达能力比较欠缺而且在 mr 过程中会重复的读写 hdfs,造成大量的 io 操作,多个 job 需要自己管理关系。 spark 的迭代计算都是在内存中进行的,API 中提供了大量的 RDD 操作如join,groupby 等,而且通过 DAG 图可以实现良好的容错。16、简单说一下 hadoop 和 s
3、park 的 shuffle 过程? hadoop:map 端保存分片数据,通过网络收集到 reduce 端。 spark:spark 的 shuffle 是在 DAGSchedular 划分 Stage 的时候产生的,TaskSchedule 要分发 Stage 到各个 worker 的 executor。 减少 shuffle 可以提高性能。17、RDD 机制? rdd 分布式弹性数据集,简单的理解成一种数据结构,是 spark 框架上的通用货币。 所有算子都是基于 rdd 来执行的,不同的场景会有不同的 rdd 实现类,但是都可以进行互相转换。 rdd 执行过程中会形成 dag 图,然后
4、形成 lineage 保证容错性等。 从物理的角度来看 rdd 存储的是 block 和 node 之间的映射。18、spark 有哪些组件? (1)master:管理集群和节点,不参与计算。 (2)worker:计算节点,进程本身不参与计算,和 master 汇报。 (3)Driver:运行程序的 main 方法,创建 spark context 对象。 (4)spark context:控制整个 application 的生命周期,包括 dagsheduler和 task scheduler 等组件。 (5)client:用户提交程序的入口。19、spark 工作机制? 用户在 clien
5、t 端提交作业后,会由 Driver 运行 main 方法并创建 spark context 上下文。 执行 rdd 算子,形成 dag 图输入 dagscheduler,按照 rdd 之间的依赖关系划分stage 输入 task scheduler。 task scheduler 会将 stage 划分为 task set 分发到各个节点的 executor 中执行。20、spark 的优化怎么做? 通过 spark-env 文件、程序中 sparkconf 和 set property 设置。 (1)计算量大,形成的 lineage 过大应该给已经缓存了的 rdd 添加checkpoint
6、,以减少容错带来的开销。 (2)小分区合并,过小的分区造成过多的切换任务开销,使用 repartition。21、kafka 工作原理? producer 向 broker 发送事件,consumer 从 broker 消费事件。 事件由 topic 区分开,每个 consumer 都会属于一个 group。 相同 group 中的 consumer 不能重复消费事件,而同一事件将会发送给每个不同group 的 consumer。Scala 的特点?Scala 是兼容的 Scala 是简洁的 Scala 是高层级的 Scala 是静态类型的和 Java 的区别?(1)scala 与 java
7、都有 7 中数值类型:int、short、long、byte、float、double、boolean 这 7 种,但是 scala 中这7 种值类型是类,在 java 中属于基本类型,java 中,数据类型分成基本类型和引用类型,scala 中不区分。(2)scala 中的变量或函数的类型总是写在变量或者函数名的后面(3)scala 中的操作符与 java 中的操作符没有什么不同,但是在 scala 中,操作符是方法,在 java 中操作符不是方法,且在 scala 中,除了字母数字之外的其他特殊字符也可以作为方法(4)scala 中的通配符是_,java 中的通配符是*(5)scala 中
8、的 unit 相当于 java 中的 void(6)scala 中的 if/else 的表达式与 java 中的差不多,但是 scala 中有值(7)scala 中没有 static,但是可以用 object 来达到 java 中相同的效果,scala 中的 object 可以实现单例对象.RDD 的数据结构是怎么样的? RDD 的全称:弹性分布式数据集合,它是 spark 的基本数据结构,spark 中的所有数据都是通过 RDD 的形式进行组织。RDD 是不可变的数据集合,不可变的意思是 RDD 中的每个分区数据是只读的。RDD 数据集是要做逻辑分区的(这里的分区类似 hadoop 中的逻辑
9、切片 split),每个分区可以单独在集群节点进行计算。RDD 数据集中的数据类型可以包含任何 java 类型、scala 类型、python 类型或者自定义的类型。RDD 擅长的领域:迭代式的数据处理,比如机器学习。1.分区列表,Partition List。这里的分区概念类似 hadoop 中的 split 切片概念,即数据的逻辑切片2.针对每个 split(切片)的计算函数,即同一个 RDD 的每个切片的数据使用相同的计算函数3.对其他 rdd 的依赖列表4.可选,如果是(Key,Value)型的 RDD,可以带分区类5.可选,首选块位置列表(hdfs block location);简
10、要描述 Spark 分布式集群搭建的步骤1. 下载 Spark 的发 行版2. 解压缩 文件3. 设置环境变量cd spark-1.6.3-bin-hadoop2.6export SPARK_HOME=pwdexport PATH=$SPARK_HOME/bin:$PATH4. 本地运 行Spark4.1 运 行SparkPi$SPARK_HOME/bin/run-example SparkPi4.2 运 行spark-shell$SPARK_HOME/bin/spark-shell在提示符中开始运 行Spark 程序5. 集群模式运 行Spark5.1 配置集群模式cd $SPARK_HOM
11、E/confvim spark-env.sh加 入如下内容HADOOP_CONF_DIR=/home/bigdata/hadoop-2.6.0/etc/hadoop(Hadoop 的安装见参考 文档5.2 运 行SparkPiexport MASTER=yarn-client$SPARK_HOME/bin/run-example SparkPiexport MASTER=yarn-cluster$SPARK_HOME/bin/run-example SparkPi5.2 运 行Spark-shell$SPARK_HOME/bin/spark-shell -master yarn-clients
12、park on yarn 的两种模式? client 模式? 和 cluster 模式?yarn-cluster 和 yarn-client 模式的区别其实就是 Application Master 进程的区别,yarn-cluster 模式下,driver 运行在 AM(Application Master)中,它负责向YARN 申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在 YARN 上运行。而 yarn-client 模式下,Application Master 仅仅向 YARN 请求executor,client 会和请求的 containe
13、r 通信来调度他们工作,也就是说Client 不能离开。数据倾斜Spark 如何处理非结构化数据?通过 Scala 的函数式编程进行基于 RDD 的非结构化数据处理。7. 快在哪里呢?Spark 和 Mapreduce 快? 为什么快呢? 快在哪里呢? 1. 统一的 RDD 抽象和操作2. 基于内存的迭代式计算 3. 它可以把整个执行过程做一个图,然后进行优化。8. spark sql 又为什么比 hive 快呢1. 消除了冗余的 HDFS 读写2. 消除了冗余的 MapReduce 阶段3. JVM 的优化RDD 的数据结构是怎么样的? 1. 一个分片列表 partition list2.
14、一个计算函数 compute,对每一个 split 进行计算3. 对其他 rdd 的依赖列表 dependencies list.依赖又份 宽依赖和窄依赖。4. partitioner for key-value RDDs.比如说 hash-partitioned rdd(这是可选的,并不是所有的 add 都会有这个特征)5. 对每一个 split 计算的优先位置 Preferred Location。比如对一个hdfs 文件进行计算时,可以获取优先计算的 block locations.Spark 工作的一个流程1.构建 Spark Application 的运行环境(启动 SparkCon
15、text),SparkContext向资源管理器(可以是 Standalone、Mesos 或 YARN)注册并申请运行 Executor资源; 2.资源管理器分配 Executor 资源,Executor 运行情况将随着心跳发送到资源管理器上; 3.SparkContext 构建成 DAG 图,将 DAG 图分解成 Stage,并把 Taskset 发送给Task Scheduler。Executor 向 SparkContext 申请 Task,Task Scheduler 将Task 发放给 Executor 运行同时 SparkContext 将应用程序代码发放给Executor。 4
16、.Task 在 Executor 上运行,运行完毕释放所有资源。stage 怎么划分的?划分 Stage 的一个主要依据是当前计算因子的输入是否是确定的,如果是则将其分在同一个 Stage,避免多个 Stage 之间的消息传递开销400-820-7975宽依赖窄依赖是什么?窄依赖(图左):父 partition 对子 partition 是一对一或多对一。宽依赖(图右):父 partition 对子 partition 是一对多。如果两个 RDD 在进行 join 操作时,一个 RDD 的 partition 仅仅和另一个RDD 中已知个数的 Partition 进行 join,那么这种类型的
17、 join 操作就是窄依赖 7.问了 shuffle 过程。 Spark 的 Shuffle 总体而言就包含两个基本的过程:Shuffle write 和Shuffle read。ShuffleMapTask 的整个执行过程就是 Shuffle write。将数据根据 Hash 的结果,将各个 Reduce 分区的数据写到各自的磁盘文件中,写数据时不做排序操作。 首先 是将 map 的输出结果送到对应的缓冲区 bucket 里面,每个 bucket里的文件会被写入本地磁盘文件 ShuffleBlockFile 中,形成一个FileSegment 文件。 Shuffle read 指的是 red
18、ucer 对属于自己的 FileSegment 文件进行fetch 操作,这里采用的 netty 框架,fetch 操作会等到所有的 Shuffle Write 过程结束后再进行,.reducer 通过 fetch 得到的 FileSegment 先放在缓冲区 softBuffer 中,默认大小 48MB。 Spark 性能优化主要有哪些手段? 过对 Stage/Cache/Partition、资源、内存/GC 的优化, SPARK 优势和劣势 速度 其次,Spark 是一个灵活的运算框架,适合做批次处理、工作流、交互式分析、流量处理等不同类型的应用,因此 Spark 也可以成为一个用途广泛的运算引擎,并在未来取代 Map/Reduce 的地。 最后,Spark 可以与 Hadoop 生态系统的很多组件互相操作。Spark 可以运行在新一代资源管理框架 YARN 上,它还可以读取已有并存放在 Hadoop上的数据,这是个非常大的优势。 劣势 稳定性方面, 不能处理大数据, 不能支持复杂的 SQL 统计;