天天看點

大資料生态圈相關總結

hadoop

1,資料越來越大,尤其是搜尋引擎公司,資料的類别---分為三種,結構型,非結構型,半結構型,對應産生的資料庫,關系型資料庫,非關系型資料庫;資料的來源---自己公司業務,爬蟲(網絡),購買(第三方交易);資料的處理---缺失字段,重要補全,不重要删除,隐私字段則脫敏

2,谷歌三篇論文  GFS(google filesystem)、産生了hdfs,解決海量資料存儲;MAPREDUCE、産生了mapreduce,解決計算;BIGTABLE,産生了hbase,解決海量資料查詢;最初的hadoop沒有yarn,就是hdfs和mr,和hbase。

3,大資料的核心概念---叢集(橫向擴充),分布式(分而治之),負載均衡(性能最優)

4,hadoop的啟動---start-hfs.sh  start-yarn.sh     hadoop-daemon.sh start namenode/secondarynamenode/datenode/resourcemanager/nodemanager ;啟動時報錯---要麼是格式化錯誤,要麼就是權限問題

5,hdfs設計思想有兩個,需要注意的也有兩點

切塊存儲(過大過小都會影響性能,其實所做的一切都是為了更快更好的完成存儲計算查詢);64-128-256(128M對應的134217728B),設定的參數是hdfs-default.xml中的hdfs.site.xml中的dfs.blocksize參數(所有的參數統屬于四類---core-default.xml、hdfs.default.xml、mapred.default.xml、yarn.default.xml)

備援存儲(其實就是防止當機影響資料的完整進行多備份),設定hdfs.default.xml中的hdfs.site.xml中的dfs.replication參數

需要注意的有兩點:副本的存儲和數量---存儲時要避免相同的副本備份到同一個節點(備份和副本都是複制,其差別在于有無主次,後者沒有);當機時若副本設定的數量少于現存節點,會重新複制一個副本,恢複當機後,會在一個小時後檢測是否真的恢複當機進而删除多餘的副本,副本數量設定的多餘總節點時會進行記賬

6,hdfs的架構:主從架構(主管理,從幹活)

namenode

