Spark 和 Hadoop 都是大数据处理领域的重要框架,它们都支持并行计算,但有显著的差异。Hadoop 使用 MapReduce 模型,一个作业(Job)被分解为 Map 和 Reduce 任务,每个任务都在独立的进程中运行,任务结束后进程也随之结束。而 Spark 提供了一个更高级别的抽象,用户提交的任务称为 Application,每个 Application 对应一个 SparkContext。Application 内可包含多个 Job,每次执行 Action 操作都会触发一个新的 Job。这些 Job 可以并行或串行执行,Job 中的 Stage 包含多个 Task,Task 由 TaskScheduler 分发到 Executor 中执行。Executor 在整个 Application 生命周期内保持活跃,即使没有 Job 运行,这样可以实现快速的任务启动和内存计算。
Hadoop 的 MapReduce 模型在处理迭代计算时效率较低,因为它频繁地读写 HDFS,导致大量 I/O 操作。相比之下,Spark 利用内存计算,支持迭代计算,提供丰富的 RDD(弹性分布式数据集)操作,如 join 和 groupby,同时通过 DAG(有向无环图)实现高效容错。
Spark 的 Shuffle 过程与 Hadoop 类似,但更优化。在 Spark 中,Shuffle 在 DAGScheduler 划分 Stage 时发生,TaskScheduler 将 Stage 分发到 Worker 上的 Executor。减少 Shuffle 可显著提高性能。
RDD 机制是 Spark 的核心概念,它是一种分布式数据结构,代表不可变的数据集。RDD 支持多种操作,并能通过 lineage(血统)保证容错性。物理上,RDD 是 Block 和 Node 之间的映射,其执行过程形成 DAG 图,用于追踪数据的变换。
Spark 框架包含多个组件:
1. Master:管理集群和节点。
2. Worker:运行计算任务,向 Master 报告状态。
3. Driver:运行用户的 main 方法,创建 SparkContext。
4. SparkContext:负责整个 Application 的生命周期管理,包括 DAGScheduler 和 TaskScheduler。
5. Client:用户提交程序的入口。
Spark 的工作流程是这样的:用户在 Client 端提交作业,Driver 运行 main 方法,创建 SparkContext。RDD 算子执行后形成 DAG 图,DAGScheduler 根据依赖关系划分 Stage,TaskScheduler 将 Stage 划分为 TaskSet 并分发到 Executor 执行。
Spark 的优化可以通过配置 spark-env、SparkConf 和 setProperty 设置实现。例如,通过 checkpoint 减少 lineage 大导致的容错开销,使用 repartition 合并小分区以减少任务切换开销。
Kafka 是一个消息队列系统,Producer 向 Broker 发送事件,Consumer 从 Broker 消费事件。事件根据 Topic 进行分类,每个 Consumer 属于一个 Group,同一 Group 中的 Consumer 不能重复消费,但事件会广播给不同 Group 的所有 Consumer。
Scala 语言特性包括兼容性、简洁性、高级别抽象和静态类型。与 Java 相比,Scala 的数值类型是类,变量和函数的类型定义在名称后,操作符在 Scala 中是方法,而不是像 Java 中那样。此外,Scala 支持函数式编程,提供了模式匹配、高阶函数等特性,使得代码更加简洁和高效。