RDD(Risilient Distributed DataSets) 弹性分布式数据集
它是一个只读的,可分区的分布式数据集,这个数据集的全部或者部分缓存在内存中,可以多次计算和复用。
Scala语法:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/120549893
一、RDD基础
(一)RDD创建方式
加载文件
1.从本地文件系统中加载文件
val textfilelocal=sc.textFile("file://usr/README.md")
2.从分布式文件系统hdfs中加载
val textfile=sc.textFile("/user/root/README.md")
上面的sc是Spark context的一个对象
上面的textfile和textfilelocal就是RDD对象。
官网案例:RDD Programming Guide - Spark 3.1.2 Documentation
通过并行集合
1.数组
array是一个数组名字,Array是一个数组
通过sc调用parallelize方法得到的arrayRdd是一个RDD对象
2.列表
list是一个List类的对象
listRdd是一个RDD对象
(二)RDD操作(转化和动作)
1.转化(Transformation):只会对RDD对象转换进行轨迹记录,不会做真正的计算,仍然会返回RDD对象
filter(func):对RDD对象内的数据进行过滤筛选
foreach是对行进行循环遍历,println() 是换行输出
map(func)
对arrayRdd里的元素分别+3 然后循环输出
flatMap(func)
从上面的输出结果可以看出,flatMap的作用就是根据传入参数的处理结果查分开了
splite(" ")的作用就是把
"Hadoop is good" 转变成 字符串数组 Array("Hadoop","is","good")
"Spark is good" 转变成 字符串数组 Array("Spark ","is","good")
"Hbase is very good" 转变成 字符串数组 Array("Hbase ","is","very","good")
然后再被压扁合成一个Rdd ,每一个单词元素都是一个Rdd里的行元素
groupByKey(func) :应用于(K,V)键值对的数据集时,返回一个新的(K,Iterable)形式的数据集。按照key进行分组,可以相同的就把相同key的值合并成一组
reduceByKey(func):应用于(K,V)键值对的数据集时,返回一个新的(K,V)的数据集,其中的value是将key传递到函数func中进行聚合(给定义一种算法,比如把这些值相加或者其他处理)得到的结果
combineByKey
2.动作(计算)
count():返回数据集元素的个数
collect():以数组Array形式返回数据集中的所有元素
first():返回数据集第一个元素
take(n):获取数据集中的前n个元素,并且以数组形式返回
reduce(func):通过func(输入两个参数返回一个参数)来聚合数据集中的元素
foreach(func) :将数据集中的每个元素传递到函数func中运行
惰性机制 是指 整个转换过程中只是记录了转换的轨迹,并没有发生 真正的计算,也即是只有执行 “动作”时才会计算
在/usr下 vi README.md 添加如下内容
保存后把文件上传到hadoo的hdfs下 的/user/root下
如果爆出以下错误信息,需要执行设置模式的的指令 hadoop dfsadmin -safemode leave
put: Cannot create file/user/jinxing._COPYING_. Name node is in safe mode.
这样就可以把安全模式关闭
继续执行上传,这里要注意把防火墙都关闭,否在会提示数据节点无法访问异常提示
切换到root去关闭防火墙。然后再切换回jinxing账号 执行上传
切换目录到Spark的sbin目录下启动Spark master和slaves
切换换到bin目录下执行spark-shell
完成README.md文件中的单词格式统计,里面用到了hdfs系统文件加载,
flatMap 压扁单词,
map 映射每个单词与个数1映射
reduceByKey 进行个数的相加
collect 以数字的形式返回数据集中的所有元素
foreach 循环输出每个元素
(三)、持久化
可以通过“持久化(缓存)”机制来避免这种重复计算的开销,具体做法就是调用persist()方法对一个RDD标记为持久化,但是调用该方法时并不会立即计算生成RDD并把它持久化,而是调用persist()后遇到第一次计算以后,把计算结果持久化,
持久化后的RDD将会被保留在计算机节点的内存中,被后面的行动操作重复使用。
持久化级别:
MEMORY_ONLY :将RDD作为反序列化的对象存储于JVM中,内存不足时按照LRU原则替换缓存内容
MEMORY_AND_DISK:将RDD作为反序列化的对象存储于JVM中,内存不足时超出部分的分区持久化的硬盘
(四)、分区
RDD数据存储是按分区来管理的,每一个分区包含一部分数据。分区可以在不同节点上计算。
二、键值对RDD:使用map(fun) 可以返回键值对
(一) 键值对RDD的创建
(二) 常用键值对转换
三、数据读写
(一)文件数据读写
1.本地文件系统的读写
1.1 从文件中读取数据创建RDD
1.2 把RDD写入到文件文本
2.分布式文件系统HDFS的读写
2.1 从分布式系统HDFS读取文件创建RDD
2.2 把RDD写入HDFS系统
注意这里的wordCount是一个目录
上面的part-00000就是被保存的文件内容
因为上面进入启动spark-shell时没有指定任何参数,并且在创建RDD时没有指定分区个数,默认就是一个文件分区。
可以使用上面的方式在创建RDD时指定分区个数。
3.JSON文件的读取
编写前需要先安装和配置HBase,参考
1.创建一个HBase表
2.配置Spark
3.编写程序读取HBase数据
4.编写向HBase写入数据的程序