Spark学习之路-1

因工作需要开始学习Spark计算引擎,本系列文章中使用scala语言编写spark程序,在实际开发中可以使用Java,Python或者R语言编写。

1、RDD 弹性分布式数据集

RDD有三种运算:转换(会产生另外一个RDD)、动作(不会产生另外一个RDD)、持久化(对于会重复使用的RDD,可以将RDD持久化在内存中作为后续使用,以提高执行性能)

 

1>、创建intRDD:

val intRDD = sc.parallelize(List(3, 1, 2, 5, 5))

intRDD.collect() // 将数据转换为Array

 

2>、创建stringRDD

val stringRDD = sc.parallelize(List("Apple","Orange","Banana"))

stringRDD.collect()

 

3>、map运算(可以通过传入的函数,将每个元素经过函数运算产生另外一个RDD)

1)具名函数的语句

def addOne(x:Int):Int={

return x+1

}

intRdd.map(addOne).collect()

步骤:先定义addOne函数并传入参数x,此时函数会将x+1再返回

然后将函数名称addOne作为参数传入map命令,map命令会将每一个元素加1,从而产生另外一个RDD

2)匿名函数的语句

intRDD.map(x => x + 1).collect()

lambda表达式方式

3)匿名函数+匿名参数

intRDD.map(_ + 1).collect()

采用下划线_来取代参数 x => x + 1

 

4>、filter运算(可以用户对RDD内每个元素进行筛选,并且产生另外的RDD)

intRDD.filter(x => x < 3).collect()

intRDD.filter(_ < 3).collect()

stringRDD.filter(x => x.contains("ra")).collect()

5>、distinct运算(删除重复的数据)

intRDD.distinct().collect()

stringRDD.distinct().collect()

6>、randomSplit运算(可以将整个集合元素,以随机数的方式按照比例分为多个RDD)

val sRDD = intRDD.randomSplit(Array(0.4,0.6))

运行返回是sRDD数组

sRDD(0).collect()

sRDD(1).collect()

7>、groupBy运算(可以根据传入的匿名函数规则,将数据分为多个Array)

将集合分为奇数和偶数

val gRDD = intRDD.groupBy(x => {if(x % 2 == 0) "even" else "odd"})

8>、多个RDD转换

创建3个RDD

val intRDD1 = sc.parallelize(List(3,1,2,5,5))

val intRDD2 = sc.parallelize(List(5,6))

val intRDD3 = sc.parallelize(List(2,7))

 

union并集

intRDD1.union(intRDD2).union(intRDD3).collect()

(intRDD1 ++ intRDD2 ++ intRDD3).collect()

intersection并集

intRDD1.intersection(intRDD2).collect()

subtract差集

intRDD1.subtract(intRDD2).collect()

cartesian笛卡尔积

intRDD1.cartesian(intRDD2).collect()

9>、基本动作运算

intRDD.first//读取第一条

intRDD.take(2)//读取前几条

intRDD.takeOrdered(3)//按照从小到大排序读取前N条数据

intRDD.takeOrdered(3)(Ordering[Int].reverse)//按照从大到小排序读取前N数据

 

intRDD.stats//统计

intRDD.min//最小值

intRDD.max//最大值

intRDD.stdev//标准差

intRDD.count//计数

intRDD.sum//求和

intRDD.mean//平均

10>、RDD Key-Value基本转换运算

val kvRDD1 = sc.parallelize(List((3,4),(3,6),(5,6),(1,2)))//创建RDD

kvRDD1.keys.collect()//列出所有的Key值 3,3,5,1

kyRDD1.values.collect()//列出所有的value值 4,6,6,2

kvRDD1.filter{case (key,vakue) => key <5}.collect//筛选key<5

kvRDD1.filter{case (key,value) => value <5}.collect//筛选value<5

kvRDD1.mapValues(x => x * x).collect//将每一组Key,Value的value值进行平方运算

kvRDD1.sortByKey(true).collect()//从小到大按照key排序

kvRDD1.sortByKey(false).collect()//从大到小按照key排序

kvRDD1.reduceByKey((x,y)=>x+y)//将具有相同key值的数据合并,合并的方式是按照传入的匿名函数

