复习总结09:Spark

一、关于Spark
spark-shell:启动

/usr/local/spark-1.5.2-bin-hadoop2.6/bin/spark-shell \

--master spark://node1.itcast.cn:7077 \            #指定Master的地址

--executor-memory 2g \    #指定每个worker可用内存为2G

--total-executor-cores 2   #指定整个集群使用的cup核数为2个


注意:

如果启动spark shell时没有指定master地址,也可以正常启动spark shell和执行spark shell中的程序。此时是local模式,该模式仅在本机启动一个进程,没有与集群建立联系。

Spark Shell中已经默认将SparkContext类初始化为对象sc。用户代码如果需要用到,则直接应用sc即可


二、如果利用IDEA,建立的是maven项目,导入pom.xml里面的依赖包
使用Maven打包:首先修改pom.xml中的main class
点击Lifecycle,选择clean和package,然后点击Run Maven Build   这才打包!!

启动hdfs:start-dfs.sh
启动spark :apps/spark/sbin/start-all.sh

使用spark-submit命令提交Spark应用(注意参数的顺序)
apps/spark/bin/spark-submit \
--class cn.itcast.spark.WordCount \
--master spark://node1.itcast.cn:7077 \
--executor-memory 2G \
--total-executor-cores 4 \
/home/hadoop/spark-mvn-1.0-SNAPSHOT.jar \
hdfs://node1.itcast.cn:9000/words.txt \
hdfs://node1.itcast.cn:9000/out


……………………………………………………………………………………………Spark SQL………………………………………………………………………………………………………
一、Spark SQL概述
Hive:将HiveSQL转换成MapReduce然后提交到集群上执行。由于MapReduce这种计算模型执行效率比较慢。
Spark SQL:它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率更快!
在spark下操作SQL其实是操作的DataFrames。只有将RDD转换成DataFrames后,才可用Spark SQL语句。构造数据库,toDF,使用Spark SQL

二、创建DataFrames
在Spark SQL中SQLContext是创建DataFrames和执行SQL的入口。 Spark离线计算使用的是sc,执行的入口。
在spark shell执行下面命令,读取数据,将每一行的数据使用列分隔符分割
1
val lineRDD = sc.textFile("hdfs://node1.itcast.cn:9000/person.txt").map(_.split(" "))
2
case class Person(id:Int, name:String, age:Int)   //定义case class(相当于表的schema)
3
val personRDD = lineRDD.map(x => Person(x(0).toInt, x(1), x(2).toInt))    //匿名函数,直接返回一个由该元组构成的对象Person
4
val personDF = personRDD.toDF           //RDD转换成DataFrame
5
personDF.show     //对DataFrame进行处理
6
 
        
7
//查看DataFrame部分列中的内容
8
personDF.select(personDF.col("name")).show
9
personDF.select(col("name"), col("age")).show  //可以无列对象DataFrames标识
10
personDF.select("name").show   // 可以无对象标识
11
 
        
12
//打印DataFrame的Schema信息
13
personDF.printSchema
14
 
        
15
//查询所有的name和age,并将age+1
16
personDF.select(col("id"), col("name"), col("age") + 1).show
17
personDF.select(personDF("id"), personDF("name"), personDF("age") + 1).show
18
 
        
19
personDF.filter(col("age") >= 18).show    //过滤age大于等于18的
20
 
        
21
personDF.groupBy("age").count().show()   //按年龄进行分组并统计相同年龄的人数
22
 
        
关于SQL风格语法
如果想使用SQL风格的语法,需要将DataFrame注册成表
personDF.registerTempTable("t_person")
//查询年龄最大的前两名
sqlContext.sql("select * from t_person order by age desc limit 2").show
//显示表的Schema信息
sqlContext.sql("desc t_person").show
1
  def main(args: Array[String]) {
2
     LoggerLevels.setStreamingLogLevels()
3
 
        
4
     val conf = new SparkConf().setAppName("SQLDemo").setMaster("local")
5
     val sc = new SparkContext(conf)
6
     val sqlContext = new SQLContext(sc)
7
     System.setProperty("user.name", "bigdata")
8
 
        
9
     val personRdd = sc.textFile("hdfs://server:9000/sz.dat").map(line => {
10
       val fields = line.split(",")
11
       Person(fields(0).toLong, fields(1))
12
     })
13
 
        
14
     import sqlContext.implicits._
15
     val personDf = personRdd.toDF
16
 
        
17
   # personDf.filter("id > = 2").show()
18
    personDf.registerTempTable("person")
19
   #使用sql语句来进行操作
20
    sqlContext.sql("select name from person where id >= 2 ").show()
21
    sc.stop()
22
 
        
23
  }
