大数据 spark hive 总结

news2025/4/22 1:41:08

Apache Spark

简介

是一个开源的统一分析引擎,专为大规模数据处理而设计。它提供了高级API,支持Java、Scala、Python和R语言,并且包含了一个优化过的执行引擎,该引擎支持循环计算(如机器学习算法)和交互式查询。以下是Spark的一些关键特性和概念

核心特性 

  1. 速度:Spark通过内存计算提高了数据处理的速度,比Hadoop MapReduce快达10到100倍。

  2. 易用性:提供丰富的高层次API,包括DataFrame和Dataset API,简化了数据操作。

  3. 通用性:除了Map和Reduce操作之外,还支持SQL查询、流处理、机器学习和图计算等多种工作负载。

  4. 可扩展性:能够有效地在数千个节点上并行运行。

  5. 容错性:使用RDD(Resilient Distributed Dataset)抽象层,自动处理节点故障恢复。

基本概念 


1. RDD (Resilient Distributed Dataset)

  • 定义
    RDD 是 Spark 的最底层抽象,表示分布在集群节点上的不可变、可分区的数据集合。它提供低级别的 API,强调对数据的细粒度控制

  • 特点

    • 强类型:存储任意类型的对象(如 RDD[User])。

    • 手动优化:需要开发者自行处理序列化、分区、缓存等优化。

    • 函数式操作:通过 mapfilterreduce 等函数式算子处理数据。

    • 容错性:通过血统(Lineage)机制重建丢失的分区。

  • 适用场景
    非结构化数据、需要精细控制的分布式计算(如自定义分区策略)。

2. DataFrame

  • 定义
    DataFrame 是基于 RDD 构建的结构化数据抽象,类似于关系型数据库的表或 Pandas 的 DataFrame。在 Spark 1.3 中引入。

  • 特点

    • Schema 约束:数据具有明确的结构(列名、数据类型),通过 Row 对象表示行。

    • 优化执行:利用 Catalyst 优化器和 Tungsten 执行引擎,自动优化查询计划。

    • API 类型:弱类型 API(列名在运行时检查),支持 SQL 语法。

    • 跨语言支持:在 Java、Scala、Python、R 中接口一致。

  • 适用场景
    结构化/半结构化数据(如 JSON、CSV)、SQL 式查询、需要自动优化的批处理。

3. Dataset

  • 定义
    Dataset 是 Spark 1.6 引入的 API,结合了 RDD 的强类型特性和 DataFrame 的优化引擎。仅在 Scala 和 Java 中可用。

  • 特点

    • 强类型 + 结构化:兼具 RDD 的类型安全(如 Dataset[User])和 DataFrame 的优化能力。

    • 统一 API:与 DataFrame API 兼容(DataFrame = Dataset[Row])。

    • 编码器(Encoder):使用高效的二进制序列化(优于 Java 序列化)。

  • 适用场景
    需要类型安全的复杂业务逻辑、结合函数式和关系式操作的场景。

核心区别对比