11>、多个RDD Key-Value转换运算

join//将两个RDD按照相同的key值join起来

leftOuterJoin//从左边的集合对应到右边的集合,并显示所有左边集合中的元素,Some,None

rightOuterJoin

subtractByKey//删除相同key值的数据

 

 

 

2、Spark读取数据

1、读取本地文件

val tf = sc.textFile("/usr/local/test.txt")

(在集群模式下必须保证每台服务器都必须有这个文件)

2、读取hdfs文件

val tf = sc.textFile("hdfs://hadoop01:9000/usr/local/test.txt")

### 多级缓存设计与实现 多级缓存作为一种常见的性能优化手段,在实际应用中通常涉及本地缓存和分布式缓存的组合使用[^2]。其核心目标在于通过分层的方式降低对底层存储系统的依赖,从而提升响应速度并增强系统吞吐量。 #### 设计原则 在多级缓存的设计过程中,需综合考虑以下几个方面: 1. **缓存层次划分**:根据数据访问频率、延迟敏感程度等因素合理分配各级缓存的角色。例如,HTTP 缓存和 CDN 缓存主要用于静态资源加速,而 Redis 则适合作为动态数据的分布式缓存[^5]。 2. **一致性保障**:由于存在多个级别的缓存实例,如何保持它们之间的同步成为一大挑战。可以通过消息队列(如 RocketMQ 或 Kafka)来通知其他节点更新状态,进而达到最终一致性效果[^1]。 3. **淘汰策略配置**:针对不同类型的数据设定合理的过期时间或者采用 LRU/LFU 等机制自动清理不常用项,以此维持内存空间的有效利用率[^3]。 #### 技术选型建议 以 Java 开发为例,可以选用 Caffeine 库构建高效的本地缓存方案,同时搭配 Redis 完成跨机器间共享的大规模数据管理任务[^4]。下面给出一段简单的代码演示: ```java import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; public class MultiLevelCacheExample { private final Cache<String, String> localCache = Caffeine.newBuilder() .maximumSize(10_000) .expireAfterWrite(10, TimeUnit.MINUTES) .build(); public void put(String key, String value){ // 尝试先写入本地缓存 this.localCache.put(key,value); // 后续逻辑可扩展至远程持久化层... } } ``` 上述片段展示了基于 Caffeine 的基础封装方法,开发者能够轻松定义最大条目数以及写入超时参数等内容。 --- ### 多级缓存应用场景分析 以下是几种典型的适用场景描述: 1. **高频读取低频修改的操作** 对于那些频繁被查询却很少发生变化的内容非常适合运用多级缓存技术加以保护。比如电商网站中的商品分类列表或是新闻门户首页推荐文章集合等均属于此类范畴。 2. **热点数据分析处理** 当某些特定时间段内的请求集中指向少数几个对象时,则可通过预先加载这些可能成为焦点的目标进入更靠近客户端一侧的小范围高速缓冲池里快速返回结果给用户端感知不到任何延迟现象发生. 3. **地理分布广泛的服务体系结构下** 如果应用程序部署在全球各地不同的数据中心位置上运行的话那么借助CDNs之类的工具就可以很好地缓解远距离传输带来的额外耗损问题同时也减少了源站服务器的压力负担. --- ### 多级缓存架构概述 一个完整的多级缓存架构往往由以下几部分组成: - **前端代理层**: 如 NGINX 配合反向代理功能提供初步过滤筛选作用. - **边缘网络节点(CDN)**: 存储最常使用的公共资源文件副本以便更快送达终端消费者手中. - **中间件组件(MQ/ESB etc.)**: 协助完成异步事件传递职责用于维护整体健康状况良好运转无误. - **近程内存区域(Local In-Memory Store)**: 提供极致的速度体验但受限于硬件规格大小限制条件较多. - **后台数据库仓储设施(RDBMS,NoSQL Solutions)**: 承担长期保存重要记录使命确保不会因为意外丢失造成不可挽回损失. 综上所述可以看出良好的规划至关重要才能充分发挥各自优势特性最大化收益回报率水平. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值