A:本地提交word count执行出现用户权限问题
设置hdfs-site.xml 设定用户都可以写入后即可
<!--new adding-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
B checkpoint
scala> sc.setCheckpointDir("hdfs://server:9000/ck20160519") //必须是新建的
val rdd =sc.textFile("hdfs://server:9000/wc") //必须是已经存在的
rdd: org.apache.spark.rdd.RDD[String] = hdfs://server:9000/wc MapPartitionsRDD[3] at textFile at <console>:27
scala> rdd.checkpoint
scala> rdd.count
res4: Long = 12
- scala> val rdd2 =rdd.map(_.split(" ")).map(x=>(x(1),1)).reduceByKey(_+_)
rdd2: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[13] at reduceByKey at <console>:29
scala> rdd2.checkpoint
scala> rdd2.collect
res10: Array[(String, Int)] = Array((jeff,3), (tom,3), (shabi,3), (blank,3))
…………………………………………………………………………………………………………………………………………………………
- scala> rdd2.cache()
res11: rdd2.type = ShuffledRDD[13] at reduceByKey at <console>:29
scala> rdd2.checkpoint
scala> rdd2.collect
res13: Array[(String, Int)] = Array((jeff,3), (tom,3), (shabi,3), (blank,3))
checkpoint保存的目录是在HDFS目录中,保证了存储的可靠性。
sc.setCheckpointDir("hdfs://master:9000/..")//会在..目录创建一个文件夹
rdd.checkpoint
rdd.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
val rdd =sc.textFile("hdfs://server:9000/person.txt").map(_.split(","))
rdd: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[14] at map at <console>:27
scala> case class Person(id:Long,name:String,age:Int)
defined class Person
scala> val personRDD=rdd.map(x=>Person(x(0).toLong,x(1),x(2).toInt))
personRDD: org.apache.spark.rdd.RDD[Person] = MapPartitionsRDD[15] at map at <console>:31
- scala> personRDD.toDF
res6: org.apache.spark.sql.DataFrame = [id: bigint, name: string, age: int]
scala> val df =personRDD.toDF
df: org.apache.spark.sql.DataFrame = [id: bigint, name: string, age: int]
scala> df.show()
+---+-------+---+
| id| name|age|
+---+-------+---+
| 1|laozhao| 18|
| 2|laoduan| 30|
| 3| laomao| 28|
+---+-------+---+
df.select("name").show() //选择列显示
+-------+
| name|
+-------+
|laozhao|
|laoduan|
| laomao|
+-------+
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中的语句一样!