作者
筆記彙總
- Zookeeper用於集羣主備切換。
- YARN讓集羣具備更好的擴展性。
- Spark沒有存儲能力。
- Spark的Master負責集羣的資源管理,Slave用於執行計算任務。
- Hadoop從2.x開始,把存儲和計算分離開來,形成兩個相對獨立的子集羣:HDFS和YARN,MapReduce依附於YARN來運行。
- YARN可以爲符合YARN編程接口需求的集羣提供調度服務。
- YARN:
ResourceManager 一主多備
NodeManager 一般與DataNode部署在一起。 - 單機硬件配置會嚴重影響集羣的性能。
- 初始化集羣機器環境:創建賬號、安裝JDK、設置時間同步。
- Zookeeper的部署最簡單,其節點數必爲奇數。
- ZK兩個端口,前者是鏈接Leader後者是用於競選。
- 部署Spark StandLone集羣:
- SSH無密碼登錄
- 複製解壓Spark
- 編寫配置文件分發到所有節點
- Hadoop2.x以上支持雙機熱備。
- Standlone模式只支持簡單的固定資源分配策略。
- YARN統一爲集羣上的所有計算負載分配資源,可以避免資源分配的混亂無序。
- Spark程序由Master還是YARN來調度執行,是由Spark程序在提交時決定的。
- YARN兩種調度模式:
Yarn-cluster 模式,用於生產
Yarn-client 模式,用於交互 - Spark計算都是圍繞RDD進行的。
- Spark在運行時,一般RDD操作會爲每個RDD分區運行一個job。
- Job最簡單的理解,它對應一個java線程。
- Spark所有基於文件的生產RDD方法,都支持目錄、壓縮文件和通配符。
- RDD是Spark的核心抽象,所有計算都圍繞RDD進行。
- RDD操作分爲兩類:
Transformation 轉換
Action 動作 - 所有Transformation都是Lazy模式,先記錄計算方式,Driver返回結果時開始計算。
- RDD的Transformation實際計算只在Action返回結果時才進行,或者持久化。
- Spark嚴重依賴傳遞函數類型的參數。
- 從Driver分發各個節點過程:
Job執行: - 在Driver節點上序列化代碼
- 傳送至各個計算節點
- 在計算節點上反序列化4. 執行
- Scala function支持序列化。
- Spark的核心是RDD,而RDD是分佈式計算的。
- Spark會將Job運行所有依賴的變量、方法、(閉包)全部打包在一起序列化。
- RDD操作的禁忌,不能嵌套調用。
- Action操作輸出不再是RDD,返回值Driver程序。
- Spark集羣上的資源主要是CPU core數量和物理內存。
- 在程序運行時,每個core對應一個線程。
- Standlone模式下由Spark集羣中的master節點進行資源調度。
- Spark調度兩類:
- spark程序見的調度(主)
- spark程序內部的調度
- 用戶編寫的spark程序稱爲Driver程序。
- 每個驅動程序都有一個SparkContext對象,擔負着與集羣溝通的職責。
- 集羣管理器負責集羣的資源調度。
- 執行器,每個spark程序在每個節點上啓動的一個進程。
- 一次RDD Action對應一次job。
- Stage,job在執行過程中被分爲多個階段。
- Task,在執行器上執行的最小單位。
- Spark程序間的調度:
靜態分配 (主)
動態分配 - 所有集羣管理器都支持靜態資源分配。
- 當spark爲多用戶服務時,需要配置spark程序內部的調度。
- 不同線程提交的job可以並行執行。
- 默認spark的調度器以FIFO方式運行Job。
- 公平調度還支持對多個Job進行分組,分組稱爲調度池。
- Spark性能優勢,很大一部分原因是內存和緩存。
- RDD持久化可以多次利用,性能提高10倍以上。
- Spark提供兩類共享變量——廣播變量和計數器。
- 廣播變量是一個只讀變量,在所有節點上都是一份緩存。
- 計數器只能增加,用於技術和求和。
- 容錯機制是分佈式系統的一個重要能力。
- DAG:有向無環圖的計算任務集合。
- 分佈式系統經常需要做檢查點。
- RDD也是一個DAG,每一個RDD都會記住創建該數據需要哪些操作——血統。
- RDD依賴:
窄依賴 —— 父分區對應一個子分區
寬依賴 —— 父分區對應多個子分區 - Spark提供了預寫日誌(journal),先將數據寫入支持容錯的文件系統中。
- Spark master容錯:
Standalone ——Zookeeper
單點 ——本地重啓 - Slave節點失效:
- Work異常停止
- 執行器異常停止
- Driver異常退出
- 監控管理:
- Web界面
- Metrics
- 外部系統
- Web界面:
- 調度器stage,Task列表
- RDD大小和內存文件統計情況
- 環境信息
- 正在執行的執行器信息
- Standlone模式的集羣管理器有自己的web界面。
- Web界面表格的頭部都支持點擊排序。
- Spark程序一般都是由腳本bin/spark-submit來提交的。
- RDD特點:
- RDD是隻讀的
- RDD可指定緩存在內存中
- RDD可以通過重新計算得到
- RDD核心屬性:
- 一個分區列表
- 一個依賴列表
- 一個名爲compute的計算函數
- 分區器
- 計算各分區是優先的位置列表
- Action不可以在RDD Tranformation內部調用。
- Transformation只是建立在計算關係,而action纔是實際的執行者——觸發者
- Spark.local.dir用於shuffle。
- SparkContext是spark程序最主要的入口。
- 每個jvm只允許啓動一個sparkContext。
- DAG是最高層級的調度,每個job對應一個DAG。
- RunJob,提交RDD Action 操作,是所有調度執行的入口。
- sparkContext在初始化時,創建了DAG調度與task調度來負責RDD Action操作的調度執行。
- 任務提交時,不是按Job的先後順序提交的,而是倒序的。
- 僅對依賴類型是shuffle Dependency的RDD操作創建Stage。
- DAG在調度室,對於在相同節點上進行的Task計算會合併爲一個Stage。
- 各stage之間以shuffle爲分界線。
- Spark SQL是spark的一個子模塊,專門用於處理結構化數據。
- Spark SQL的最大優勢是性能非常高。
- Spark SQL與Apache Hive基本完全兼容。
- Spark SQL提供領域API,並且提供專門的數據結構抽象DataFrame。
- Spark SQL支持非常多的數據源:Hive、Avro、Jdbc、Json等,而且統一訪問。
- Spark SQL兩種使用:
- SQL引擎
- API 操作
- 分佈式SQL引擎,兩種運行方式:
- JDBC/ODBC Server
- Spark SQL 命令行
- Spark SQL相關的所有函數,都在SqlContext或它子類中。
- DataFrame創建:
- 使用反射的方法從RDD創建DataFrame
- 使用程序動態從RDD創建DataFrame
- 從其他數據源生產DataFrame
- DataFrame支持許多特殊的操作,稱爲領域編程語言或領域API。
- DataFrame註冊成表,然後使用純SQL來訪問。
- Parquet是一種大數據計算中最常用的列式存儲格式。
- 數據源類型的名稱一般是全稱。
- 優化是非常重要的環節,需要不斷積累經驗。
- Catalyst(催化劑)是Spark SQL執行有限優化器的代號,最核心部分。
- Catalyst最主要的數據結構是樹。
- 所有優化都是基於規則的。
- Catalyst優化:
- 分析階段
- 邏輯優化階段
- 物理優化階段
- 代碼優化階段
- Spark的性能基本上與數量大小保持線性關係。
- Spark Streaming接收實時數據,按日期將數據劃分爲成多批次(Batch),按批次提交個核心計算。
- Spark Streaming使用的數據抽象是DStream。
- DStream內部是連續的RDD序列。
- Sprak Streaming 3種輸入DStream:
- 基本型
- 高級型
- 自定義
- 高級類型的輸入DStream並不是由Spark提供。
- 使用數據源時,要注意可靠性。
- DStream操作:
- Transformation操作
- Output操作類似RDD Action
- Transform提供直接操作DStream內部RDD的方法。
- Spark Streaming提供專門的狀態更新方法。
- 設置數據的滑動窗口,將數個原始DStream合併成一個窗口DStream。
- 窗口(Window)通過連個參數確定:1)窗口長度、2)滑動區間。
- Output操作將DStream結果輸出到外部系統。
- DStream可以序列化到內存。
- 窗口函數和updateStateBykey默認會自動持久化。
- 網絡按收數據,默認持久化兩個節點上,保證容錯。
- DStream基礎屬性:
- 依賴的在DStream列表
- 生產RDD的時間
- Complete計算函數
- RDD是隻讀的,可重複計算的分佈式數據集。
- SparkStreaming大部分數據來自網絡。
- 流式計算過程:
輸入數據流>>數據接收>>數據計算>>結果輸出。 - 結果輸出操作本身提供至少一次級別的容錯性能。
- Spark提供了檢查點功能,用戶定期記錄中間狀態。
- 檢查點是有代價的,需要存儲數據至存儲系統。
- Spark性能調優兩個方向:
- 每個批次的處理時間儘可能短
- 收到數據後,儘可能快地處理
- Storm是開源免費的分佈式實時計算系統。
- Storm的核心數據抽象是tuple,是命名的值列表。
- Spark Streaming粗粒度,storm更細粒度些。
- 核心數據抽象的不同導致計算模式上的本質卻別。
- Weblog分析的典型的流式實時應用場景。
- ZK以Fast Paxos算法爲基礎。
- ZK在分佈式系統中協作多任務。
- Hbase是一個通常與Hadoop一起使用的數據庫。
- Kafka是一個基於發佈-訂閱模型的消息系統。
- Solr是一個企業級的搜索平臺。
- ZK不適合用作海量數據存儲。
- 分佈式系統中的進程通信有兩種選擇:直接通過網絡進行信息交換,或讀寫某些共享存儲。
- ZK使用共享存儲模型來實現應用間的協作和同步原語。
- 網絡通信是分佈式系統中併發設計的基礎。
- 分佈式系統需注意:
- 消息延遲 ——傳輸
- 處理器性能——計算
- 時鐘偏移 ——時鐘
- 數據中心通常使用大量統一的硬件。
- 主-從架構:主節點負責跟蹤從節點狀態和任務的有效性,並分配任務到節點。
- 主-從模式必解決三個關鍵問題:
- 主節點崩潰
- 從節點崩潰
- 通信故障
- ZK因故障出現連個及以上主節點稱爲腦裂(split-brain)。
- 主-從架構的需求:
- 主節點選舉
- 崩潰檢測
- 組成員關係管理
- 元數據管理
- ZK:Paxos算法和虛擬同步技術。
- Znode Zookeeper 操作和維護一個小型的數據節點。
- Znode類型決定了znode節點的行爲方式。
- Znode節點分持久節點和臨時節點。
- Znode4中類型:
- 持久化(persist)
- 臨時的
- 持久有序的
- 臨時有序的
- 通知機制是單次觸發的操作。
- 每一個znode都有一個版本號,它隨着每次數據變化而自增。
- ZK服務器端兩種模式:1)獨立模式、2)仲裁模式。
- 對ZK集合執行請求需要建立會話。
- 會話請求以FIFO順序執行。
- 會話狀態:
- Connecting
- Connected
- Closed
- Not connected
- Server兩個端口,第一個用作通訊,第二個用於選舉。
- ZK的API圍繞ZK的句柄(handle)而構建。
- 爲了從ZK接收通知,我們需要實現監視點(watcher)。
- 監視點和通知形成了一個通用機制。
- 當一個監視點被一個事件觸發時,就會產生一個通知。
- Redis是一個內存數據庫,基於鍵值對存儲。
- Redis是REmoteDictionaryServer(遠程字典服務器)簡寫。
- Redis支持鍵值數據類型:
- 字符串類型
- 散列類型
- 列表類型
- 集合類型
- 有序集合類型
- 數據在Redis和程序中存儲類似。
- Redis數據庫中的所有數據都存儲在內存中。
- Redis可以在一秒中讀寫上十萬個鍵值(普通自己本)。
- Redis提供數據持久化到硬盤。
- Redis可用做緩存、隊列系統。
- Redis可以爲每個鍵設置生存時間,過時自動刪除。
- Redis可以限定數據佔用的最大內存空間。
- Redis還支持“發佈/訂閱”的消息模式。
- Redis支持阻塞式讀取。
- Kill Redis 進程的PID也可正常退出,Redis有處理。
- 每個數據類型Redis-cli的展現結果都不同。
- Redis默認支持16個數據庫,以數字命令。
- Redis不支持自定義數據庫的名字,每個數據庫以編號命名。
- Redis密碼只有一個。
- FLUSH ALL 命令清空Redis所有數據。
- 一個Redis最好對應一個程序。
- Redis 0號數據庫用於生產,1號數據庫用於測試。
- Select n 切換數據庫。
- Keys命令需要遍歷Redis中的所有鍵,不建議生產用。
- Exict key 返回 1/0。
- Del key返回鍵值個數,不支持通配符。
- Type命名用來獲取鍵值的數據類型。
- LPOSH命令的作用是指定列表型鍵中增加一個元素。
- Redis能存儲任何形式的字符串。
- Redis INCR命令讓當前鍵值遞增。
- 原子操作取“原子”的“不可拆分”的意思,最下執行單元。
- Redis數據類型不支持數據類型嵌套。
- 散列類型適合存儲:使用對象類別和ID構成鍵名,使用字段表示對象屬性。
- Redis不要求每個鍵都依據此結構存儲。
- Hset命令用來賦值,Hget用於取值。
- Hset插入返回1,更新返回0。
- Hset命令用於散列類型,set用於字符串類型。
- Hmset處理多個字段。
- HgetAll所有字段和字段值。
- Hexists用於判斷一字段是否存在。
- HsetNX key field value 當字段不存在時賦值。
- Hinrby key field increment 增加數字。
- Hdel key field 刪除字段。
- 列表類型(List)可以存儲一個有序的字符串列表。
- 列表類型內部是使用雙向鏈表實現的。
- 藉助列表類型,Redis還可以作爲隊列使用。
- 向列表兩端增加元素:
LPUSH KEY VALUE [. . .]
PPUSH KEY VALUE[. . .]
返回長度 - 從列表兩端彈出元素:
LPOP KEY
RPOP KEY - 獲取列表中元素的個數 llen key。
- 獲取列表中指定值:LREM KEY count value。
- Redis集合類型內部使用散列表實現的。
- 增加和刪除元素:
Sadd key member [. . .]]
Srem key member [. . .]] - Smembers命令返回集合中所有元素。
- 集合間運算:
- Sdiff key [key . . .] ——差集
- Sinter key [. . . ] ——交集
- Sunion . . . ——並集
- 有序集合是Redis最高級的類型。
- Redis中的事務是一組命令的集合。
- 事務:要麼全執行,要麼全不執行。
- Redis不支持回滾功能。
- Watch命令可以監控一個或多個鍵。
- Redis可以用expire命令設置一個鍵的過期時間。
- TTL命令查看剩餘時間-2刪除,-1永久。
- Persist取消過期。
- Redis可限制最大內存。
- LRU算法即“最近最少使用”。
- 有序集合常見的使用場景是大數據排序。
- 對有序集合類型排序是會忽略元素的分類。
- Sort默認按照從下到大排序,用desc逆序。
- Sort通過alpha參數實現按照字典,順序排序非數字元素。
- Sort支持limit返回指定參數。
- 參考鍵值相同時,Redis會按照元素本身大小排序。
- 有個N個Get參數,每個元素返回的結果就有N行。
- Get會返回元素本身的值。
- Store參數常用來結合expire緩存排序結果。
- Sort是Redis中最強大最複雜的命令之一。
- 通知的過程可以藉助任務隊列來實現。
- 任務隊列好處:1)鬆耦合,2)易於擴展。
- 當列表中沒有元素BRPOP會一直阻塞住連接。
- BRPOP命令按收兩個參數鍵名,超時時間,單位秒。
- 如果多個鍵都有元素則從左向右順序取實現優先。
- 發佈者發佈消息的命令是PUBLISH。
- 訂閱頻道的命令是SUBSCRIBE,可用的多個訂閱。
- 進入訂閱狀態後客戶端可能收到了3種類型的恢復。
- PUSH SCRIBE命令訂閱指定的規則。
- 客戶端和Redis使用TCP協議連接。
- Redis的底層通信協議對管道提供了支持。
- 精簡鍵名和鍵值是最直觀的減少內存暫用的方式。
- 允許開發者使用LUA語言編寫腳本傳到Redis中執行。
- LUA腳本好處:1)減少網絡開銷、2)原子操作、3)複用。
- ——eval參數是告訴Redis-clli讀取並運行後面的LUA腳本。
- LUA號稱性能最高的腳本。
- LUA腳本很容易和C/C++交互。
- LUA是一個動態類型語言。
- 表類型是LUA語言中唯一的數據結構。
- 函數在LUA中是一等值。
- 全局變量只有Nil和非Nil的區別。
- 在Redis腳本中不能使用全局變量。
- 聲明局部變量的方法爲local變量。
- 多行註釋:——[[ ]]。
- LUA支持多重賦值。
- LUA有5類操作符:
- 數學操作符
- 比較操作符
- 邏輯操作符
- 鏈接操作符
- 取長度操作符
- LUA if 語句 if … then … elseif …then…else…end。
- LUA支持while,repeat和for循環語句。
- For語句中的循環變量是局部變量。
- LUA約定數組的索引從1開始。
- Paris是LUA內置的函數,實現類似迭代器的功能。
- Pairs用來遍歷非數組的表。
- 函數的定義爲:function(參數列表) 函數體 end。
- …實現可變參數。
- LUA中return和break用於跳出循環。
- 編寫Redis腳本的目的就是讀寫Redis的數據。
- LUA腳本使用Redis,call函數調用Redis命令。
- EVALHA命令允許開發者通過腳本。
- Script kill命令可以終止當前腳本的運行。
- Redis支持兩種方式的持久化,一種是RDB方式,另一種是AOF方式。
- Redis提供了複製(replication)功能,自動同步數據庫。
- 在複製概念中,數據庫分爲兩類:master/slave。
- Slave of 參數指向主數據庫,進行同步數據。
- 通過複製可以實現讀寫分離,以提高服務器的負載能力。
- Master用於寫,slave用於讀,適合讀多寫收的場景。
- 哨兵的作用就是監控Redis系統的運行狀態:
- 監控主/從是否正常
- 當出現故障時,從升爲主
- 哨兵是一個獨立的進程。
- 哨兵從獨立進程的方式對一個主從系統進行監控。
- Redis 3.0版本支持集羣。
- 生產環境運行時不能運行外界直連Redis。
- Bing 127.0.0.1只運行本機訪問。
- Redis支持在配置文件中獎命令重命名。
- 如果希望直接禁用某個命令可以將命令重命名成XXX。
- Redis通信協議是Redis客戶端與Redis間交流的語言。
- Redis兩種通信協議:
- 二進制安全的統一請求協議
- telnet程序中輸入的簡單協議
- 哨兵提供了命令可以通過主數據庫的名字獲取當前系統的主數據庫的地址和端口號。
- 一個哨兵可以同時監控多個Redis主從系統。
- 多個哨兵也可以同時監控同一個Redis主從系統。
- MapReduce兩階段:Map階段和Reduce階段。
- 每個階段都以鍵值對作爲輸入和輸出。
- Map階段的輸入時NCDN原始數據。
- 鍵是相對穩健起始位置的偏移量。
- Mapper類是一個泛型,四個參數:
- 輸入鍵
- 輸入值
- 輸出鍵
- 輸出值
- Hadoop本身提供了一套可優化網絡序列化傳輸的基本類型:
LongWritable 相對於 Java 的Long
Text 相對於String
IntWritable相對於Integer - Map()方法提供了context實例用於輸出內容的寫入。
- Job對象指定作業執行規範。
- 構造Job對象後,需要指定輸入和輸出數據的路徑。
- 在調試MapReduce作業時,知道作業ID和任務ID是非常有用的。
- 虛類相對接口更有利於擴展。
- MapReduce作業(Job)是客戶端要執行的一個工作單元:它包括輸入數據,MapReduce程序和配置信息。
- Hadoop將作業分成若干個小任務(Task)來執行,器中包括兩類任務:Map和Reduce。
- 作業(Job)由一個Jobtracker及一系列tasktracker控制執行過程。
- Hadoop將MapReduce的輸入數據劃分成等長的小數據塊稱爲“切片”。
- Hadoop爲每一個切片構建一個map任務。
- 切片越細,負載平衡越好。
- HDFS的塊大小默認是64MB。
- 數據本地化優化——輸入數據在本地節點運行map。
- 數據通過網絡傳輸到map任務節點,效率明顯降低。
- Map任務將其輸出寫入本地硬盤,而非HDFS,因爲map的輸出是中間結果,Job完成自動刪除。
- 單個reduce任務的輸入通常來自於所有map的輸出。
- 每個reduce任務的輸入來自多個mao任務,所以中間過程稱爲shuffle(混洗)。
- Shuffle對總執行時間的影響非常大。
- 集羣上的可用帶寬限制了MapReduce作業的數量。
- Hadoop允許用戶針對map任務的輸出指定一個combiner。
- Combiner的規則制約值可用的函數類型。
- Combiner是通過Reducer類來定義的。
- Hadoop Streaming 使用Unix標準流作爲Hadoop和應用程序之間的接口。
- Streaming天生適合用於文件處理。
- HDFS以流式數據訪問模式來存儲超大文件。
- 一次寫入,多次讀取是高效的訪問模式。
- HDFS中的文件可能只有一個writer。
- HDFS的塊大,目的爲最小化尋址開銷。
- HDFS集羣有兩類節點:管理者-工作者模式運行。
- Namenode管理文件系統的命名空間。
- 客戶端代表用戶通過與namenode和datanode交互。
- Datanode是文件系統的工作節點。
- 在聯邦環境下每個namenode維護一個命名空間卷。
- HDFS的權限模式與POSIX非常相似。
- 用戶空間文件系統允許整合式一個Unix系統。
- 從Hadoop文件系統讀取文件,最簡單使用Java.net.url。
- Filesystem是一個通用的文件系統API。
- Seek()方法是一個相對高開銷的操作,需要慎重使用。
- Filestatus封裝了文件系統中文件和目錄的元數據。
- Hadoop通配符與Unix bach的相同。
- Hadoop無法自行定義網絡拓撲結構。
- 文件系統的一致模型描述了文件讀/寫的數據可見性。
- HDFS提供了一個方法來使所有緩存與數據節點強行同步。
- HDFS中關閉文件其實還隱含執行syn()方法。
- Flume是一個將大規模數據導入HDFS的工具——典型應用從另外一個系統收集日誌數據。
- Flume提供了不同數據級別的數據投遞可靠性。
- Sqoop是將數據從結構化存儲批量導入HDFS。——數據庫。
- Distcp是作爲一個MapReduce作業來實現的。
- 每個文件均按塊方式存儲,每個塊的元數據存儲在namenode的內存中。
- Hadoop存儲小文件效率非常低。
- Hadoop存檔文件可以使用MapReduce的輸入。
- Hadoop自帶一套原子操作用於數據I/O操作。
- HDFS會對寫入的存儲數據計算校驗和,並在讀取數據時驗證校驗和。
- Datanode負責在收到數據後存儲該數據及其驗證校驗和。
- 客戶端成功驗證一個數據塊後,datanode更新日誌。
- Datanode定期驗證所有數據塊。
- Hadoop的LocalFile Systen執行客戶端的校驗和驗證。
- 校驗的計算代價是相當低的。
- LocalFileSystem通過checksumFileSystem來完成自己的任務。
- 文件壓縮兩大好處:存儲和傳輸。
- 序列化兩大領域常見:進程間通信和存儲。
- Writable兩個方法:dataoutput/datainput。
- RawComParator允許其實現直接比較數據流中的記錄。
- Writable類對java基本類型提供封裝。
- Text是針對URT-8序列的writable類。
- Text類的find()方法返回字節偏移量。
- 多數情況下需要將Text對象換成String對象。
- BytesWritable是對二進制數據數組的封裝。
- NullWritable是writable的特殊類型,序列化長度爲0.
- Nulwritable不讀也不寫,只當佔位符。
- NullWritable可以用作在SequenceFile中的鍵。
- ObjectWritable是對Java基本類型的一個通用封裝。
- 由於writable是MapReduce數據路徑的核心,所有調整二進制表示對性能產生顯著效果。
- 適當重寫一個類,會更加適應我們的需求。
- IDL——接口定義語言。
- Avro是一個獨立於編程語言的數據序列化系統。
- Avro模式通常用於Json來寫,數據通常採用二進制格式來編碼。
- Avro爲序列化和反序列化提供了API。
- Avro數據文件時可切分的,適合MapReduce快速處理。
- Avro語言互相操作性。
- Avro定義了對象的排列順序。
- Hadoop配置後添加的資源文件屬性會覆蓋之前定義的屬性。
- MRUnit是一個測試庫。
- 測試驅動程序:
- 使用本地作業運行器
- 使用一個mini集羣來運行它
- Mini集羣廣泛應用於Hadoop自帶的自動測試包中。
- Hadoop_CLASSPATH是一項客戶端的設置。
- 爲了啓動作業,我們需要運行驅動程序。
- Job上的waitforCompletion()方法啓動作業並檢查進展情況。
- 作業ID的格式包含兩部分:
- Jobtracker開始時間
- 唯一標識增量計數器
- 任務屬於作業,任務ID通過替換作業ID的作業前綴爲任務前綴,然後加上一個後綴表示哪個作業類的任務。
- Hadoop的web界面用來瀏覽作業信息。
- 作業歷史包括已完成作業的時間和配置信息。
- 每個reducer產生一個輸出文件。
- 最經典的調試方法,打印語句來調試程序。
- 任務頁面包括一些看作業總任務細節的鏈接。
- 針對不同用戶,Hadoop在不同的地方生產日誌。
- Hadoop允許分析作業中的一部分任務。
- Jobcontrol的實例表示一個作業的運行圖。
- Ooize中,工作流是一個有動作節點和控制節點組成的DAG。
- 每個工作都必須有一個start節點和一個end節點。
- Oozie提供了一組與工作流交互的函數。
- 工作流應用由工作流定義和所有運行所需的資源。
- 運行MapReduce作業:
- Job對象上的submit()
- Waitforcompletion()
- 客戶端,提交MapReduce作業。
- Jobtracker,運行作業劃分後的任務。
- Jobsummiter作業提交過程:
- 箱Jobtracker請求一個新的作業ID
- 檢查作業的輸出說明
- 計算作業的輸入分片
- 將運行作業所需的資源複製到Jobtracker文件系統中。
- 告知Jobtracker作業,準備執行。
- 心跳 向Jobtracker表明tasktracker是否還存活。
- MapReduce 1 :
- 作業的提交
- 作業的初始化
- 任務的分配
- 任務的執行
- 進度和狀態的更新
- 作業完成
- YARN (Yet Another Resource Negotiator)。
- YARN將Jobtracker的職能劃分爲多個獨立的實體。
- YARN將兩種角色劃分爲兩個獨立的守護進程:
- 資源管理器
- 應用管理器
- YARN設計的精妙之處在於不同的YARN應用可以在同一個集羣共存。
- MapReduce確保每個reducer的輸入都是按鍵排序的。
- 系統執行排序的過程稱爲shuffle。
- Shuffle屬於不斷被優化和改進的代碼的一部分。
- Shuffle是MapReduce的“心臟”是奇蹟發生的地方。
- 每個map任務都有一個環形內存緩衝區用於存儲任務的輸出。
- Hadoop設置作業配置參數作爲streaming程序的環境變量。
- MapReduce模型將作業分解成任務,然而並行地運行任務。
- Hadoop MapReduce 使用一個提交協議來確保作業和任務都完成功或失敗。
- Hadoop在他們自己的Java虛擬機上運行任務,以區別其他正在運行的任務。
- 計數器是收集作業統計信息的有效手段之一。
- Hadoop爲每個作業維護若干內置計數器,以描述多項指標。
- 任務計數器由其任務維護,並定期發送給tasktracker再有tasktracker發送給Jobtracker。
- 作業計數器由Jobtracker維護。
- 計數器由一個java枚舉(enum)類型來定義。
- 計數器是全局的。
- 排序是MapReduce的核心技術。
- MapReduce能夠執行大型數據集鍵的“鏈接”操作。
- “邊數據”是作業所需的額外的只讀數據。
- RAID —— 磁盤陣列
- HDFS無需使用RAID的冗餘機制。
- Hadoop部分代碼需在Unix環境下執行。
- Namenode和Jobtracker最好分別放在不同機器中。
- Hadoop集羣架構通常包含兩級網絡拓撲。
- 爲了達到Hadoop的最佳性能,配置Hadoop系統以讓其瞭解網絡拓撲狀況舊極爲關鍵。
- HDFS和MapReduce可安裝同一系統的不同位置。
- Hadoop控制腳本依賴SSH來執行鍼對整個集羣的操作。
- 集羣的每個Hadoop節點都各自保存一系列配置文件。
- Hadoop也支持爲所有master和worker機器採用同一套配置文件。
- 爲每一機器類維護單獨的配置文件。
- 同步所有機器上的配置文件極具挑戰性。
- Hadoop內置一些腳本來運行指令,在集羣內啓動和終止守護進程。
- MapReduce控制腳本不使用masters文件。
- Namenode在內存中保存整個命名空間中的所有文件元數據和塊元數據。
- Hadoop爲各個守護進程分配1GB內存。
- 在一個tasktracker上能夠同時運行的任務數取決於一臺機器有多少個處理器。
- Hadoop守護進程一般同時運行RPC和HTTP兩個服務器。
- 各個datanode運行TCP/IP服務器以支持塊傳輸。
- YARN是運行MapReduce的下一代架構。
- YARN有一個作業歷史服務器和一個web應用程序代理服務器。
- YARN更加精細化管理內存。
- YARN守護進程運行一個或多個RPC和HTTP服務。
- Kerberos獲取服務:
- 認證
- 授權
- 服務請求
- Hadoop使用委託令牌來支持後續認證訪問。
- Whirr使用SSH與雲端的機器通信。
- Pig爲大型數據集的處理提供了更高層的抽象。
- Pig提供了一套更強大的數據變換操作。
- Pig Latin程序由一系列的操作式變換組成。
- Pig是一種探索大規模數據集的腳本語言。
- MapReduce的一個缺點是開發週期太長。
- Pig提供了多個命令來檢查和處理程序中已有的數據結構。
- Pig被設計爲可擴展的,處理路徑中幾乎每個部分都可以定製。
- Pig是作爲一個客戶端應用程序運行的。
- Pig兩種模式:本地和MapReduce。
- Grunt是與Pig進行交互的外殼程序(shell)。
- 在MapReduce模式下,Pig翻譯成MapReduce作業。
- Pig發佈版本只和特定的Hadoop版本對應。
- 三種執行Pig程序方法:
- 腳本
- Grunt
- 嵌入式方法
- 創建一個精簡的數據集是一門藝術。
- Pig Latin是一種數據流編程語言,而SQL是一種聲明式編程語言。
- 一個Pig Latin程序由一組語句構成。
- Pig Latin並美歐正式的語言定義。
- 在Pig Latin程序執行時,每個命令按次序進行解析。
- Hive是一個構建在Hadoop上的數據倉庫框架。
- Hive一般在工作站上運行。
- Hive把數據組織爲表。
- 元數據(如表模式)存儲在metastore數據庫中。
- Hive外殼環境是我們交互的主要方式。
- HiveQL是Hive的查詢語言。
- Hive操作表而Pig直接操作數據集。
- HiveQL大小寫不敏感。
- 用-e選項在行嵌入命令,不用加分號。
- 在Hive的倉庫目錄中,表存儲爲目錄。
- Metastore包含兩部分:服務和後臺數據的存儲。
- 對於獨立的metastore,mysql是一種很受歡迎的選擇。
- Hive把表組織成“分區”。
- 桶爲表加上了額外的結構。
- 每個桶就是表(分式)目錄裏的一個文件。
- Hive從兩個維度對錶的存儲進行管理:行格式和文件格式。
- 視圖是一種用select語句定義的“虛表”。
- Hbase是一個在HDFS上開發的面向列的分佈式數據庫。
- 數據模型:
- 應用把數據存放在帶標籤的表中
- 表中行的鍵也是字節數組
- 行中的列被分成“列族”
- 一個表的列族必須預先給出
- 所有列族成員都一起存放在文件系統中。
- HBase自動把表水平分成“區域”,每個區域由表中行的子集構成。
- HBase依賴於Zookeeper。
- HBase通過Hadoop文件系統API來持久化存儲數據。
- HBase有Java開發。
- Hbase是一個分佈式的,面向列的數據存儲系統。
- HBase有一個高效的批量加載工具。
- Sqoop將結構化存儲器抽取到Hadoop中。
- Sqoop有java開發。
- Hive不支持事務。
- Hive是最適合數據倉庫應用程序的。
- Hive和Mysql提供的SQL方言最接近。
- Map操作會將集合中的元素從一種形式轉換成另一種形式。
- MapReduce計算框架中的輸入和輸出的基本數據結構是鍵-值對。
- Hadoop神奇的一部分在於sort和shuffle過程。
- Hive驅動計算的“語言”是一XML形式編碼的。
- Hive通過和Jobtracker通信來初始化MapReduce任務(Job)。
- Metastore(元數據存儲)是一個獨立的關係型數據庫。
- Pig常用於ETL(數據抽取、數據轉換、數據裝載)。
- Hadoop團隊通常會將Hive和Pig結合使用。
- Hive無法提供數據庫特性(如行級別更新,快速查詢響應和支持事務)。
- HBase的設計靈感來自goole的bigTable。
- HBase面向列存儲,列組成列族。
- HBase對每個列保留多個版本。
- HBase使用HDFS來持久化存儲數據。
- 將程序設計成驅動,比較方便移植。
- HBase沒有提供SQL語言。
- Hadoop面向批處理系統。
- CLI是我們使用Hive的最常用方式。
- Jobtracker管理着Job,而HDFS則由namenode管理。
- 元數據存儲中存儲了表的模式和分區信息等元數據。
- Hive會將輸出寫到標準輸出中。
- –e執行字符串包含的命令。
- –s去掉ok。
- –f執行文件。
- 如果查詢中的表名和這個例子並不相關,我們有時候會使用src。
- 用戶可以使用上下鍵來滾動查詢歷史命令。
- 用!執行bash shell命令。
- Hive Cli 可執行Hadoop的dfs命令。
- Hive本身提供了不同時區互相轉換的內置函數。
- Hive中的列支持使用strct、map和arry集合數據類型。
- Hive中並沒有鍵的概念。
- Hive不會再數據加載時進行驗證,而是在查詢時進行。
- Hive中數據庫的概念本質上僅僅是表的一個目錄式命名空間。
- Hive會爲每個數據接庫創建一個目錄。
- 數據庫的文件目錄名是以.db結尾。
- Hive中並沒有嵌套數據庫的概念。
- Hive不允許用戶刪除一個包含有表的數據庫。
- Hive會自動增加兩個表屬性:last_modified_by|last_modified_time。
- Hive總是將創建的表的目錄放置在這個所屬的數據庫目錄之後。
- Show tables命令可以列舉出所有的表。
- 管理表(內布表)不方便和其他工作共享數據。
- Exte Nal告訴Hive這個表示外部表。
- Location 告訴Hive數據位於哪個路徑下。
- 因爲表示外部的,所以Hive並非人爲其完全擁有這份數據。
- 有些Hive QL並不使用外部表。
- 分區字段,表現得舊和普通的字段一樣。
- 對數據進行分區,也許最重要的原因是爲了更快地查詢。
- 通過show partitions命令查看錶中存在的所有分區。
- Hive沒有行級操作。
- Hive通常指定的路徑應該是一個目錄,而不是單獨的文件。
- Hive要求源文件和目標文件以及目錄應該在同一個文件系統中。
- 指定overwrite關鍵字,目標文件之前存在的會被刪除。
- Hive並不會驗證用戶裝載的數據和表的模式是否匹配。
- Hive會驗證文件格式是否和表結構定義的一致。
- INSERT語句允許用戶通過查詢語句向目標表中插入數據。
- 靜態分區鍵必須出現在動態分區鍵之前。
- Hive中沒有臨時表的概念。
- Select是sql中的射影算子。
- 可用正則來選舉我們想要的列。
- Float和double相比較會出現問題。
- RLike可用正則指定匹配條件。
- Hive目前不支持on中的or。
- 視圖可以允許保存一個查詢並像對待表一樣對這查詢進行操作。
- Hive值有有限的索引功能。
- Bitmap索引普遍應用於排重後值較少的列。
- Hive中分區的功能是非常有用的。
- 每個task都是一個新的Jvm實例,都需要開啓和銷燬的開銷。
- 分區提供一個隔離數據和優化查詢的便遍歷的方式。
- 分桶是將數據集分解或更容易管理的若干部分的另一種技術。
- Hive提供了serde抽象,其用於從輸入中提取數據。
- 一個serDe通常是從左向右進行解析的。
- Hive提供了一個列式SerDe來以混合列式格式存儲信息。
- Hive中通常使用“UDF”來表示任意的函數(用戶自定義函數)。
- Streaming提供了另一種處理數據的方式。
- Hive中文件格式間具有明顯的差異。
- Hive文本文件格式選擇和記錄格式是對應的。
- SequenceFile可以在塊級別和記錄級別進行壓縮。
- 對於列式存儲而言,進行壓縮通常會非常高效。
- Hive功能強大的一個方面體現在不同的存儲格式間轉換數據非常地簡單。
- SerD是序列化/反序列化的簡寫形式。
- Hive引擎使用定義的InputFormat來讀取一行數據記錄。
- Thrift是一個軟件框架,其用於跨語言的服務開發。
- HiveServer使用Thrift提供服務。
- 存儲處理程序是一個結合InputFormat、OutPutFormat、SerDe和Hive需要使用的特定的代碼。
- 存儲處理程序負責從底層存儲系統中讀取或寫入數據。
- Hadoop起源於Apache Nutch的子項目。
- HBase彌補了Hadoop只能離線批處理的不足。
- HBase能夠存儲小文件,提供海量數據的隨機檢查。
- 大數據強調3v特徵:即Volume(量級)、Varity(種類)和Velocity(速度)。
- 結構優化,質量提高,是一種實現實質性的跨越式的進程。
- NoSQL是Not only SQL,泛指非關係型數據庫。
- NoSQL的實現具有兩個特徵:使用硬盤和把隨機存儲器作存儲載體。
- NoSQL的Cache是記錄級的,是一種粗粒度的Cache。
- NoSQL無須事先爲要存儲的數據建立字段,隨時可以存儲自定義的數據格式。
- HBase是一個高可靠、高性能、面向列、可伸縮的分佈式數據庫。
- HBase是NoSQL數據庫。
- HBase可以通過行健(RowKey)檢索數據,僅支持單行事務,主要用於存儲非結構化和半結構化的鬆散數據。
- HBase的單表可以有百億行,百萬列。
- HBase是面向列的存儲和權限控制,並支持列獨立檢索。
- HBase嚴重依賴Hadoop的HDFS組件。
- MapReduce可以直接訪問HBase。
- HBase中最重要的訪問方式是原生Java API。
- 客戶端Client是整個HBase系統的入口。
- HMaster主要負責Table和Region的管理工作。
- HRegionServer主要負責響應用戶I/O請求。
- HStore存儲是HBase存儲的核心。
- HStore兩部分:Memstore和StoreFile。
- 當StoreFile文件增長到一定閥值,會觸發CompCut。
- HBase的同一個表的記錄可以有不一樣的列。
- HBase中最基本的單元是列。
- 每一個行的行健是唯一的。
- HBase中的表有若干行,每行有很多列,列中的值有多個版本,每個版本的值稱爲一個單元格,單元格存不同的列值。
- HBase稱爲無模式數據庫的原因是HBase的表沒有列定義,沒有類型。
- 創建連接是一項非常消耗資源的工作。
- HBase爲我們提供了一個連接池。
- 行鍵是按字段排序由低到高存儲在表中。
- HBase中行鍵是唯一的索引。
- HBase中的列族是一些列的集合。
- 一個列族中所有列成員有着相同的前綴。
- 一個列族的成員在文件系統上都是存儲在一起的。
- 在創建表的時候至少指定一個列族。
- 修改列族要先停用表。
- HBase中的單元格由行鍵、列族、列、時間戳唯一確定。
- 單元格的內容是不可分別的字節數組。
- 每個單元格都保存着同一份數據的多個版本。
- 時間戳是64位的整數。
- HBase對數據模型4個操作包括:Get、Put、Scan和Delete。
- 多用戶多線程對統一行的讀寫操作都不會影響該行數據的原子性。
- Get方法獲取數據時,HBase返回的結果包含所有匹配的單元格數據。
- Result實例中包含列族、列限定符和時間戳等。
- Put操作要麼向表增加新行,要麼更新行。
- Put操作每次都會發起一次到服務器的RPC操作。
- HBase客戶端有一個緩衝區,大大提高寫入性能。
- HBase提供compare-and-set先檢查,再執行。
- HBase沒有update操作。
- Scan操作允許多行特定屬性迭代。
- HBase的Delete操作可以指定刪除某個列族或者某個列,或某時間更早的數據。
- HBase的Delete操作並不是真正地從磁盤刪除數據。
- RowKey、Column、Version組合在一起稱爲HBase的一個單元格。
- Version用一個長整型表示(時間)。
- Get是在Scan的基礎上實現的。
- 一個put操作會爲一個Cell創建一個版本,默認使用當前時間戳。
- 刪除操作的實現是創建一個墓碑標記。
- Get和Scan操作返回的是經過排序的數據。
- 返回的數據首選按行字典序排序,其次是列族、然後是列修飾符,最後的時間戳逆序。
- 獲取列族的完整列名的唯一方法是處理所有行。
- HBase不支持連接查詢,即Join查詢。
- ICV(HBase計數器)操作發送在RegionServer上。
- 事務特性ACID,如HBase這種NoSQL數據庫僅提供對行級別的原子性。
- HBase不是一個具備完整ACID特性的數據庫。
- HBase中一個表的數據會被劃分成很多的Region。
- 剛剛穿件的表只有一個Region。
- 每一個Region由一個RegionServer管理。
- 每個Region包含起始RowKey的記錄,不包含結束RowKey的記錄。
- Region的拆分與轉移是由HBase自動完成。
- CAP原理是數據庫軟件的理論基礎。
- HBase爲了擴展性和性能考慮,弱化了事務性。
- RowKey是不可分割的字節數,按字典排序由低到高存儲在表中。
- RowKey決定了訪問HBase表時可以得到的性能。
- Region基於Rowkey爲一個區間的行提供服務。
- Hfile在硬盤上存儲有序的行。
- HBase只能在RowKey上建立索引。
- RowKey優化:
- 字典排序
- 進行散列
- 儘量短
- 列族是一些列的集合。
- 一個列族的所有列成員有着相同的前綴。
- 列族的前綴必須是可輸出的字符。
- 列族必須在表建立的時候聲明,列在用戶隨時可以創建。
- 在物理上,一個列族的成員在文件系統上都存儲在一起。
- Flush和Compaction操作式針對一個Region的。
- 考慮Flush性能,列族數量越少越好。
- HFile數據塊大小可以在列族層次設置。
- 數據塊索引存儲每個HFile數據塊的起始鍵。
- 布隆過濾器(Bloom Filter)允許對存儲在每個數據塊的數據做一個反向測驗。
- HFile可以被壓縮並存放在HDFS上。
- HBase的每個單元格只維護三個時間版本。
- CRUD操作式HTable最基本的功能,其中的每類方法都包含多種實現。
- Java客戶端有兩種查詢數據的方式:單行讀和掃描讀。
- 每類操作的不同實現方法應用在不同的場景下。
- HBaseAdmin類是HBase數據庫的管理入口類。
- Scan類中的主要實現方法可以劃分成三類:
- 添加列或列族
- 設置查詢屬性
- 查看屬性信息
- 整個刪除過程分爲三步:
- 初始化Table實例
- 構造實體類Delete,Delete封裝行鍵、列族或列名
- 執行刪除
- HBase提供了若干封裝類用於“無縫”連接MapReduce。
- 從HBase表彙總讀取數據,使用MapReduce計算完成之後,將數據存儲到其他介質中。
- NoSQL不使用SQL作爲查詢語言。
- 創建外部表適用於某表HBase已經存在,但在Hive中沒有相關信息。
- 字符串類型是Redis中最基本的數據類型。
- 所有Redis命令都是原子操作。
- Redis提供了4個命令可以直接對二進制位進行操作。
- Redis是採用字典結構以鍵值對的形式存儲數據的。
- 一個散列類型鍵可以包含至多2的32次方減去1個字段。
- 散列類型適合存儲對象。
- 大數據所面對的問題是:一是存儲,二是計算。
- 大數據的定義是發現潛在規律和趨勢。
- 谷歌三大論文:1)GFS、2)MapReduce、3)BigTable。
- Hadoop是一個批處理系統,不擅長實時計算。
- YARN是通用的資源管理系統。
- 機器學習算法通常需要對同一個數據集合進行多次迭代計算。
- RDD彈性分佈式數據集(Resillient Distributed DataSet)。
- Spark支持檢查點(checkpoint)的容錯機制。
- RDD支持的方法:
- 轉換(Traansformation) ——生產新的RDD
- 動作(Action) ——返回一個非RDD
- Spark沒有存儲能力,僅做數據倉庫。
- MapReduce依附於Yarn來運行。
- Zookeeper的節點必須是奇數個。
- Standalone模式下,集羣可以容許某一個或多個工作節點失效。
- Hadoop:HDFS、MapReduce、YARN。
- Spark可以單獨使用HDFS或YARN。
- 由YARN統一負載分配資源科避免分配混亂。
- Spark程序由master還是YARN來調度執行,是由spark程序在提交時決定的。
- 只有在交互需求是才使用yarn-client方式。
- 切片,本地模式默認去CPU的核算。
- 每個Job的執行,都會經歷序列化,網絡傳輸,反序列化和運行的過程。
- 在序列化是,spark會將Job運行所依賴的變量、方法(稱爲閉包)全部打包在一起。
- 如果RDD多次迭代,可將其持久化。
- 在Zookeeper模式下,恢復期間新任務無法提交。
- RDD特點:1)只讀、2)可緩存、3)可以通過重新計算得到。
- Kafk是一個分佈式、分區、重複提交的日誌服務。
- Kafka掌管的類別消息叫做主題(topics)。
- 生產者發佈消息到kafka主題中。
- 消費者訂閱主題以及處理髮布的消息。
- Kafka每個服務器叫做broker。
- 主題是一個類別或者被髮布消息的名稱。
- Kafka集羣根據時間保留消息,而不是是否被消費。
- 消費者可以隨時添加和移除。
- 生產者發佈數據到他們選定的主題上。
- 消費者、消息處理通常有兩種模式。:隊列和發佈-訂閱。
- 在隊列模式中,一組消費者可能從服務器讀取消息,每個消息被其中一個消費者消費。
- 在發佈-訂閱模式中:消費者是廣播到全部的消費者中。
- 消費者用一個消費組名稱來標識自己。
- Kafka能夠提供順序保證並在一組消費者處理過程中均衡負載。
- Kafka可以替換傳統的消息代理。
- Kafka可以媲美傳統的消息系統例如:ActiveMQ和RabitMQ。
- Kafka通常用於操作監測數據的處理。
- Kafka作爲日誌聚合的一種解決方案。
- Zookeeper典型應用場景:配置文件的管理,集羣管理,分佈式隊列,同步鎖leader選舉,隊列管理等。
- Zookeeper是分佈式服務框架。
- dataMonitor類是本程序Zookeeper邏輯的核心。
- Zookeeper是一個基於觀察者模式設計的分佈式服務管理框架。
- 分佈式應用中通常需要有一套完整的命名規則。
- Netty高性能的NIO框架。
- Netty快速開發高性能,高可靠性的網絡服務器和客戶端程序。
- Netty是一個網絡通信框架。
- NIO是一個面向塊的I/O系統。
- NIO核心對象:緩衝區(Buffer),通道(Channel),選擇器(Selecter)。
- 在NIO庫中,所有數據都是用緩衝處理的。
- Netty是事件驅動的。
- Git是一個開源的分佈式版本控制系統。
- Kafka系統的角色:
- Borker:一臺kafka服務器就是一個broker。
- Topic:可以理解爲一個MQ消息隊列的名字。
- Java程序設計語言、虛擬機、API類庫統稱JDK。
- Jdk是用於支持Java程序開發的最小環境。
- JRE是支持Java程序運行的標準環境。
- Java技術體系可分爲4個平臺:Java Card、Me、Se、EE。
- Hadoop每個切片構建一個map任務。
- Map輸出是中間結果,reduce產出最終輸出結果。
- 集羣上的帶寬限制了MapReduce的作業的數量。
- HDFS中fsck指令可以顯示塊信息。
- Namenode之間需要通過高可用的共享存儲實現編輯日誌的共享。
- Datanode需要同時向連個namenode發送數據塊處理報告。
- 超級用戶是namenode進程的標識。
- Seek()方法是一個相對高開銷的操作。
- FileSystem是一個通用的文件系統Api。
- HDFS只允許對一個打開的文件順序寫入,或者在現有文件的末尾追加數據。
- FileStatus封裝了文件系統中問價和目錄的元數據。
- 過濾器有path表示,只能作用域文件名。
- Hadoop無法自行第一網絡拓撲結構。
- DFSoutputstream將寫入分成一個個的數據包,並寫入內部隊列,稱爲“數據隊列”。
- 文件系統的一致模型描述了文件讀/寫的數據可見性。
- HDFS爲性能犧牲了一些Posix要求(可移植操作系統接口)。
- HDFS提供一個方法來使所有緩存與數據節點強行同步。
- Flume是一個將大規模流數據導入HDFS的工具。
- Flume節點允許以任何拓撲方式進行組織。
- 當一個字段中包含多個類型時,ObjectWritable非常有用。
- Avro是一個獨立於編程語言的數據序列化系統。
- Avro模式通常用Json來寫,數據通常採用二進制格式來編碼。
- Avro數據文件時可切分的,適合MapReduce快速處理。
- SeQuenceFile是可以看做小文件的容器。
- MapFile是已經排序過的SequenceFile,它有索引,所以可以按鍵查找。
- Hadoop提供了鉤子(hook)來輔助分析過程。
- Mini集羣廣泛應用於Hadoop自帶的自動測試包中。
- 作業歷史包括已完成作業的時間和配置信息。
- MapReduce任務日誌可以從web界面訪問。
- 複雜的作業通常是增加更多的作業,而不是增加作業的複雜度。
- Jobcontrol的實例表示一個作業的運行圖。
- 在Ooize中,工作流是一個由動作(action)節點和控制流節點組成的DAG。
- Ooize提供了一組與工作流交互的函數。
- TaskRunner啓動了一個新的Jvm裏運行每個任務。
- YARN將Jobtracker的職能劃分多個獨立的實體。
- YARN集羣上可以運行不同版本的MapReduce。
- 每個map任務都有一個環形內存緩存區用於存儲任務的輸出。
- 在本地作業運行器上運行時,只支持0個或1個reduce。
- 一個輸入切片(split)就是一個由單個map操作來處理的輸入塊。
- 切片並不包含數據本身,而是指向數據的引用。
- Jobtracker使用其存儲位置信息來調度map任務從而在tasktracker上處理這些切片數據。
- Reduce輸入的鍵一定是有序的。
- Hadoop爲每個作業維護若干內置計數器,以描述多項指標。
- 任務計數器由其關聯任務維護,並定期發送給tasktracker,再有tasktracker發送給Jobtracker。
- “邊數據”是作業所需的額外的只讀數據。
- Hadoop還爲mapper和reduce提供了一個包含了常用函數的庫。
- Hadoop使用dfs。Mapred,rpc和jvm四個上下文根。
- FileContext將度量寫到一個本地文件中。
- Ganglia是一個針對超大規模的開源的分佈式監控系統。
- Hadoop包括多個託管bean(MBean),可以將hadoop度量發佈給支持JMX的應用。
- Didtcp是一個理想的備份工具。
- HDFS能夠容忍datanode故障,但這並不意味着允許隨意終止datanode。
- Shell for((i0;i<n;i++))。
- Break n跳出幾層循環。
- For I in {1 … 4}。
- Unset 刪除一個元素。
- Nohup 保持後臺允許。
-
覆蓋,>>追加。
- 0、1、2標準輸入正確,錯誤輸出。
- Ls >/de/null 深淵。
- Linux默認無回收站。
- –e執行轉義字符。
- Fsimage:元數據鏡像文件。
- 目前HDFS不支持斷點續傳。
- 最後塊不足夠,則按實際打下存儲。
- HAR是一個目錄結構。
- Namenode兩種狀態:Active和standly。
- Namenode同步數據通過Journanodes集羣。
- Namenode切換,自動和手工切換。
- MapReduce是分佈式並行計算模型,用於解決海量數據問題。
- Hive操作流程:
- 提交SQL 交給驅動
- 驅動編譯解析相關字段
- 去metastore查詢相關信息
- 編譯返回信息,發給驅動
- 驅動發一個執行計劃
- DDLS對數據庫表操作
- 吧Job交給Jobtracker讓tasktracker執行
- 完成Job返回數據信息,找namenode查數據
- Dfs ops直接和namenode交互
- Hive dfs ls 查看hadoop系統。
- Hive無刪除語句,用replace實現。
- Replace很危險,不建議使用。
- Hive刪字段,大多數情況重建表。
- 桶表時對數據進行哈希取值,然後放到不同文件中存儲。
- 桶表應用於抽樣查詢,加載文件分文件存儲。
- 使用視圖可以降低查詢複雜度。
- 索引是對數記錄偏移量。
- 分區字段字段建索引。
- 建索引會引發MapReduce計算。
- 裝載數據:1)本地文件加載方式,2)查詢裝載。
- 動態分區加載方式。
- Hive是讀模式。
- RDBMS是寫模式。
- Hive不支持對單行操作,只支持覆蓋和追加。
- 每個HStore對應了Table中的一個列族的存儲。
- HStore是HBase存儲的核心:HFile、memstore。
- HLog用於數據還原。
- HFile是不定長的。
- CSV是逗號分隔符的文件。
- Hive分析HBase,只要表映射即可。
- 列族優化:
- 隨機查詢:數據塊越少,索引越大,佔用內存也越大
- 順序查詢:更好的順序掃描需要更大的數據塊
- 布隆:有問題反饋,無問題不反饋。
- HBase刪除數據時先標記合併刪除。
- HBase熱點優化,創建分區。
- Solr可以實現全文搜索。
- Solr可以方便實現站內搜索功能。
- Solr是通過http協議處理搜索和查詢請求。
- Solr是一個索引庫。
- 線性的訪問磁盤,很多時候比隨機訪問內存塊。
- Kafka將數據分段,爲每個段建立索引。
- 索引分兩部分:offset和position。
- Storm處理高頻數據和大規模數據。
- Storm由用戶自定義處流程。
- Stream ——一列火車。
- Tuple ——一節車廂。
- 數據 ——乘客。
- Bolt ——對tuple中數據進行處理 中間站。
- Spout ——源頭,相當於火車的始發站。
- Toplogy ——軌道。
- Storm 主-從結構。
- 主節點:nimbus,負責分發代碼,分配任務。
- 從節點:supervisor,負責產生worker,執行任務。
- Storm集羣的運行依賴於Zookeeper。
- Executor是一個被worker進程啓動的單獨線程。
- Task是最終運行spout或bolt中代碼的執行單元。
- Slots就是work進程。
- 將數據按類型分組。
- Storm流分組:1)隨機 負載均衡,2)字段 類型分組。
- Work掛掉,storm會重新啓動一個進程,數據不會丟失。
- Storm不支持HA(目前)。
- 每個work都有一個ack/fail確認機制。
- Trident是對storm進行封裝的一個框架。
- ES也是對Luncene的封裝,天生爲分佈式而生。
- ES基於Restful接口。
- Hadoop RPC調用是基於Probobuf實現的。
- Client protocol定義了所有由客戶端發起的,由namenode響應的操作:
- HDFS文件讀相關的操作
- HDFS文件寫以及追加寫的相關操作
- 管理HDFS命名空間(namenode)的相關操作
- 系統問題與管理相關的操作
- 快照相關操作
- 緩存相關操作
- 其他
- FileSystem:
- HDFS文件讀操作
- HDFS文件寫與追加操作
- 命名空間的管理操作
- DFSAdmin:對系統問題管理相關操作。
- 處於安全模式(safemode)中的namenode不接受客戶端對命名空間的修改操作,只讀。
- 剛剛啓動的namenode直接自動進入安全模式。
- 必須在安全模式的兩個操作:
- ‘-savenamespace’用於將整個命名空間保存到新的fsimage文件中
- ‘-rolledits’則會觸發重置editlog文件
- Refreshnodes()方法會觸發namenode刷新數據節點列表。
- Findizeupgrade()和rollingupgrade()操作都是與namenode升級相關。
- 快照保存了一個實踐點上HDFS摸個路徑中所有數據的拷貝。
- 快照可以將失效的集羣回滾到之前一個正常的時間點上。
- 創建快照之前,先開啓目錄的快照功能。
- HDFS 2.3版本添加了集中式緩存管理功能:
- Cache directive:表示要被緩存到內存的文件或目錄
- Cache pool:用於管理一系列的cache directive類似於命名空間
- Datanode使用DatanodeProtocol接口與namenode握手註冊,發送心跳進行全量以及增量的數據彙報。
- DatanodeProtocol三種方法類型:
- Datanode啓動相關
- 心跳相關
- 數據塊讀寫相關
- Datnode啓動操作會與namenode進行四次交互:
- 與namenode握手
- 註冊上的datanode
- 彙報數據塊
- 緩存所有數據塊
- 分佈式系統的節點之間大多采用心跳維護節點的健康狀態。
- InterDatanodeProtocol(DN與DN之間接口),主要用於租約恢復操作。
- 客戶端打開一個文件進行寫操作是,首先獲取租約,並定期更新租約。
- NamenodeProtocol定義了第二namenode與namenode之間的接口。
- HDFS除了RPC調用還定義了流式接口(TCP/HTTP)。
- Hadoop RPC不足以支持大文件讀寫。
- HDFS客戶端讀取一個HDFS文件流程 :
- 打開HDFS文件
- 從namenode獲取datanode地址
- 連接到datanode讀取數據塊
- 關閉輸入流
- 數據塊的應答包中不僅包含了數據,還包含了校驗值。
- HDFS客戶端寫入一個HDFS文件的流程:
- 創建文件
- 建立數據流管道
- 通過數據流管道寫入數據
- 關閉輸入流並提交文件
- HDFS追加文件流程:
- 打開已有的HDFS文件
- 建立數據流管道
- 通過數據流管道寫入數據
- 關閉輸入流並提交文件
- 對於命名空間的一致性,兩個namenode都需要與一組獨立運行的節點(Journalnode,JNS)通信。
- ZKFailovercontroller負責維護HA。
- RPC(Remote Procedure Call protocol),遠程過程調用協議。
- Hadoop RPC框架底層採用Java NIO,Java動態代理以及protobuf等。
- RPC框架:
- 通信模塊
- 客戶端stub程序
- 服務器端stub程序
- 請求程序
- 服務程序
- 客戶端的stub可以看作是一個代理對象。
- Hadoop RPC 框架的使用抽象:
- 定義RPC協議
- 實現RPC協議
- 客戶端獲取代理對象
- 服務端啓動並構造RPC servers
- Namenode:
- 文件系統目錄樹管理
- 數據塊以及數據節點管理
- 租約管理:namenode給予租約持有者在規定時間內擁有文件權限的合同
- 緩存管理
- Fsnamesystem
Namenode的啓動和停止 - HDFS文件系統的命名空間是以/爲根的整個目錄樹,是通過FSDirectory類來管理的。
- HDFS中文件與目錄都被當做系統目錄樹的一個INode節點。
- HDFS會將命名空間保存到namenode的本地系統上一個叫fsimage的文件彙總。
- FSDirectory維護者文件系統目錄樹的節點。
- INode get方法:
- Username
- Groupnode
- Fspermission
- Allfeature:安全相關
- Modification
- Accesstime
- Sattrfeature:擴展屬性
- HDFS的檢查點機制會定時將editlog文件與fsimage文件合併以產生新的fsimage文件。
- 非HA,檢查點操作由secondary namenode來執行。
- Namenode維護着HDFS中連個最重要的關係:
- HDFS文件系統的目錄樹以及文件的數據塊索引
- 數據塊和數據節點的對應關係
- 當namenode發生錯誤並今夕了Active與standly切換時,多餘的副本不能直接刪除,先彙報再從隊列中移除。
- 數據塊副本狀態:
- 正常副本
- 損壞副本
- 多餘副本
- 等待刪除副本
- 等待刪除副本
- 等待複製副本
- 正在複製副本
- 推遲操作副本
- 數據副本的刪除情況:
- 數據塊所屬的HDFS文件被刪除
- 數據塊的副本數量多於配置表
- 副本被namenode標記損壞副本
- 在HDFS中,客戶端寫文件時需要先從租約管理器中申請一個租約。
- Namenode啓動時會首先加載命名空間鏡像併合並編輯日誌。
- 預防腦裂,HDFS提供三個級別的隔離機制:
- 共享存儲隔離
- 客戶端隔離
- Datanode隔離
- HA管理命令的執行是由HAAdmin爲負責的。
- Namenode三個類:
- Namenode類
- nameNode Rpcserver
- FSNamesystem類
- 塊池:一個塊池由屬於同一個命名空間的所有數據塊組成。
- 命名空間卷:一個namenode管理的命名空間以及它對應的塊池一起被稱爲命名空間卷。
- 每個塊池都是一個獨立的數據塊集合。
- Datanode從邏輯上可切分幾個模塊:
- 數據層
- 邏輯層:向NN彙報,心跳,掃描損壞數據塊
- 服務器
- Datanode升級需要考慮:
- 版本兼容性問題
- 升級消耗的硬盤空間問題
- 回滾要求
- Datanode兩個管理功能:
- 管理與組織磁盤存儲目錄
- 管理與組織數據塊及其元數據文件
- Storedirectory:
- 獲取文件夾相關
- 加鎖/解鎖
- 存儲狀態恢復
- 集中式緩存由分佈在datanode上的對外內存組成,同時被namenode統一管理。
- 數據包:
- 數據包頭
- 校驗數據
- 實際數據
- Java NIO零拷貝模式。
- Datanode掃描器同期驗證datanode上存儲的數據塊正確性。
- HDFS目前提供三個客戶端接口:
- distributedFileSystem
- FSShell
- DFSAdmin
- DFSClient是用戶使用HDFS各項功能的起點。
- HDFS管理員通過DFSAdmin工具管理與配置HDFS。
- HDFS目前實現的讀操作有三個層次:
- 網絡讀:socket
- 短路讀:同一節點
- 零拷貝讀:緩存轉換
- Shuffle和sort階段負責執行兩個主要動作:
- 決定哪個reducer接收map輸出的鍵值對(切片)
- 並確定傳輸給reducer的鍵值對是進行排序的
- MapReduce是基於批處理的框架,不適合實時訪問數據。
- Hadoop配置文件:
- Hadoop-env.sh ——設置環境變量
- Core-site.xml ——系統級的Hadoop配置項
- Hdfs-site.xml ——HDFS配置
- Mapred-site.xml ——HDFS設置
- Master ——Hadoop的master主機列表
- Slaves ——Hadoop的slave主機地址列表
- Flume四個組件:
- Nodes ——flume數據路徑
- Agents ——從本地主機上收集流數據
- Collectors ——彙總來自代理的數據
- Master——執行配置管理任務
- Flume以Avro Json格式寫數據。
- Agent數據接收器是Agent數據源的目的地。
- Flume數據源:
- Text ——處理一次的文本文件,每次處理一行
- Tail ——爲加入文件的每行生產一個事件
- Multitail ——tail工具支持多文件處理
- Syslogudp ——處理syslogUDP消息
- syslogTcp ——處理sysLogTcp消息
- execperiodic ——任意命令定期執行,整個輸出是一個事件
- execstream ——執行任意指令,每行是一個獨立事件
- exec ——定期執行任意指令並確定整個輸出的每行事件
- scribe ——處理scrive collection 系統生產的數據
- Collector數據接收器支持多種事件輸入格式:
- Syslog ——輸出類似syslog格式的事件
- Log4j ——輸出類似Hadoop log4j 格式的事件
- avroJson——輸出進過Avro編碼的json格式的數據
- avrodata ——輸出經過avro二進制編碼的數據
- debug ——僅在調試時使用
- raw——只輸出事件本身,不包含元數據
- spark編程模型是彈性分佈式數據集,他是MapReduce模型的擴展和延伸。
- RDD記錄血統,而不是真正數據。
- Spark四類操作:
- 創建操作:用於RDD創建工作
- 轉換操作:RDD變換成新的RDD
- 控制操作:RDD持久化
- 行爲操作:能夠觸發spark運行的操作
- 調度器安裝DAG進行計算,並最終得到目標RDD。
- RDD模型將計算分解爲多個相互獨立的細粒度任務。
- Spark中提供了通用接口來抽象每個RDD
- 分區信息:它們是數據集的最小分片
- 依賴關係:指向其父RDD
- 函數:基於RDD計算方法
- 劃分策略和數據位置的元數據
- RDD操作中用戶可以使用Partition方法獲取RDD劃分的分區數。
- Spark中RDD計算是以分區爲單位的。
- Spark默認連個劃分器:哈希分區和範圍分區。
- Hadoop中的每一個HDFS數據塊都稱爲一個RDD分區。
- Map/mapPartitions作用每個元素,每個分區。
- Checkpoint將切斷與該RDD之前的依賴關係。
- Spark基本概念:
- Application ——用戶編寫的spark應用程序
- Driver ——application的main創建sparkContext
- Cluster manager ——指在集羣上獲取資源的外部服務
- Standlone ——spark原生的資源管理
- Hadoop YARN
- Worl ——工作節點
- Master ——總控進程
- Executor ——執行進程
- Spark定義了通信框架接口,這些接口實現中調用netty的具體方法。
- Shuffle寫有基於哈希和排序兩種方式。
- Clustermanager提供了資源的分配和管理。
- 資源分配和調度的基本單位是container。
- 在YARN中,每個application實例都有一個application master進程。
- Application master是application啓動的第一個容器,它負責和resourceManager打交道並請求資源。
- Spark SQL執行過程:
- 詞法和語法解析
- 綁定
- 優化4. 執行
- Spark 提供了兩種方式將RDD轉換成DataFrame:
- 通過定義 case class ,使用反射推斷schema
- 通過編程接口,定義schema,並應用到RDD上
- YARN拆分Jobtracker的兩大職責:資源管理,作業調度/監控:
- 全局的resource Manager
- 每個應用對應的Application Master
- Resource Manager擁有爲系統中的所有應用的資源分配的決定權。
- Container爲應用程序授予在特定主機上使用資源全權利。
- YARN三種調度器:
- FIFO調度器
- Capacity調度器
- Fair調度器
- Storm一個work進程執行的是一個topplpgy的子集。
- Executor是一個被work進程啓動的單獨線程。
- Work之間通信是通過Netty進行通信的。
- Stream grouping:
- Shuffle ——隨機分組
- Fields ——按字段分組
- All ——廣播發送
- Non ——隨機分配
- Diret ——直接分組
- Task是運行spout或bolt中的線程。
- Strom的核心:
- 主節點 ——Nimbus
- 工作節點——supervisor
- 協調器——Zookeeper
- 工作進程——worker
- 任務線程——task
- Storm三大應用:
- 信息流處理
- 持續計算
- 分佈式遠程調用
- 提交一個Topology之後,storm創建spout/bolt實例big進行序列化。
- 流是一個分佈式並行創建和處理的無界的連續元組。
- Storm數據傳輸利用的是zmq開源的消息傳遞框架。
- Topology是由stream grouping鏈接起來的spout和bolt節點網絡。
- Tupe可以理解成鍵值對,即Fields和values。
- Tuple的asked,faild都由spout發出並維護的。
- 本地模式:storm用一個進程紅的線程模擬所有spout/bolt。
- Nimbus和supervisor之間的通信依賴Zookeeper完成。
- 用戶畫像是一個實際用戶的虛擬代表,如年齡,性別等。
- 在機器學習中,對象是指含有一組特徵的行變量。
- 行變量的集合最容易構造的結構就是表。
- Hadoop有三種令牌:
- 委託令牌
- 塊訪問令牌
- 作業令牌
- 對事物運動這種不確定性(隨機性)的度量就是概率論。
- 大數據4V:
- Volume ——數據體量大
- Variety ——數據類型繁多
- Velocity ——處理速度快
- Value ——商業價值高
- 移動互聯網產生了和客戶緊密擁綁的大數據。
- 在互聯網這個產業鏈中,誰掌握了用戶,誰的天下。
- 消費者的注意力和使用習慣去了哪裏,錢就會流向哪裏。
- 體驗的產生是一個藝術的過程。
- 大數據的目標是定位。
- 建立一個學習型企業架構。