知識回顧
1、請簡述 HBase 的資料結構和存盤架構
資料結構:hbase資料結構包括:命名空間,行鍵,列簇,列,時間戳,資料ceil,
- 命名空間:類似于關系型的資料庫,存放表的空間
- 行鍵:也就是rowkey,唯一標識
- 列簇:也就是一個大的類,一個資料集,數量是固定的
- 列:列就是通俗的一列,一個列簇可以擁有多個列,列可以增加
時間戳:每次的資料更新都會跟新時間戳,可以通過時間戳獲取最新的資料,也解決了hdfs不能隨時間修改的弊端- 資料ceil:也就是hbase中的資料全是字串型別
存盤架構:Client(客戶端)、Master(主節點)、HRegionServer(維護HRegion)、HLog(日志)、HRegion(維護若干個Store)、Store(具體資料存放)、StoreFile(持久化到HDFS)、MemStore(記憶體存盤)、Zookeeper(監控集群和存放root映射資訊)
2、請簡述 HBase 查詢資料的流程
首先訪問zookeeper,獲取meta檔案所在HRegionServer的位置,獲取meta檔案加載之記憶體,獲取rowkey對應HRegion的位置由于存在多個HRegion中,故此創建多個HRegionScanner,StoreScanner掃描器,先掃描MemStore是否存盤在,再掃描StoreFile,最后回傳結果
3、請簡述 HBase 寫詢資料的流程
首先建立連接,將寫入操作追加到HLog日志中,在獲取zookeeper中meta檔案的位置資訊,獲取meta中指定的rowkey映射的HRegion資訊后,進行資料寫入,寫到MemStore,默認達到128MB時,進行一個刷寫到硬碟,變成StoreFile,隨著不斷的StoreFile變多,StoreFile會進行一個資料的的合并
4、請闡述 Spark 中的快取機制 cache 和 persist 與 checkpoint 的區別與聯系
cache:控制算子之一,cache() = persist() = persist(StorageLevel.Memory_Only),相當于persist的一種情況,屬于惰性加載,第一次不會使用快取只有二次運算才會使用(代碼實作如下)persist:控制算子之一:支持持久化,常用的模式有Memory_Only和Memory_and_Diskcheckpoint:主要用于持久化RDD,將結果持久化到具體的檔案中,也是惰性加載(代碼實作如下)- 三者都是控制算子,對資料的不同形式的一種控制和持久化,其中cache基于記憶體,checkpoints基于硬碟,而persist則是最全面的多種模式皆可實作
/*控制算子之cache()惰性加載*/
object CtrlCache {
def main(args: Array[String]): Unit = {
//創建連接
val context = new SparkContext(new SparkConf().setMaster("local").setAppName("cache" + System.currentTimeMillis()))
//獲取資料元
val value: RDD[String] = context.textFile("src/main/resources/user.log")
//啟動快取
value.cache()
//記錄時間
val start: Long = System.currentTimeMillis()
//統計資料行數
val count: Long = value.count()
//記錄結束時間
val end: Long = System.currentTimeMillis()
//輸出結果
println("資料共"+count+"行,耗時:"+(end-start)+"s")
//記錄時間
val start1: Long = System.currentTimeMillis()
//統計資料行數
val count1: Long = value.count()
//記錄結束時間
val end1: Long = System.currentTimeMillis()
//輸出結果
println("資料共"+count1+"行,耗時:"+(end1-start1)+"s")
}
}

/*控制算子 checkpoint*/
object CheckPoint {
def main(args: Array[String]): Unit = {
//創建連接
val context = new SparkContext(new SparkConf().setMaster("local").setAppName("cache" + System.currentTimeMillis()))
//獲取資料元
val value: RDD[String] = context.textFile("src/main/resources/user.log")
//設定檢查點路徑
context.setCheckpointDir("./point")
//對資料進行磁區
val partiton: RDD[String] = value.flatMap(_.split(" "))
//獲取磁區數
println("磁區數:"+partiton.getNumPartitions)
//持久化
value.checkpoint()
//持久化數量
value.count()
context.stop()
}
}

5、RDD 的五大屬性?請列舉出常用的 RDD 算子及作用?
- 五大屬性:
① RDD由一組partition磁區組成
② RDD之間相互依賴
③ RDD計算出最佳的計算位置
④ 磁區器用于key -value的RDD上
⑤ 函式作用在每一個分片上- RDD常用算子以及作用:
– 轉換算子:
map:進一出一,對資料進行切分等處理
flatMap:與map類似先map后flat,多用于磁區
sortByKey:用于k-vRDD上,排序
reduceByKey:將相同的Key的資料進行處理
– 行動算子:
count:回傳資料集中的元素個數
foreach:回圈遍歷資料集中每個元素
collect:將計算結果回收到Driver端
– 控制算子:cache ,persist,checkpoint(略)
6、Spark 寬窄依賴的作用是什么?
寬依賴:意味著父RDD與子RDD之間的partition磁區關系是一對多,這樣會導致shuffle洗牌的產生
窄依賴:意味著父RDD與子RDD之間的partition磁區之間的關系是一對一或者是多對一的關系,不會產生shuffle洗牌操作
作用:spark通過寬窄依賴來劃分stage
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423726.html
標籤:其他
上一篇:企業資料發展三階段
下一篇:Hive執行show databases出現RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata
