spark 第五天

hadoop web为standy,将其变为active:hdfs haadmin -transitionToActive --forcemanual nn1
spark
---------------
scala语言写的

RDD
----------------
resilient distributed datatest,弹性分布式数据集
val


调度器
----------------
三级调度
第一级 1.DAGScheduler //有向无环图调度器,Stage。
//
第二级 2.TaskSchedulerimpl //任务调度器,TaskSet
//TaskchedulerTmp1
第三级 3.SchedulerBackend //后台调度器。//1个本地,1个独立模式
//localSchedulerBackend针对本地模式(调试测试)
//CoarseGrainedSchedulerBackend粗粒度调度器
//standaloneScheduler继承于CoarseGrainedSchedulerBackend粗粒度。
调度依赖关系
DAGScheduler 依赖于 TaskScheduler 依赖于 SchedulerBackend
--master local[*] *是cpu个数,或者自己写并发指定个数
sparkdriver:spark客户端

RDD.collect会调用saprkcontext runjob ->DAGScheduler ->TaskScheduler -> SchedulerBackend
先进先出资源调度构建器 FIFOSchedulableBuilder:先进先出:你先来的,所有资源都给你
公平资源调度构建器 FairSchedulableBuilder:平分资源
*****************************************************************************************************************
本地模式下
val rdd3 = rdd2.map(w=>(w,1))要走的流程
--------------------------------------------------------------------------------------------
1.DAGScheduler
DAGScheduler:把RDD作业变成事件,放到队列(eventProcessLoop)里去RDD被封装到JobSubmitted,
其中spark会开启一个线程Thread轮循,然后处理过程再次交给DAGScheduler,(DAG调度器中封装了很
多处理这些事情的方法,可直接调度),用handleJobSubmmited():处理 ,然后创建阶段ResultStage=
CreateStage(),然后提交阶段(递归过程)submiteStage(resultStage),此过程完成后,再进行submitejob
(提交任务) 通过stage ==》转化为 Seq(Task)(任务集) 提交到第二级调度器
-------------------------------------------------------------------------------------------------
2.TaskSchedulerimpl
submitTasks(TaskSet(task...))交给TaskSetManager(任务集管理器)然后将TaskSetManager放入
FIFOSchedulableBuilder的pool,然后由FIFOSchedulable进入第三级调度器
----------------------------------------------------------------------------------------------------
3.SchedulerBackend
reviveOffers():(属于任务调度器),拿到所有的任务集合excutor.launchTask 执行val tr = new TaskRunner(context,
threadPool.execute(tr))执行的是taskrunnable的run函数,在taskrunnable.run里面开始分线程处理,再调用task.runtask()
回调子类的方法,我们一般用ShuffleMapTask.runTask()的sc反序列化广播变量==》rdd+shuffleDep再调用
SortShuffleWrite.write()方法,此方法就是调用我们自己的代码,write再调用我们RDD的处理函数
-----------------------------------------------------------------------------------------------------
************************************************************************************************************************
完全分布式最好在hadoop上找文件,若在本地,若文件内容不同,会出现不同结果

在spark集群上hdfs文件进行单词统计
-------------------------------------------------------------------
0.分别启动zk
1.启动hadoop集群#start-dfs.sh
#hdfs haadmin -transitionToActive --forcemanual nn1 //激活为active
只启动hdfs即可
查看50070是否成功
2.启动spark集群
进入 #cd /opt/spark/sbin
#./start-all.sh
查看8080是否成功
退出hdfs安全模式
3.启动spark-shell,连接到master上去,spark://master:7077
4040看任务状态等
4.在shell环境下编写wordcount文件,-put到hdfs
5.直接spark-shell --master spark://192.168.218.134:7077
spark-shell --master spark://192.168.218.134:7077
6.scala里 >sc.textFile("hdfs://192.168.218.134:9000/user/word.txt").flatMap(_.split(" ")).map(w=>(w,1)).reduceByKey((a,b)=>a+b).collect
因为50070webui的active旁是9000而不是8020,所以hdfs路径里写9000
7.多玩密码统计
scala>rdd = sc.textFile("hdfs...").map(_.split("\\s")).filter(_.length > 2).map(e => (e(2),1)).reduceByKey((a,b)=>a+b).collect
//collect可换成first()或者take()
// \\s表示非可见字符,第一个map后,每个元素是数组,2是第二列,filter(_.length > 2)为过滤,去掉长度小于2的,
// .map(e => (e(2),1))变为元祖相当于map(w=>(w,1)),

spark-shell
-----------------------------------------------------------------------
启动带参数。
spark-shell --help //查看帮助
//--executor-memory 最少是450M,默认1g

