D31 Spark的checkpoint/sql/dataframe

来源:互联网 发布:剑灵强制交易软件 编辑:程序博客网 时间:2024/06/08 01:15
A:本地提交word count执行出现用户权限问题
设置hdfs-site.xml 设定用户都可以写入后即可
  1. <!--new adding-->
  2. <property>
  3. <name>dfs.permissions</name>
  4. <value>false</value>
  5. </property>

B checkpoint
  1. scala> sc.setCheckpointDir("hdfs://server:9000/ck20160519") //必须是新建的
  2. val rdd =sc.textFile("hdfs://server:9000/wc") //必须是已经存在的
  3. rdd: org.apache.spark.rdd.RDD[String] = hdfs://server:9000/wc MapPartitionsRDD[3] at textFile at <console>:27
  4. scala> rdd.checkpoint
  5. scala> rdd.count
  6. res4: Long = 12                                                                 
  7. scala> val rdd2 =rdd.map(_.split(" ")).map(x=>(x(1),1)).reduceByKey(_+_)
  8. rdd2: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[13] at reduceByKey at <console>:29
  9. scala> rdd2.checkpoint
  10. scala> rdd2.collect
  11. res10: Array[(String, Int)] = Array((jeff,3), (tom,3), (shabi,3), (blank,3))
  12. …………………………………………………………………………………………………………………………………………………………
  13. scala> rdd2.cache()
  14. res11: rdd2.type = ShuffledRDD[13] at reduceByKey at <console>:29
  15. scala> rdd2.checkpoint
  16. scala> rdd2.collect
  17. res13: Array[(String, Int)] = Array((jeff,3), (tom,3), (shabi,3), (blank,3))

checkpoint保存的目录是在HDFS目录中,保证了存储的可靠性。

sc.setCheckpointDir("hdfs://master:9000/..")//会在..目录创建一个文件夹rdd.checkpointrdd.collect

checkpoint和cache一样,是transformation当遇到action时,checkpoint会启动另一个任务,将数据切割拆分,保存到设置的checkpoint目录中。计算存储到外部,并且之前的依赖删除,直接从checkpoint中拿

C cache

当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用(不需要重新计算)。这使得后续的动作变得更加迅速。RDD相关的持久化和缓存,是Spark最重要的特征之一。

val rdd = sc.textFile("hdfs://172.23.27.19:9000/wrd/wc/srcdata/").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)rdd.cache()//现在没有缓存rdd.collect//遇到action开始缓存

.cache()是一个transformation。在job的storage页面也可以看到缓存信息。.unpersist(true)释放这个资源


备注:相当于设置进程的断点,在此处把数据保存下来,cache是保存到内存;checkpoint是把该断点处的数据保存到hdfs上。


D DAG有向无环图

E:DataFrame
  1. val rdd =sc.textFile("hdfs://server:9000/person.txt").map(_.split(","))
  2. rdd: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[14] at map at <console>:27
  3. scala> case class Person(id:Long,name:String,age:Int)
  4. defined class Person
  5. scala> val personRDD=rdd.map(x=>Person(x(0).toLong,x(1),x(2).toInt))
  6. personRDD: org.apache.spark.rdd.RDD[Person] = MapPartitionsRDD[15] at map at <console>:31
  7. scala> personRDD.toDF
  8. res6: org.apache.spark.sql.DataFrame = [id: bigint, name: string, age: int]
  9. scala> val df =personRDD.toDF
  10. df: org.apache.spark.sql.DataFrame = [id: bigint, name: string, age: int]
  11. scala> df.show()
  12. +---+-------+---+
  13. | id| name|age|
  14. +---+-------+---+
  15. | 1|laozhao| 18|
  16. | 2|laoduan| 30|
  17. | 3| laomao| 28|
  18. +---+-------+---+

  1. df.select("name").show() //选择列显示
  2. +-------+
  3. | name|
  4. +-------+
  5. |laozhao|
  6. |laoduan|
  7. | laomao|
  8. +-------+

F:./spark-sql  --master spark://server:7077 --driver-class-path /home/hadoop/apps/hive/lib/mysql-connector-java-5.1.34.jar

spark-sql里不能创建table,其他都可以。出现字符集问题。
hive中字符集没问题都可以操作。估计是同一种字符集不能同时被两种软件兼容吧~
用hive来操作结构化的数据。
其他的语句和hive中的语句一样!








原创粉丝点击