---存儲中繼資料(相當于元類,描述原始資料的資料,簡明扼要的備注原始資料),hdfs的中繼資料包含三部分(抽象目錄樹,描述整個虛拟的所有datenode共同而非單一構成的存儲體系,由hdfs://hadoop01:9000入口)、(塊和資料的對應關系,每個塊實際是存在某一個datenode中,記錄其全局唯一的id,即blockid,記錄在mapred.site.xml檔案中)、(記錄資料塊的位置,即将blockid和節點一一對應)

---處理用戶端的資料讀寫請求,隻有namenode中有中繼資料,隻有中繼資料才能知道塊-id-節點的對應

secondarynamenode

---備份主節點的中繼資料,在主節點當機後進行資料恢複

---減輕主節點壓力,處理一些非核心問題

datenode

---負責資料的存儲,原始資料存儲好後生成一個id,産生一個中繼資料傳給namenode

---執行用戶端的資料讀寫請求,根據namenode給予的指令,存到該存的地方,讀取該讀的地方

7,hdfs的使用,有shell和api兩種

---shell指令:hadoop fs  xxxx(類似linux指令)

大資料生态圈相關總結

---api操作:用的很少

8,hdfs的四大機制

---心跳機制:報告namenode自己的存活狀況,心跳報告周期dfs.heartbeat.interval,當機次數dfs.namenode.handler.count

主動檢查dfs.namenode.heartbeat.recheck-interval,是以預設時确定當機需要10*3+300*2=630s

---機架政策:同樣的資料不要放在同一個節點,甚至同一個機架,甚至同一個機房,甚至同一個資料中心

---負載均衡:備援存儲的最開始是相對随機存儲的,是以會有負載不均的情況,叢集有自動調整的功能,dfs.datenode.balance.bandwidthPerSec,但是預設的為1M/s ,過大會影響性能,是以叢集規模不大時無所謂,叢集規模大時,則需要手動負載均衡,首先是調整帶寬,其次是start-balancer.sh  -t   10%(意思是datenode中的最大占比與最小占比相差少于10%,但不會立即執行,提升的是響應時效)   沒有絕對的負載均衡。

---安全模式:叢集的自我保護模式,限制使用者對叢集進行部分操作(實質就是不予許産生中繼資料的修改,查詢可以)。三種方式進入(叢集啟動時的順序name-date-secondaryname,依次啟動完後自動進入安全模式,namenode啟動時:磁盤中隻有中繼資料的前兩部分,記憶體中含有中繼資料的所有資訊,啟動時會将磁盤中的中繼資料全部加載到記憶體中;datenode啟動時:發送心跳報告,發送塊的相應資訊,将塊放到該放的節點上;secondarynamenode啟動時:檢查塊的副本數,dfs.namenode.replication.min,至少為1,檢查标準塊的比例,dfs.namenode.safenode.threshold-pct,檢查存活的datenode個數,dfs.namenode.safenode.min.datenodes,表示退出安全模式時安全節點的個數,為0表示立刻退出安全模式,大于節點數表示永遠處于安全模式,最後一項:三大标準符合30s之後退出安全模式,dfs.namenode.safemode.extension-----總結就是叢集啟動時進入安全模式的原因,那麼namenode将硬碟中的中繼資料加載打記憶體,namenode接收datenode傳來的心跳報告和塊報告,再者就是檢查叢集)、(叢集運作過程中進入安全模式:運作過程中會随時檢查每個副本個數是否大于1,以及符合标準的塊的比例是否達标,一旦不符則自動進入安全模式)、(叢集維護或系統更新時可以手動進入:

大資料生态圈相關總結

  )

安全模式時可以進行的操作---ls get tail cat  不可以的---mkdir put touchz rm        總之就是不允許中繼資料改變(namenode is in safe mode)

9,hdfs上傳

大資料生态圈相關總結

10,hdfs下載下傳

大資料生态圈相關總結

11,hdfs中繼資料合并

大資料生态圈相關總結
大資料生态圈相關總結

12,shuffle的原理

大資料生态圈相關總結
大資料生态圈相關總結
大資料生态圈相關總結
大資料生态圈相關總結
大資料生态圈相關總結
大資料生态圈相關總結
大資料生态圈相關總結

13、yarn的架構:主從架構,resourcemanager   nodemanager

---resourcemanager的作用(管理所有的nodemanager、監控其運作狀态,掌握其資源、為每一個job配置設定資源、啟動每一個job的老大,也就是MRappmaster,之後由其來排程整個job)

resourcemanager的組成(ASM(applicationsmanager):管理所有的應用程式、負責所有的job,啟動所有的mrappmaster、監控mrappmaster的運作,失敗時重新開機;Scheduler(排程器):就是負責排程各個job的送出順序,排程器的分類:FIFO,順序排程器,first in first out 先入先出  ,缺點是遇到大任務後造成後面的任務等待過長;Fair,公平排程器,n個job ,每個job占用1/n的資源,缺點是資源配置設定不合理,有的任務量很大資源不夠,有的任務量很小資源過剩;Capacity,計算能力排程器,又叫容量排程器,内部維護的是多個FIFO隊列,可以手動配置每個隊列的資源,)

系統預設的是Capacity,容量排程器,一個job開始時,首先通知ASM,ASM通知排程器,等待系統配置設定資源。

---nodemanager的作用,以container(邏輯資源容器,虛拟資源容器)為機關提供資源,container是一個虛拟劃分的資源,封裝了一定的cpu、記憶體、磁盤、網絡、io等,且數量必定為整數;

真正的作用,為job提供資源,向resourcemanager發送心跳報告,接收resourcemanager的指令,接收mrappmaster的指令。

jobclient裡面關于maptask初始化的源碼可以看到maptask的數量是由inputformat指定的,inputformater生成多少個inputspilt就會産生多少個maptask,若剩餘的map slot多餘inputspilt就會如數啟動,少于則将剩餘的全部啟動;而split與block的指定就決定了啟動多少maptask,預設一對一,這樣性能比較高,但是也可以設定成一對多。reduce task  由job中指定,如果不指定則預設啟動一個,指定多個則按照hash來進行分區。

sqoop和flume都是資訊收集元件

flume是分布式、可靠、高可用的海量日志收集器,進行收集、聚合、傳輸的系統,收集的是流動型資料,核心元件就是agent,(agent包含三部分,source用來靠近資訊源,收集資訊進行特定的格式化;channal是緩沖區,用來暫存source傳來的event(flume中存在的其實就是一個個的event,是一個特定格式的元素集合,位元組數組形式,并且攜帶有頭元素);sink,是處理緩沖區中的enent,将event序列化,進行持久性的儲存,處理完後傳入hdfs或者另一個source)其實就是附着在web、access、nginx的一個JVM,最終産生web.log  access.log nginx.log

flume的常用部署:單agent;多agent串聯;合并串聯;多路複用;高可用部署

常用元件:

---source:網絡端口;監控檔案;監控檔案夾

---channal:記憶體(memory);jdbc(形成一個臨時的資料庫,預設的是derby)

---sink:hdfs、kafka

大資料生态圈相關總結

sqoop是采集關系型資料庫資料,底層還是mr任務,導入是從資料庫導入到大資料平台DBinputformat,自定義資料輸入;導出是從大資料平台傳到關系型資料庫DBoutputformat,自定義資料輸出;

---導入:import   mysql---->hdfs/hive

--connect   
   mysql:jdbc://hdp03:3306/     //指定關系型資料庫連結url
--usename                         //資料庫的使用者名、密碼、需要遷移的表
--password
--table
--m                               //指定maptask的個數
--terget-dir                      //hdfs的存儲目錄
--fields-terminated-by            //指定每條記錄不同字段之間的分隔符
--where                           //指定sql的查詢條件
--query                           //指定查詢的sql
--columns                         //指定查詢的列,也就是需要導出的列 

列舉資料庫中有哪些資料庫,有哪些表,
list-datebases   list-tables   
           
大資料生态圈相關總結

---導出:export   hdfs/hive ----> mysql   ;導出不同于導入的特點是需要事先建表

首先是建立一個表
create datebase sqoopdb default character set utf8 collete utf8-general-ci;
use sqoopdb;
create table sqoopful(
    id int
    name varchar(60)
);

//導出HDFS資料到資料庫
sqoop export
--connect jdbc:mysql://hdp02:3306/sqoopdb \
--usename
--password
--table  sqoopdb             //事先已經建好的表
--export-dir /hdfs的目錄      //指定的是hdfs中的需要導出的檔案夾
--filed terminated-by 't'    //指定的是hdfs檔案中字段的分隔符

------------hive和hdfs與資料庫遷移的時候其實是一回事,因為hive是存在hdfs中的一個目錄 
           

---hbase和mysql的遷移

①可以介入hdfs使用mr進行遷移(hbse與hdfs之間的導入可以使用mr也可以使用hbse自帶的工具,hbase自帶的工具是:org.apache.hadoop.hbase.mapreduce.Export)

②也可以直接連接配接hbase和mysql,hbase到mysql的資料通道就算打通,問題的關鍵其實是,如何設計mysql裡的行資料,讓其轉換為hbase中的類資料,因為hbase是列式存儲,按照表->行->列簇:列->值的形式來存儲。

zookeeper

分布式的叢集管家,分布式服務的協調元件,管理叢集的配置檔案,元件版本,節點動态上線,分布式隊列,分布式同步鎖等分布式叢集中關于資料一緻性的各種繁瑣問題,可以很條理簡單的解決;其功能的實作基于兩部分,znode系統(挂載資料,存儲資料,但資料不可太大,不能超過1M,最好是1k左右)和watch監聽機制(回調 、異步)注冊一個個的監聽。

特點是對等架構,其實所做的事情核心隻有一件,就是保持資料的持久準确性,存入一個資料,隻要存進去,那麼必須保證它是對的,而且永不丢失。拜占庭問題的解決方案:鴿巢原理 抽屜原理(即W+R>N)(N是總節點個數,R是寫入成功節點個數,S是寫入失敗的節點個數,W是讀取資料的節點個數);為了保證順序,所有的提案也就是請求都必須有序;client是用戶端,發起請求,learner包括follower和observer,前者接收請求并傳回結果,且參與投票,後者接收到請求之後轉發給leaner節點且不參與投票,隻是實時同步learner的狀态,作用就是提升系統延展性,提高讀取速度;leader,負責投票的發起和決議,更新系統的狀态(即寫入資料,但讀取資料任一節點都可以)

leader的産生采用的是選舉制,leader的首要條件就是其節點的資料必須是完整且最新的,新的系統,那麼直接根據id來确定,大者直接當leader;參與生産的系統,采用版本和邏輯時鐘,最新版本可以參與競争,邏輯時鐘保證投票的準确性,最終獲得票數最多的就是新leader

azkaban

就是一個任務排程的元件,保證任務的順序執行,類似于crontab(但是比crontab更加複雜和功能強大),上傳一個壓縮檔案,然後進行腳本的運作;

安裝時時首先是上傳腳本檔案,配制環境變量,進行密匙認證,檢查時區,初始化即可

kafka

NIO:與普通的io作用和功能是一樣的,用來進行資料的傳輸,N的意思即是new,又是 non-blocking,相比普通io,普通io是面向流,nio是面向通道和緩沖區的;io沒有選擇器,對應的網絡程式設計是serversocket,即服務端和用戶端相比對,服務端會一直開啟等待着用戶端,是以是網絡程式設計時是阻塞式的,nio有選擇器,網絡程式設計時是非阻塞式的;從性能上來看nio比io的性能更好更高。

nio的兩道核心就是通道和緩沖區,通道是用來連接配接資料源和應用程式,(其實是連接配接緩沖區和資料源,而同道中不可以暫存資料,是以才必須要有緩沖區)緩沖區是用來臨時存儲資料的,底層是一個數組,不同類型的數組用來存儲不同類型的資料,緩沖區的大小實際就是數組的長度(緩沖區的重要屬性:capacity  容量 ;limit 限制;position 目前緩沖區的指針位置 mark 标記;緩沖區常用的方法:put get flip(進入讀模式) reset(讀取标記處)clear)(清空緩沖區) ),擷取緩沖區使用allocate