特性RDDDataFrameDataset
数据类型任意对象(强类型)结构化的 Row 对象(弱类型)强类型对象(如 Dataset[User]
序列化Java 序列化(较慢)Tungsten 二进制编码(高效)Encoder 序列化(高效)
优化无自动优化,需手动调优Catalyst 优化器自动优化Catalyst 优化器自动优化
API 风格函数式(mapfilter声明式(SQL/DSL)混合式(强类型 API + DSL)
类型安全编译时类型检查运行时类型检查编译时类型检查
语言支持所有 Spark 语言所有 Spark 语言仅 Scala/Java

 演进关系

  • Spark 1.x:RDD → DataFrame(为结构化数据优化)。

  • Spark 2.x:DataFrame 和 Dataset 统一为 Dataset[T](DataFrame = Dataset[Row])。

如何选择?

  1. 优先用 DataFrame/Dataset
    大多数场景下,结构化数据处理更高效(Catalyst 优化 + Tungsten)。

  2. 需要类型安全时用 Dataset
    如 Scala/Java 中复杂业务逻辑。

  3. 仅底层控制时用 RDD
    如自定义分区、非结构化数据,或需直接操作分布式数据。

代码示例

spark-submit  参数

在 Spark 中,spark-submit 是提交作业到集群的核心命令。以下是常用参数及其作用,分为 基础参数资源参数和 调优参数

一、基础参数

参数说明示例
--master指定集群模式yarnlocal[*]spark://host:portk8s://...
--deploy-mode部署模式(客户端或集群)client(默认)或 cluster(适合生产)
--class主类名(含包路径)--class com.example.MainApp
--name作业名称(显示在集群UI)--name "My Spark Job"
--files上传文件到 Executor(如配置文件)--files config.json
--jars添加依赖的 JAR 包(逗号分隔)--jars lib1.jar,lib2.jar
--packages从仓库自动下载依赖(Maven格式)--packages org.apache.kafka:kafka-clients:3.4.0

二、资源参数

参数说明示例注意事项
--executor-memory每个 Executor 的内存--executor-memory 4g需预留内存给系统和开销(如总内存的10%)
--driver-memoryDriver 进程的内存--driver-memory 2g客户端模式下需本地足够内存
--num-executorsExecutor 数量--num-executors 10根据集群资源动态调整
--executor-cores每个 Executor 的 CPU 核数--executor-cores 2总核数 = num-executors * executor-cores
--total-executor-cores所有 Executor 的总核数(Standalone 模式)--total-executor-cores 20优先级低于 num-executors

三、调优参数

参数说明示例用途
--conf spark.serializer指定序列化方式--conf spark.serializer=org.apache.spark.serializer.KryoSerializer优化序列化性能
--conf spark.sql.shuffle.partitions调整 Shuffle 分区数--conf spark.sql.shuffle.partitions=200避免数据倾斜或分区过大
--conf spark.default.parallelism默认并行度--conf spark.default.parallelism=100控制 RDD 的分区数
--conf spark.memory.fractionExecutor 内存中用于执行和存储的比例--conf spark.memory.fraction=0.6调整内存分配策略
--conf spark.dynamicAllocation.enabled启用动态资源分配--conf spark.dynamicAllocation.enabled=true按需增减 Executor(需集群支持)

示例命令

关键注意事项 

  1. 资源分配

    • 总内存和核数不能超过集群资源上限。

    • 在 YARN 模式下,--executor-memory 包含堆外内存,需预留约 10% 的额外内存(如申请 4g,实际可用约 4g * 0.9)。

  2. 动态资源分配

    • 启用 spark.dynamicAllocation.enabled=true 时需配置 spark.shuffle.service.enabled=true(YARN 需启动 Shuffle Service)。

  3. 依赖管理

    • 优先使用 --packages 自动下载依赖,避免手动传 JAR。

    • 本地依赖用 --jars,集群依赖需预先上传到 HDFS 或共享存储。

  4. 日志与调试

    • 添加 --conf spark.eventLog.enabled=true 记录事件日志。

    • 在客户端模式下,Driver 日志输出到控制台;集群模式下需通过集群 UI 查看。

 参数优化场景

  • 数据倾斜:增大 spark.sql.shuffle.partitions 或使用 repartition

  • OOM 错误:增加 executor-memory 或调整 spark.memory.fraction

  • CPU 瓶颈:增加 num-executors 或 executor-cores

  • 网络超时:调整 spark.network.timeout(默认 120s)。

hive

Hive 是构建在 Hadoop 生态系统之上的数据仓库工具,旨在简化大规模数据的查询和管理。它通过类 SQL 语法(HiveQL)将结构化数据操作转化为 MapReduce、Tez 或 Spark 任务,适合处理海量数据(如日志、用户行为等)。以下是其核心概念和用法: 

Hive 核心特性 

特性描述
SQL-like 语法支持类似 SQL 的查询语言(HiveQL),降低大数据处理的学习成本。
数据存储数据存储在 HDFS(Hadoop 分布式文件系统)中,支持多种文件格式(如 ORC、Parquet)。
元数据管理使用 Metastore(如 MySQL)存储表结构、分区等元信息。
扩展性支持自定义函数(UDF)、SerDe(序列化/反序列化工具)等扩展功能。
批处理基于 MapReduce 或 Tez 引擎,适合离线批处理,不适用于实时查询

 

Hive 架构 

  1. 用户接口
    CLI、JDBC、Web UI 等工具提交 HiveQL 查询。

  2. Driver
    解析查询,生成执行计划,管理任务生命周期。

  3. 编译器
    将 HiveQL 转换为 MapReduce/Tez/Spark 任务。

  4. 元数据存储
    Metastore 存储表结构、分区、字段类型等信息。

  5. 执行引擎
    运行编译后的任务,读写 HDFS 数据。

 Hive 数据模型

表(Table)
类似关系型数据库的表,支持内部表(数据由 Hive 管理)和外部表(数据由用户管理)。

CREATE TABLE users (id INT, name STRING) STORED AS ORC; 

分区(Partition) 

按某一列的值划分数据目录,加速查询(如按日期分区)。 

CREATE TABLE logs (log_time STRING, content STRING) 
PARTITIONED BY (dt STRING);

分桶(Bucket) 

 按哈希值将数据分到多个文件,优化 JOIN 和采样效率。

CREATE TABLE orders (order_id INT, user_id INT) 
CLUSTERED BY (user_id) INTO 10 BUCKETS; 

Hive 应用场景 

 

场景说明
离线数据分析处理 TB/PB 级历史数据(如用户行为分析、日志统计)。
ETL 流程清洗、转换数据后导入数据仓库(如将 CSV 转换为 ORC 格式)。
数据挖掘结合机器学习库(如 Hive + Mahout)进行聚类、分类等操作。
报表生成定时生成统计报表(如每日销售额汇总)。

Hive 优缺点

优点缺点
易用性强(SQL 语法)延迟高(分钟级响应,不适合实时查询)
可扩展性高(自定义 UDF)不支持事务和行级更新(Hive 3 部分支持)
兼容 Hadoop 生态(HDFS、HBase 等)需要优化分区和存储格式提升性能

 

Hive vs 传统数据库

对比项Hive传统数据库(如 MySQL)
数据规模支持 PB 级数据适合 GB/TB 级数据
响应速度高延迟(批处理)低延迟(实时查询)
事务支持有限支持(Hive 3+)完整支持 ACID
存储与计算分离(HDFS + 计算引擎)耦合(本地存储 + 计算

 

Hive 使用示例 

创建表并加载数据 

CREATE EXTERNAL TABLE user_logs (
  ip STRING,
  url STRING,
  time STRING
) PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/hive/data/user_logs';

LOAD DATA INPATH '/input/log_20231001.txt' INTO TABLE user_logs PARTITION (dt='2023-10-01');

 聚合查询

SELECT dt, COUNT(*) AS pv 
FROM user_logs 
WHERE dt BETWEEN '2023-10-01' AND '2023-10-07'
GROUP BY dt; 

连接多个表

 SELECT u.name, SUM(o.amount)
FROM orders o
JOIN users u ON o.user_id = u.id
GROUP BY u.name;

生态工具 

  • Hive Metastore:独立元数据服务(供 Spark、Presto 等共用)。

  • Hive on Spark:用 Spark 替代 MapReduce 提升计算速度。

  • Hive LLAP(Live Long and Process):低延迟交互式查询。

总结

  • 适用场景:离线批处理、海量数据仓库管理。

  • 替代方案:实时查询用 Impala 或 Presto;复杂分析用 Spark SQL

  • 学习建议:掌握 HiveQL 语法、分区优化和存储格式(ORC/Parquet)。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序开发总结

今年第一次帮别人做小程序。 从开始动手到完成上线,一共耗时两天。AI 让写代码变得简单、高效。 不过,小程序和 Flutter 等大厂开发框架差距实在太大,导致我一开始根本找不到感觉。 第一,IDE 不好用,各种功能杂糅在…

QLoggingCategory类使用

QLoggingCategory类使用 QLoggingCategory的概述 QLoggingCategory是Qt的日志策略类;可以通过声明不同的日志策略对象来输出不同的日志信息。打印信息类型如下:宏 Q_DECLARE_LOGGING_CATEGORY(name) 定义一个返回QLoggingCategory对象函数,…

GPU加速生信分析-宏基因组MAG去污染

Deepurify利用多模态深度语言模型来过滤污染的基因组,从而提高了宏基因组组装基因组(MAGs)的质量,并且可以利用GPU加速。 宏基因组组装的基因组 (MAG) 为使用宏基因组测序数据探索微生物暗物质提供了有价值…

数据结构(蓝桥杯常考点)

数据结构 前言:这个是针对于蓝桥杯竞赛常考的数据结构内容,基础算法比如高精度这些会在下期给大家总结 数据结构 竞赛中,时间复杂度不能超过10的7次方(1秒)到10的8次方(2秒) 空间限制&#x…

从0到1入门Linux

一、常用命令 ls 列出目录内容 cd切换目录mkdir创建新目录rm删除文件或目录cp复制文件或目录mv移动或重命名文件和目录cat查看文件内容grep在文件中查找指定字符串ps查看当前进程状态top查看内存kill终止进程df -h查看磁盘空间存储情况iotop -o直接查看比较高的磁盘读写程序up…

React:类组件(中)

dangerouslySetInnerHTML React写进{}内的东西,不允许被当作代码块解析,是为了防止xss攻击和代码注入 XSS(跨站脚本攻击,Cross-Site Scripting) 是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中&…

第六次CCF-CSP认证(含C++源码)

第六次CCF-CSP认证 数位之和(easy)思路及AC代码遇到的问题 开心消消乐(easy)思路及AC代码 画图(mid)思路及AC代码 数位之和(easy) 题目链接 思路及AC代码 既然题目要求我们输出各位…

SpringBoot 如何调用 WebService 接口

前言 调用WebService接口的方式有很多&#xff0c;今天记录一下&#xff0c;使用 Spring Web Services 调用 SOAP WebService接口 一.导入依赖 <!-- Spring Boot Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId…

算法 之 树形dp 树的中心、重心

文章目录 重心实践题目小红的陡峭值 在树的算法中&#xff0c;求解树的中心和重心是一类十分重要的算法 求解树的重心 树的重心的定义&#xff1a;重心是树中的一个节点&#xff0c;如果将这个点删除后&#xff0c;剩余各个连通块中点数的最大值最小&#xff0c;那么这个节点…

Docker 配置镜像源

》》Daemon {"registry-mirrors": ["https://docker.1ms.run","https://docker.xuanyuan.me"] }》》》然后在重新 docker systemctl restart docker

Linux 离线部署Ollama和DeepSeek-r1模型

都在复制粘贴联网状态下linux部署deepseek&#xff0c;离线状态下需要下载Ollama和DeepSeek模型&#xff0c;然后将下载包上传到linux中。 1、下载Ollama https://github.com/ollama/ollama/releases 注意&#xff1a;如果CentOS7建议安装V0.5.11版本&#xff0c;V0.5.13需要…

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是&#xff0c;有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射&#xff08;ORM&#xff09;功能而闻名&#xff…

RuleOS:区块链开发的“新引擎”,点燃Web3创新之火

RuleOS&#xff1a;区块链开发的“新引擎”&#xff0c;点燃Web3创新之火 在区块链技术的浪潮中&#xff0c;RuleOS宛如一台强劲的“新引擎”&#xff0c;为个人和企业开发去中心化应用&#xff08;DApp&#xff09;注入了前所未有的动力。它以独特的设计理念和强大的功能特性&…

【编译器】VSCODE烧录ESP32-C3——xiaozhi智能聊天机器人固件

【编译器】VSCODE烧录ESP32-C3——xiaozhi智能聊天机器人固件 文章目录 [TOC](文章目录) 前言一、方法一&#xff1a;使用固件烧录工具1. 安装CH340驱动2. 打开FLASH_DOWNLOAD文件3. 选择芯片类型和烧录方式4. 选择烧录文件5. 参数配置 二、方法二&#xff1a;VSCODE导入工程1.…

显式 GC 的使用:留与去,如何选择?

目录 一、什么是显式 GC&#xff1f; &#xff08;一&#xff09; 垃圾回收的基本原理 &#xff08;二&#xff09;显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 &#xff08;三&#xff09;显式 GC 的使用场景与风险 1. JVM 如何处理显式 GC 2. 显式 GC…

SpringMVC概述以及入门案例

目录 SpringMVC概述 为什么需要Spring MVC&#xff1f; SpringMVC入门 工作流程分析 SpringMVC概述 SpringMVC技术与Servlet技术功能等同&#xff0c;均属于Web层开发技术。SpringMVC是一种基于java实现MVC模型的轻量级Web框架。 为什么需要Spring MVC&#xff1f; 在传统J…

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐ 示例 1&#xff1a; 输入&#xff1a;original [1,2,3,4], bounds [[1,2],[2,3],[3,4],[4,5]] 输出&#xff1a;2 解释&#xff1a; 可能的数组为&#xff1a; [1, 2, 3, 4] [2, 3, 4, 5] 示例 2&#xff1a; 输入&…

javaEE初阶————多线程进阶(2)

今天来继续带大家学习多线程进阶部分啦&#xff0c;今天是最后一期啦&#xff0c;下期带大家做一些多线程的题&#xff0c;我们就可以开始下一个环节啦&#xff1b; 1&#xff0c;JUC&#xff08;java.util.concurrent&#xff09;的常见类 1&#xff09;Callable 接口 我们之…

maven无法解析插件 org.apache.maven.plugins:maven-jar-plugin:3.4.1

解决流程 1.修改maven仓库库地址 2.删除本地的maven仓库 maven插件一直加载有问题: 无法解析插件 org.apache.maven.plugins:maven-jar-plugin:3.4.1 开始以为maven版本有问题&#xff0c;重装了maven&#xff0c;重装了idea工具。结果问题还是没解决。研究之后发现&#xf…

Android Studio右上角Gradle 的Task展示不全

Android Studio 版本如下&#xff1a;Android Studio lguana|2023.21, 发现Gradle 的Tasks阉割严重&#xff0c;如下图&#xff0c;只显示一个other 解决方法如下&#xff1a;**Setting>Experimental>勾选Configure all gradle tasks during Gradle Sync(this can make…