24
 
        
……………………………………………………………………………………Spark RDD………………………………………………………………………………………………
一、RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象
RDD是一个不可变、可分区、里面的元素可并行计算的集合。
RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。
RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
二、创建
1)val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))   //由一个已经存在的Scala集合创建。
2)val rdd2 = sc.textFile("hdfs://node1.itcast.cn:9000/words.txt")   //由外部存储系统的数据集创建。
比如包括本地的文件系统,还有所有Hadoop支持的数据集,比如HDFS、Cassandra、HBase等
三、RDD的算子
Transformation:RDD中的所有转换都是延迟加载的,只有dirver动作时,转换才会真正进行。
四、宽窄依赖
窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用。总结:窄依赖我们形象的比喻为独生子女。宽依赖反之
………………………………………………………………………………Spark Streaming………………………………………………………………………………
一、Spark Streaming   类似于apache storm 
补充:可以比对Spark体系下离线系统与实时计算系统 和 Hadoop系统的。
 
二、相关案例,整理API
①StreamingWordCount:实现统计端口9000发送的单词计数
IDEA端执行程序,设置日志级别
nc -lk 9000
#输入信息
1
def main(args: Array[String]) {
2
 
        
3
    LoggerLevels.setStreamingLogLevels()
4
    #配置StreamingContext
5
    val conf = new SparkConf().setAppName("StreamingWordCount").setMaster("local[2]")
6
    val sc = new SparkContext(conf)
7
    val ssc = new StreamingContext(sc, Seconds(3))  #每3秒扫描一下端口
8
    
9
    #接收数据
10
    val ds = ssc.socketTextStream("server", 8999)  //从socket端口拉取数据;返回的是DStream 离散化数据流
11
    #DStream是一个特殊的RDD
12
 
        
13
    val result = ds.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_)  #操作的是该批次batches,该批次累计加
14
    #打印结果
15
    result.print()
16
    ssc.start()
17
    ssc.awaitTermination()
18
  }
19
 
        
②StateFullWordCount:实现累加模式,计算单词计数
val result = ds.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_)  #操作的是该批次batches,该批次累计加
改为:
val results = lines.flatMap(_.split(" ")).map((_,1)).updateStateByKey(updateFunc, new HashPartitioner(ssc.sparkContext.defaultParallelism), true)
1
val updateFunc = (iter: Iterator[(String, Seq[Int], Option[Int])]) => {
2
 iter.map{
3
  case(word, current_count, history_count) =>
4
  (word, current_count.sum + history_count.getOrElse(0))  #0是为历史初始值,从0处叠加
5
 }
6
}

③FlumePollWordCount:实现Flume 拉式 单词计数
   FlumePushWordCount:实现Flume 推式 单词计数
linux上:启动flume,开启对某个文件的检测,
启动程序,然后echo “word”>> 1.log,在console看到单词计数,显示。
1
def main(args: Array[String]) {
2
 
        
3
    LoggerLevels.setStreamingLogLevels()
4
    val conf = new SparkConf().setAppName("FlumeWordCount").setMaster("local[2]")  //!!!选择是否本地,本地的时候带有local,集群填写集群的地址
5
    val ssc = new StreamingContext(conf, Seconds(5))
6
 
        
7
     #一、从flume中拉取数据(flume的地址)
8
   # val address = Seq(new InetSocketAddress("192.168.137.10", 8999))
9
   # val flumeStream = FlumeUtils.createPollingStream(ssc, address, StorageLevel.MEMORY_AND_DISK)
10
 
        
11
 
        
12
     #二、推送方式: flume向spark发送数据
13
   # val flumeStream1 = FlumeUtils.createStream(ssc, "server", 8999)    //flume中的数据通过event.getBody()才能拿到真正的内容
14
   
15
    
16
    val words = flumeStream1.flatMap(x => new String(x.event.getBody().array()).split(" ")).map((_, 1))
17
    val results = words.reduceByKey(_ + _)
18
    results.print()
19
    ssc.start()
20
    ssc.awaitTermination()
21
  }

④KafkaWordCount:实现Kafka读取单词计数
启动Kafka,开启生产者服务,启动程序,在生产者输入信息,看到console输出单词计数
1
    val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap
2
    val data = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap, StorageLevel.MEMORY_AND_DISK_SER)
3
    

备注:spark-flume:FlumeUtils.createStream()   createPollingStream() 创建spark与flume之间的数据流,然后对取到的数据处理。
spark-Kafka:KafkaUtils.createStream() 创建spark与Kafka的数据流,对取到的数据进行处理。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值