service NetworkManager stop //结束
service NetworkManager start //开始
service NetworkManager status //查看状态

导出spark应用成jar包,提交给spark集群上执行。
0.在代码system.out.println("over");上面一行加入rdd4.saveAsTextFile("/home/admin/") //此为作为文件存在/home/admin/下
1.通过idea的maven导出jar包
idea->maven project - life cycle -> package 右键 ->run ...
2.生成jar包
3.复制myspark210-1.0-SNAPSHOT.jar到master节点

4.进入master节点

5.用spark-submmit --class com.it18zhang.spark.WordCount --name wc --master spark://master:7077 myspark210-1.0-SNAPSHOT

 

 

 

 

 

 

 

rdd常用操作
------------------------------------------------------------------------
1.val rdd = sc.parallelize(Array(1,2,3,4)) //创建静态数组,parallelize为静态
2.rdd.sortBy(1 => 1,false) //返回值为RDD,false就降序,true为升序,Array(4,3,2,1)

1.val rdd =sc.textFile("hdfs...").map(_.split("\\s")).filter(_.length > 2).map(e => (e(2),1)).reduceByKey((a,b)=>a+b)
2.rdd.sortBy(e=>e _2,false).first //降序取第一个
3.rdd.sortBy(e=>e _2,false).take(10) //降序取前十

rdd.collect
rdd.count //统计个数
rdd.sum //加起来总数
rdd.max //最大数
rdd.min //最小数
并发度
1.scala>val rdd=sc.parallelize(1 to 10,1) //,后面的为并发度,指定多少线程同时工作不能超过自己默认的并发度[4],一般单核不超过4
2.scala>rdd.map(e=>{val tname = Thread.currentThread().getName ; println(tname + ":" +e)}).collect //可看并发度

1.scala>val rdd = sc.makeRDD(1 to 10,4) //makeRDD与parallelize相同
2.scala>rdd.foreach(println) //打印1-10

glom
scala>val rdd = sc.parallelize(1 to 10).glom.collect //glom按照分区数分数组,分区为多少就是几个数组

groupBy //分组
1.scala>val rdd = sc.parallelize(Array(("an",1),("c",1),("d",2),("e",2))) //name + id
2.scala>rdd.groupBy(e=>e _2).collect //按id分组
1.scala>val rdd = sc.parallelize(Array((1,"a"),(1,"aa"),(2,"b"),(3,"bb"))) //id+name
2.scala>rdd.groupBy(e=>e _1).collect //(e=>e _1)此中数字为1则按前面的分,为二则按第二个分
2.scala>rdd.groupByKey.collect //对rdd的元素按照key进行分组,迭代部分都为value

rdd.groupWith
---------------------------------
【准备数据】
100->an
200->c

100->20
200->30
1.val rdd1=sc.makeRDD(Array((100,"an"),(200,"c")))
2.val rdd2=sc.makeRDD(Array((100,20),(200,30)))
3.rdd1.groupWith(rdd2).collect //(100(an,20)),(200(c,30))

rdd.intersection
--------------------------------------
提取rdd之间的交集
scala>val rdd1 = sc.makeRDD(Array("a","b","c"))
scala>val rdd2 = sc.makeRDD(Array("b","d","f"))
rdd1.intersection(rdd2).collect

rdd.top()
----------------------------------------
提取rdd最大(倒序)的n个元素
1.val rdd3 = sc.makeRDD(Array(1,2,3,4,5,10,6,8,3)) //
2.rdd3.top(1) //top(1)最大的数
字符串就为倒序
1.val rdd1 = sc.makeRDD(Array("a","b","c"))
2.rdd1.top(1) //倒序出c

正常输出顺序
1.val rdd1 = sc.makeRDD(Array("a","b","c"))
2.rdd1.top(1)(scala.math.Ordering.String.reverse) //正常顺序,输出a
3.rdd1.top(1)(scala.math.Ordering.String) //仍为c

rdd.join
-------------------------------------------
连接两个rdd,形成一个新的rdd
【数据】
(1 "a" ) join (1 ,800) -->(1,a,100)
(2 "b" ) join (2 ,600) -->(2,b,80)
1.scala>var rdd1 = sc.makeRDD(Array((1,"a"),(2,"b")))
2.scala>var rdd2 = sc.makeRDD(Array((1,800),(2,600)))
3.rdd1.join(rdd2).collect

join嵌套可以加多个
1.scala>var rdd1 = sc.makeRDD(Array((1,"a"),(2,"b")))
2.scala>var rdd2 = sc.makeRDD(Array((1,(800,3)),(2,(700,3))))
3.rdd1.join(rdd2).collect

 

posted @ 2018-07-27 22:50  小#安  阅读(82)  评论(0编辑  收藏  举报