選擇器的用處是監控用戶端通道的狀态,将符合服務端需要的通道過濾出來,給服務端,是以做到非阻塞,高性能

大資料生态圈相關總結

kafka的功能:将生産者和消費者進行解耦,提供資訊暫存服務,持久化到磁盤,還可以降低峰值,以前是點對點的隊列服務,現在是生産者+伺服器+消費者,采用消息或産品釋出訂閱的形式,異步并行。

kafka由broker組成,他不是主從架構是對等架構,每個broker管理多個partition,每個partition中存在不同topic的不同的segment。partition副本預設是一個,且隻能變多不能變少。

由topic組成,每個topic由segment,segment是topic切割而成,topic1G切分一次,segment由log和index檔案組成。最小的機關是message,也就是segment由message組成,message包含key+value+時間戳。

消費者組是邏輯概念,并沒有實際分組切分,可以包含一到多個消費者,一個消費者組共同消費一整個topic的所有分區一次,也就是一個消費者可以消費整數倍的分區,消費的時候宏觀上并行,微觀上串行,廣播則需要所有的消費者處于不同的消費者組,單點傳播則要所有的消費者處于同一個消費者組

使用經驗:topic的分區數最好大于等于broker的數量,消費者組中消費者組的個數最好等于topic的分區數,這樣每個broker都會進行服務,讀寫和存儲效率都會比較高,

