- 博客(61)
- 收藏
- 关注
原创 在spark里通过jps命令,看到的进程
与 Spark 的 JobHistoryServer 类似,它收集 MapReduce 作业的运行信息,包括作业的提交时间、执行时间、任务的运行状态、输入输出统计等,以便用户可以查看过去运行的 MapReduce 作业的详细信息,用于分析作业性能、调试问题以及进行容量规划等。作用:是 HDFS 的核心组件,负责管理文件系统的命名空间,维护文件系统树以及文件树中所有的文件和目录的元数据信息,包括文件的权限、副本数量、数据块的位置等。作用:是 Spark 集群的主节点,负责管理整个集群的资源和任务调度。
2025-05-16 14:54:05
311
原创 在sheel中运行Spark ——RDD
在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。Resilient Distributed Dataset 叫做弹性分布式数据集,是Spark中最基本的数据抽象,是分布式计算的实现载体,代表一个不可变,可分区,里面的元素并行计算的集合。RDD的分区是RDD数据存储的最小单位。举个生活中的例子:高考的时候,每个班的同学都打散到不同的考场,此时的高3(8)班就是一个抽象的概念,在实际中,这个班级的学生可能分布在5个不同的考场。
2025-05-16 14:53:00
452
原创 Spark处理过程-转换算子
它的核心作用是对具有相同键的所有值进行聚合操作,通过用户提供的聚合函数将这些值合并成一个结果,从而实现数据的归约和统计。作用:对 RDD 中的每个元素应用给定的函数 f,将每个元素转换为另一个元素,最终返回一个新的 RDD。作用:筛选出 RDD 中满足函数 f 条件(即 f 函数返回 true)的元素,返回一个新的 RDD,新 RDD 中的元素类型与原 RDD 相同。作用:对 RDD 中的每个元素应用函数 f,函数 f 返回一个可遍历的集合,然后将这些集合中的元素扁平化合并成一个新的 RDD。
2025-05-16 14:51:36
311
原创 Spark处理过程-行动算子
行动算子是触发 Spark 计算的“触发点”,因为 Spark 的 RDD 是懒惰计算的,只有在执行行动算子时,才会真正开始计算。它会触发 Spark 作业的实际执行,对 RDD 中的所有元素进行计数,并将最终的计数结果返回给驱动程序。f: T => Unit:这是一个函数,它接收一个类型为 T 的元素(T 为 RDD 中元素的类型),并对该元素执行相应的操作,但不返回任何值(返回类型为 Unit)。返回值:返回一个包含 RDD 中所有元素的数组,数组元素的类型与 RDD 中元素的类型一致。
2025-05-16 14:50:35
254
原创 Spark缓存
当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用。MEMORY_ONLY_SER:将 RDD 以序列化的 Java 对象形式存储在内存中,相较于 MEMORY_ONLY,序列化后占用的内存空间更小,但读取时需要进行反序列化操作,会带来一定的性能开销。RDD通过persist方法或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的行动算子时,该RDD将会被缓存在计算节点的内存中,并供以后重用。
2025-05-16 14:49:11
407
原创 Spark自定义分区器-基础
这就类似于 Spark 中的分区,每个分区的数据可以在不同的计算节点上同时进行处理,从而加快整个数据处理的速度。MyPartitioner类继承自Partitioner,实现了numPartitions方法指定分区数量为 3 ,实现getPartition方法,根据球队名称判断分区索引,湖人对应分区 0,火箭对应分区 1,其他球队对应分区 2。在 Spark 中,RDD 是数据的集合,它会被划分成多个分区,这些分区可以分布在不同的计算节点上,就像图书馆的书架分布在不同的房间一样。
2025-05-16 14:47:30
295
原创 RDD的自定义分区器-案例
在代码中,通过编写一个自定义的分区函数,根据用户 ID 的范围返回对应的分区编号。如在之前的示例代码中,custom_partitioner 函数根据不同的 ID 范围返回 0、1、2 三个分区编号,从而实现按照地区进行分区的目的。具体来说,将用户 ID 在 0 - 1000 的订单数据分到一个分区,1001 - 2000 的分到另一个分区,2001 及以上的分到第三个分区。问题描述:需要根据特定的用户 ID 范围来定义分区规则,确保相同地区的订单数据被分配到相同的分区。
2025-05-16 14:46:34
254
原创 结构化数据处理
agg(sum($"quantity").as("total_quantity"), sum($"quantity" * $"price").as("total_sales")):对每个分组进行聚合操作,计算销售总量和销售总额,并分别命名为 total_quantity 和 total_sales。使用sql风格操作的前提是将DataFrame注册成一个临时表,在程序中直接使用spark.sql()方式执行SQL查询,结果将作为一个DataFrame返回。每一行代表一条记录,每一列代表一个属性。
2025-05-16 14:45:37
299
原创 SparkSQL操作Mysql
前面的课程我们学习了如何从csv文件中读入数据,这相当于是对csv这种类型的数据的操作。请注意,这里并没没有单独添加spark_core的依赖,因为在spark-sql中已经包含了spark_core。若已安装,需要先做卸载MySQL的操作命令是:rpm -e --nodeps mariadb-libs。(2)spark-sql_2.12 提供了 Spark SQL 的功能,用于高效的数据处理和分析。使用的命令是: mysqld --initialize --user=mysql。启动MySQL服务。
2025-05-16 14:43:51
943
原创 SparkSQL-数据提取和保存
原文链接:https://blog.youkuaiyun.com/2401_87129116/article/details/147920086。在前面我们学习了RDD的算子还有分区器,今天我们来一起完成一个大一点的案例,通过案例来巩固学习内容。下面来做一个综合案例:读入csv文件中的数据,并做简单的数据筛选,然后 写入数据到数据库。//创建一个properties对象,用来储存mysql的连接信息。//将数据写入到mysql的数据库中的user表中。//过滤年龄<20的数据。
2025-05-16 14:42:14
313
原创 Hadoop的序列化
序列化的时候,它会自动被调用,将一个内存中的对象,序列化成为一个字节序列。如果序列化的属性不是Hadoop的序列化类型,就要调用相应的方法把它进行序列化。Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。下面我们来看一个例子:通过代码来定义一个类,并创建它的一个对象,把这个对象保存到文件中(序列化),然后再写代码读取这个文件并还原回来。(五)hadoop的序列化。
2025-05-07 09:25:51
344
原创 如何配置HADOOP_HOME环境变量
生命周期:Maven 定义了一套标准的项目构建生命周期,主要包括 `clean`、`default` 和 `site` 三个生命周期。每个生命周期由多个阶段(phase)组成,例如 `default` 生命周期包含 `compile`、`test`、`package`、`install`、`deploy` 等阶段。Maven 可以帮助你管理这些依赖项,你只需在项目的 `pom.xml` 文件中声明所需的依赖,Maven 就会自动从远程仓库下载这些依赖项,并将其添加到项目的类路径中。
2025-05-07 09:24:45
388
原创 教你如何创建Maven项目
步骤一:打开 IDEA,点击 File -> Settings(Windows/Linux)或者 IntelliJ IDEA -> Preferences(Mac),进入设置界面,然后找到 Build, Execution, Deployment -> Build Tools -> Maven。步骤三:可以在 User settings file 中指定 settings.xml 文件的路径(一般使用默认路径即可),Local repository 中指定本地仓库的路径,配置完成后点击 OK 保存设置。
2025-05-07 09:23:23
343
原创 教你了解数据压缩
有损压缩则会在一定程度上牺牲数据的精度来换取更高的压缩比,适用于对数据质量损失有一定容忍度的场景,如图像、音频、视频等多媒体数据。即使你的MapReduce的输入输出文件都是未压缩的文件,你仍然可以对Map任务的中间结果输出做压缩,因为它要写在硬盘并且通过网络传输到Reduce节点,对其压缩可以提高很多性能,这些工作只要设置两个属性即可,我们来看下代码怎么设置。数据压缩是指在不丢失或尽可能少丢失数据信息的前提下,通过特定的算法和技术,对原始数据进行重新编码和处理,以减少数据存储空间或传输带宽的过程。
2025-05-07 09:22:25
359
原创 一分钟教你学会流量统计
但是,这里有一个问题:map和reduce这两个函数都是通过key,value的方式来进行数据交互的,这里的key可以设置为手机号,而value值就比较复杂,它有两个信息:上行流量和下行流量要统计。而这就必然引出一个新的问题:因为key,value是需要进行磁盘的读写的,所以它们必须要能序列化,如果我们创建一个新的类来描述流量数据,就必须也实现序列化。我们有一份统计数据,这个数据是关于手机号消耗流量的情况,需求统计每一个手机号耗费的总上行流量、总下行流量、总流量。
2025-05-07 09:20:55
858
原创 一分钟教你学会Yarn
通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源, 这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。但是实际中,资源是有限的,并且在繁忙的群集上, 应用程序通常将需要等待其某些请求得到满足。现在,如果B用户在其他作业仍在运行时开始第二个作业,它将与B的另一个作业共享其资源,因此B的每个作业将拥有资源的四分之一,而A的继续将拥有一半的资源。
2025-05-07 09:19:17
345
原创 Spark与Hadoop之间的联系和对比
通过这种集成,用户可以在一个统一的大数据平台上,结合 Hadoop 和 Spark 的各种组件,根据不同的业务需求选择合适的工具和技术,构建复杂的大数据处理和分析系统。Spark 以其内存计算的特性而闻名,能够在内存中对数据进行快速处理,相较于传统基于磁盘的计算框架,大大提高了数据处理的速度。Hadoop:Hadoop 的 MapReduce 编程模型相对较为底层和复杂,开发人员需要编写大量的代码来实现数据处理逻辑,尤其是在处理复杂的数据转换和多阶段计算时,代码量会非常庞大,开发和维护成本较高。
2025-05-07 09:17:23
292
原创 在sheel中运行Spark ——RDD
在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。Resilient Distributed Dataset 叫做弹性分布式数据集,是Spark中最基本的数据抽象,是分布式计算的实现载体,代表一个不可变,可分区,里面的元素并行计算的集合。RDD的分区是RDD数据存储的最小单位。举个生活中的例子:高考的时候,每个班的同学都打散到不同的考场,此时的高3(8)班就是一个抽象的概念,在实际中,这个班级的学生可能分布在5个不同的考场。
2025-05-07 09:14:50
306
原创 在spark里通过jps命令,看到的进程
与 Spark 的 JobHistoryServer 类似,它收集 MapReduce 作业的运行信息,包括作业的提交时间、执行时间、任务的运行状态、输入输出统计等,以便用户可以查看过去运行的 MapReduce 作业的详细信息,用于分析作业性能、调试问题以及进行容量规划等。作用:是 HDFS 的核心组件,负责管理文件系统的命名空间,维护文件系统树以及文件树中所有的文件和目录的元数据信息,包括文件的权限、副本数量、数据块的位置等。作用:是 Spark 集群的主节点,负责管理整个集群的资源和任务调度。
2025-05-07 09:13:20
404
原创 在Spark集群搭建之Yarn模式
1.上传并解压spark-3.1.2-bin-hadoop3.2.tgz,重命名解压之后的目录为spark-yarn。5. /opt/module/spark-standalone/examples/jars/spark-examples_2.12-3.1.1.jar:指定了包含应用程序代码的 JAR 文件的路径。NodeManager:部署在集群中的每个节点上,负责管理该节点上的资源使用情况,监控容器的运行状态,并且与 ResourceManager 保持通信,汇报节点的资源使用信息。
2025-05-07 09:12:00
1036
原创 spark的安装以及单机模式的运行
在安装Spark时,它就提供了一些示例程序,我们可以直接来调用。进入到spark-local,运行命令spark-submit命令。mv是linux的命令,这里的 \ 是换行输入的意思,整体的代码就只有一句,只不过太长了,我们把它拆开成几个部分来输入,其中\ 的意思就是这里写不下,写在下一行。请注意,它并不会产生新的文件,而是直接在控制台输出结果。接下来的操作,我们把它上传到集群中的节点,并解压运行。1.打开etc/profile.d/my_env.sh文件中,补充设置spark的环境变量。
2025-05-07 09:11:12
335
原创 spark的Standalone模式介绍
修改名字,改成spark-default.conf,再补充两个设置。切换到目录 /opt/module/spark-standalone/bin下,可以看到有一个spark-submit可执行文件,我们通过它来提交任务。进入到hadoop100机器,切换目录到/opt/module/spark-standalone/sbin下,运行命令 ./start-all.sh。注意,这里不要省略./,它表示的是当前目录下的start-all命令,如果省略了./,它就会先去环境变量PATH中指定的目录来找这个命令。
2025-05-07 09:09:49
621
原创 在Idea中编写Spark程序并运行
(1)访问Scala官方网站(https://www.scala-lang.org/download/)下载适合操 作系统的Scala安装包。安装Scala的操 作,也是一路默认安装即可。(2) 打开命令提示符(CMD),输入以下命令:scala -version 如果显示Scala 的版本信息,说明安装成功。Spark是基于scala的,当然它也可以支持java和scala还有python语言,我们这里会使用scala。它的功能是wordcount的功能:从指定的文件夹中去读取文件,并做词频统计。
2025-05-07 09:03:23
923
原创 关于hadoop和yarn的问题
YARN(Yet Another Resource Negotiator)是 Hadoop 2.0 引入的资源管理平台,其核心功能是将资源管理与作业调度/监控分离,支持多计算框架(如 MapReduce、Spark 等)运行在同一个集群中,提高资源利用率和系统扩展性。YARN(Yet Another Resource Negotiator):资源管理和作业调度框架,负责集群资源的统一分配和任务调度,提升集群利用率。ResourceManager(RM):集群资源的总管理者,负责全局资源分配与调度。
2025-04-18 15:04:32
434
原创 . hadoop 集群的常用命令
启动所有Hadoop服务。# 停止所有Hadoop服务。# 列出所有运行中的应用程序。# 查看MapReduce作业状态。## MapReduce作业命令。# 检查YARN节点状态。2. **文件权限和所有权**# 查看集群资源使用情况。# 提交MapReduce作业。1. **平衡HDFS数据**1. **启动/停止集群**# 检查HDFS一致性。2. **检查集群状态**# 检查HDFS状态。# 检查集群健康状态。1. **基本文件操作**# 查看应用程序日志。2. **检查文件系统**
2025-03-31 20:11:52
406
原创 mapreduce的工作原理
**分区(Partitioning)**:根据 key 的哈希值决定数据发送到哪个 Reduce 任务。- **Combiner(可选)**:本地 reduce,减少网络传输量。- **排序(Sorting)**:每个分区内的数据按键排序。- **数据本地性优化**:优先在存储数据的节点上执行任务。- **Map 阶段**:处理输入数据并生成中间键值对。- **Reduce 阶段**:对中间结果进行汇总处理。- **数据从 Map 端拷贝到 Reduce 端**
2025-03-31 20:09:24
371
原创 linux常见操作指令
ls命令可以查看文件夹下的文件信息,如果某个文件夹下的文件特别多,使用ls命令时,就只能显示后面一部分文件信息,那如果我们希望查看全部的文件信息,要怎么办呢?因为在linux下,我们要去下载安装新的软件时就需要用到它:下载下来的软件大多都是.tar格式,而安装的过程就是解压缩。会把111写入a.txt这个文件中,把之前的内容删除掉。但是,在linux里,这不能使用鼠标操作,需要用到显示文件的命令。ls 用来显示文件夹下的文件信息,more用来翻页,而 | 就可以把前一个的结果作为输入传递给more。
2025-03-03 20:03:41
360
原创 vi常见操作命令
命令模式:在这个模式下,所敲的按键编辑器都理解为命令,以命令来驱动执行不同的功能。当我们通过VI命令第一次打开文件的时候,进入的就是命令模式。vi编辑器有三种工作模式,分别是命令模式,编辑模式,底线模式。(2)按下o:进入到编辑输入模式后,在当前行的后面添加一行空行(当前行的下一行)2. 如果文件已经存在,此时就打开这个文件,进入命令模式。从命令模式切换到底线命令模式,输入: 进入底线命令模式。底线命令模式: 以:开始通常用于文件的保存和退出。(1)按下i: 进入编辑模式,定位到当前光标前面。
2025-03-03 20:01:59
336
原创 配置虚拟机IP并使用finalshell连接
linux中,ip地址是写在配置文件(/etc/sysconfig/network-scripts/ifcfg-ens33)中,这里使用 vi 编辑器去修改即可!如果不进行设置,每次启动机器时都可能是随机的IP,不方便我们后续操作。命令如下:vi /etc/sysconfig/network-scripts/ifcfg-ens33。注意:这里的第三个部分的10并不是固定的,我们自己可以约定,但是约定之后就要固定下来。让所有的vm配置的虚拟机使用NAT时,它们的网段都是一致的。(3)设置虚拟机的IP。
2025-03-03 19:57:56
406
原创 安装配置虚拟机教学
用来在自己的电脑上安装虚拟机。它调用CentOS-7-x86_64-Minimal-2009.iso来安装操作系统.如果安装VMware17.6时,提示缺少文件,再来安装它,否则不用。虚拟机安装配置对新手来说还是太吃操作了,有没有更简单的方法推荐一下,有的兄弟,有的,现在我来推荐一套更简单快捷的操作。1. CentOS-7-x86_64-Minimal-2009.iso : linux安装文件。然后在此处可以更改安装位置,自行选择,然后下一步。点击创建新的虚拟机或者左上角文件,创建新的虚拟机。
2025-03-03 19:23:57
311
原创 Scala读取文件方法排序
writer.println(s"姓名:${s.name},语文:${s.yuwen},数学:${s.shuxue},英语:${s.yingyu},总分:${s.zongfen},平均分:${s.pinjunfen}")writer.println(s"姓名:${s.name},语文:${s.yuwen},总分:${s.zongfen}")writer.println(s"姓名:${s.name},总分:${s.zongfen}")// println("语文",arr(1).toInt)
2024-12-11 21:09:04
1101
原创 Scala部分正则表达式
6.脱字符:^ 如果在正则的最前面,表示,要匹配的内容必须在字符串的开头。7.脱字符:$ 如果在正则的最后面,表示,要匹配的内容必须在字符串的结尾。11.\w:[a-zA-Z0-9_]63个字符中的任意一个."一个字"2.[a-z]:表示从a到z的26个字母中的任意一个。3.[A-Z]:表示从A到Z的26个字母中的任意一个。8.英文的. :表示除了换行之外的其他的任意一个字符。4.1[^ab]:表示匹配一个字符,除a,b之外的。4.[0-9]:表示从0到10中的任意的一个。9.\d:表示0-9的一个数字。
2024-12-11 21:07:51
211
原创 Scala的泛型
/ getMiddleEle(List(1,2,3,4,5)) ==> 5/2 = 2 ==> 下标为2的元素是:3。// getMiddleEle(List(1,2,3,4)) ==> 4/2 = 2 ==> 下标为2的元素是:3。// List[Int]:List是列表,[Int] 是说列表中的每一个元素都是int!// 类型参数 -----泛型(数据类型是变化的)// 用它来获取当前的列表的中间位置上的值。// 中间位置的下标 = 长度/2。// (1) 可以有多个。
2024-12-11 21:06:04
196
原创 Scala函数的隐式参数
可以将数据库连接对象作为隐式参数传递给这些服务的方法,这样在需要使用数据库连接的地方,只要在合适的作用域内提供隐式的数据库连接对象即可。例如,假设有一个隐式参数的类型是Animal,并且有隐式值类型为Dog(Dog是Animal的子类)和Cat(Cat是Animal的子类),编译器会根据上下文和类型要求来选择合适的隐式值。配置管理:对于一些全局的配置参数,如日志级别、应用程序名称等,可以通过隐式参数的方式在函数中使用。//困难:函数有一个默认的参数值,在不传入具体的实参时,就会自动使用这个默认值。
2024-12-11 21:05:05
329
原创 Scala的隐式转换
通过定义隐式转换函数,当编译器发现某个值的类型不符合要求,但存在合适的隐式转换函数可以将其转换为期望的类型时,就会自动应用这个转换。例如,如果在一个对象中定义了隐式转换函数,那么只有在这个对象内部或者导入这个对象的地方才能使用该隐式转换。隐式转换函数必须是定义在当前作用域内的单个参数的方法,并且这个参数的类型是转换前的类型,返回值类型是转换后的类型。编译器会按照一定的顺序查找隐式转换函数,首先是在当前代码块中查找,然后是在包含代码块的外部作用域中查找,最后是在导入的隐式转换的作用域中查找。
2024-12-11 21:01:30
814
原创 Scala的Map合集
在 Scala 中 你可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map。查询 :get方法,输入key,如果找到,就返回包装数据,如果没有找到,就返回None。Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。val rs = stu2.get("小花") //找不到,返回None。val rs1 = stu2("小花") // 找不到,直接报错。println(s"姓名:${k},分数:${v}")// // 1.添加。
2024-12-03 14:24:35
441
原创 Scala图书馆整理
val book1 = Book("004", "强吻999次:恶魔少爷快走开", "4", 33.0, 10)bookList += Book("003", "重生之我在霸总短剧当保姆", "3", 66.0, 11)bookList += Book("001", "重生之霸道总裁爱上我", "1", 64.0, 3)bookList += Book("002", "重生之我是王妈", "2", 33.0, 10)println(s"《$bookName》 不存在,删除失败")println("没有")
2024-12-03 14:23:13
278
原创 scala的 迭代器
(2) 统一的遍历方法。zip方法用于将两个迭代器的元素按顺序组合成一个新的迭代器,其中每个元素是一个包含两个迭代器对应位置元素的元组。// println(it1.next()) // 作用:获取当前元素 + 移动迭代器。// println(it1.next()) // 作用:获取当前元素 + 移动迭代器。// println(it1.next()) // 作用:获取当前元素 + 移动迭代器。// take 只处理当前开始的,指定数量的元素,返回一个新的迭代器。
2024-12-03 14:20:05
471
原创 Scala中的Array
/ ArrayBuffer(1,2,3,4,5),取出3,4 组成一个新的数组。// slice(起点下标,终点下标) // 不包括终点下标!// 1-10的数组,每隔2个 range 不包括终点,2 是步长。// 2.访问. 数组名(下标)。// println(s"第一个元素是${arr1(0)}")// indexOf: // 找到第一个元素的下标。// 有,就返回第一次出现的下标。// 找到大于100的元素。// 没有,就返回 -1。// 3.快速填充数组内容。
2024-12-03 14:18:46
527
原创 用Scala中的Array解决问题
dreamList += DreamItem("莫名其妙获得10000000000000",false,"2030-10-01",1)dreamList += DreamItem("有100套房子",false,"2030-10-01",1)dreamList += DreamItem("周游全世界",false,"2030-10-01",1)dreamList += DreamItem("月薪十万+",false,"2030-10-01",1)
2024-12-03 14:15:58
404
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