spark学习(五)RDD

(一)进入spark-shell命令界面(默认使用scala的命令界面)

  1,如果进入了spark安装目录则使用、

  1,一台机器启动spark:./bin/spark-shell --master <master-url>命令可进入shell界面,master-url参数可为:local[*]使用逻辑CPU多线程启动,local[n],使用n个CPU线程启动

  2,集群下启动spark:spark://主机IP:7077(默认端口)

  3,在CLASSPATH中添加jar包:./bin/spark-shell --master local[4] --jars code.jar

  4,退出:(:quit)

  5,可以访问端口hadoop:4040看到任务执行情况

 2,Yarn集群模式:

  yarn-client:客户端电脑不能关,调试阶段

  

  yarn-cluster:客户端电脑关了不影响,正常使用阶段

  

 

  3,sbt是一款Spark用来对scala编写程序进行打包的工具(使用林子雨的教程没安装成功)

  安装教程(参考):https://blog.csdn.net/Leader_wang/article/details/83743772

       https://blog.csdn.net/litianxiang_kaola/article/details/103289326
        两个教程相结合即可。

  打包教程(参考):http://dblab.xmu.edu.cn/blog/1307-2/

  sbt打包程序时使用:先新建~/.sbt/repositories文件

[repositories]
#local
public: http://maven.aliyun.com/nexus/content/groups/public/#这个maven
typesafe:http://dl.bintray.com/typesafe/ivy-releases/ , [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly#这个ivy
ivy-sbt-plugin:http://dl.bintray.com/sbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]#这个ivy
sonatype-oss-releases

sonatype-oss-snapshots

    然后使用sbt -Dsbt.override.build.repos=true命令执行,然后在sbt界面输入run;自动退回项目原目录,再使用林子雨打包教程进行操作;不然下载依赖包会一直卡住不到。

  使用sbt创建项目然后导入Eclipse:在导入插件前,要先下载插件.zip到系统;可以参考https://blog.csdn.net/dkl12/article/details/80224035http://dblab.xmu.edu.cn/blog/1490/

  4,安装IDEA:

    1,安装IDEA和破解:https://www.cnblogs.com/shaoyu/p/11637968.html

    2,安装:https://blog.csdn.net/ma2622595880/article/details/88897041

    3,关联scala和sbt:http://dblab.xmu.edu.cn/blog/1492-2/

RDD编程,使用了装饰者设计模式

  1,创建RDD,是一个抽象类

    方式一:从文件系统加载数据:包括本地,hdfs,云存储

      

     启动spark-shell报错: A read-only user or a user in a read-only database is not permitted to disable read-only mode on a connection

    解决办法:https://blog.csdn.net/u010886217/article/details/83685282

    启动spark-shell报错:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    解决办法:https://blog.csdn.net/u010675669/article/details/81868415

    Hadoop的9000端口无法连接:https://blog.csdn.net/u011170921/article/details/80437937(namenode没有启动)

    

     

   方式二:通过集合或数组创建RDD:

    

  2,操作RDD:

    只有到动作类型操作才会进行计算,转换类型操作只会记录

 

    

    

     1,filter(具体函数)操作:

      

       

      2,map(具体函数)操作:

      

       

       

       

            

    3,flatMa(具体函数)p操作:

      

      

      

     4,groupByKey()操作:进行分组得到(key,value-list)

      

    5,reduceByKey(具体函数)操作:

      

   

   每遇到一次动作操作就会从头到尾计算一次RDD,生成一个job;如果需要前一次的动作操作生成的值,则需要将生成的值缓存

      

       

       

   3,RDD持久化

     每遇到一次动作操作就会从头到尾计算一次RDD,生成一个job;如果需要前一次的动作操作生成的值,则需要将生成的值缓存

    RDD持久化方法:调用.persist()方法对一个RDD标记为持久化,但不会真正持久化;等遇到下一次动作操作就会真正持久化

    会将值存入内存;当内存不足,则替换之前内存存的值 

    RDD.persist(MEMORY_ONLY)<=>RDD.cache()

     将值存入内存,当内存不足,会将存不下的值存入磁盘

     将缓存中的持久化的RDD从内存中移除: .unpersist()方法

    

     4,RDD分区:增加程序的并行度实现分布式的计算;减少通信开销;与hdfs的分块不一样

      分区原则:

      

 

       默认分区命令:如果设置local【n】,则分区为n;Apache  Mesos模式会默认设置分区为8;standalone和yarn模式设置时,当集群中所有CPU数为n;与另一个?(是什么)比较,值最大的设置为分区数

      

      设置分区数:

      

       重设分区数:使用.repartition(n)方法

      

      分区信息:

       

 

       

     

    

     

 

     

     5,案例:单词统计:

    

   spark异常关闭导致再次启动时端口占用错误: https://blog.csdn.net/weixin_40040107/article/details/90745038

  3,键值对RDD:

    

    keys的功能:Pair  RDD指键值对RDD

      

    values的功能:

          

    sortByKey()方法:常用,根据key进行排序,默认升序排序(默认参数为true)

    sortBy()方法:根据value进行排序

      

     mapValues()方法:

      

     join:

      

   例子:求图书馆每个书的月平均销量

    

    

 文件数据读写:

  1,本地数据文件读写:输入错误语句,不会报错,只有遇到一次动作类型操作才会报错(惰性机制)

    读操作:当读取的是一个目录时,会把目录下所有文件都读进去生成一个RDD

    写操作:指定的目录中writeback文件必须是不存在的,执行写操作时才创建

    

    写入后会在指定目录下会生成的,当只有一个分区时,只会生成part-00000开头文件和_SUCCESS开头文件

 

     

   2,hdfs文件内容读写:与读取本地文件的操作一致

  3,JSON文件内容读写:scala中与json解析操作有关的库(scala.util.parsing.json.JSON

    

    

     

    读取:

     

package WordCount

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import scala.util.parsing.json.JSON
object WordCount {
  def main(args: Array[String]) {
    val inputFile =  "file:///opt/modules/spark-2.1.0/examples/src/main/resources/people.json"
    val conf = new SparkConf().setAppName("WordCount").setMaster("local[2]")
    val sc = new SparkContext(conf)    //生成一个SparkContext对象
    val jsonStrs = sc.textFile(inputFile)   //加载json文件
    val result = jsonStrs.map(s => JSON.parseFull(s))
    result.foreach( {r => r match {
      case Some(map: Map[String, Any]) => println(map)    //解析成功封装为Some对象
      case None => println("Parsing failed")              //解析失败返回None对象
      case other => println("Unknown data structure: " + other)
        }
       }
      )
  }
}

运行截图:

  4,读取HBASE数据:HBASE通过(表名,行键,列族,列限定符)确定一个单元格,一个数据

 

     

 

     回顾HBASE操作:

      1,创建表student:

      

       2,向表student中添加数据:

                 

      

       3,查看表:scan  “student”

      

  

 

 

 

 

 

 

 

     

 

     

 

   

   

 

posted on 2020-01-28 23:22  不愧下学  阅读(493)  评论(0编辑  收藏  举报

导航