生産者push消息到kafka,消費者從kafka中pull消息。讀取消息的時候根據偏移量讀取,每個偏移量都是一個有序的序列,不超過8個位元組,保證一次讀取完成,低階API自己儲存偏移量,高階API不需要自己儲存偏移量,

Hbase

分布式資料庫,存儲能力無上限(分布的核心技術就是分庫分表,讀寫隔離),存儲非關系型資料,并且可以做到實時增删改查(單機型限制了其性能,無法實時,同時Hbase中還應用了許多)它的結構可以看做一個四維表,存入資料時不會進行檢查,底層均是位元組數組,查詢顯示時會檢測;次元表實質就是進制,可以解決一些數量問題(測出8隻8種藥水需要3隻小鼠。)整個表在rowkey方向劃分為region,region根據cf劃分為store(store實質就是一個二維表);幾維表即是幾個key确定一個value)(與進制的思想是一樣的),所有的資料庫,無論關系型還是非關系型都是key-value(map:key=object(id);mysql:key=object(id,column);hbase:key=object(id cf column ts)),根據算法(一般是hash算法)進行分區,這樣分區多少就可以将查詢效率提升多少(查詢時先進型算法,找到對應的分區)

region中存在緩沖區--memstore,産生很多小檔案,是以寫入資料是異步的,緩沖區滿了或手動都可以進行刷盤,也就是持久化到region,compact會将小檔案不斷合并,單個hfile會越來越大,之後運用split進行切割

rowkey 、cf  ttl、region的設計。

繼續閱讀