1. 這一篇和大家聊聊Hadoop

        共 11819字,需瀏覽 24分鐘

         ·

        2021-11-24 06:25

        hello大家好 我是大家的學(xué)習(xí)成長小伙伴Captain



        我們作為一個資深的CV工程師,在開發(fā)中肯定或多或少的接觸過些許大數(shù)據(jù)的知識,也或多或少的去了解過這些大數(shù)據(jù)知識,在現(xiàn)在這個數(shù)據(jù)為王的時代,在現(xiàn)在這個數(shù)據(jù)量和數(shù)據(jù)級在日益增長的今天,大數(shù)據(jù)變得熾手可熱


        那么什么是大數(shù)據(jù)呢,以及我們最常聽說過的Hadoop、spark、storm、flink各自的優(yōu)缺點、擅長的方向都是什么呢,以及hive、HBASE這些都是如何基于hdfs存儲數(shù)據(jù)的,如何來分區(qū)數(shù)據(jù)的呢


        Hadoop中的hdfs到底是如何支持這么大量的數(shù)據(jù)存儲的,到底是什么結(jié)構(gòu),如何保證可靠性,而MapReduce又是如何進行協(xié)調(diào)計算的,yarn是如何進行相應(yīng)的資源管理的


        ZooKeeper是如何為分布式應(yīng)用進行協(xié)調(diào)服務(wù)的,sqoop是如何把hive和傳統(tǒng)的數(shù)據(jù)庫進行數(shù)據(jù)傳遞的呢,oozie和azkban都是如何進行任務(wù)工作流調(diào)度的呢,底層都是如何工作的


        flume是如何基于流式結(jié)構(gòu)提供海量的日志采集、聚合和進行傳輸?shù)哪?,而kafka又是如何在眾多消息隊列中脫穎而出的呢,哦對了,還有我們以前說的rocketmq,這倆到底是啥區(qū)別,這倆貨的擅長的點都在哪里


        等等...


        各行各業(yè),都要活到老學(xué)到老,就像聯(lián)盟中的劍圣說過的一句話:真正的大師永遠都懷著一顆學(xué)徒的心。A true master is an external student


        我們這一篇只是對大數(shù)據(jù)領(lǐng)域的Hadoop進行簡單的了解,后續(xù)我們會持續(xù)對來和大家一起探討大數(shù)據(jù)領(lǐng)域的其它技術(shù)


        什么是大數(shù)據(jù)

        大數(shù)據(jù),指的就是大數(shù)據(jù)的集合,不能使用傳統(tǒng)的計算技術(shù)來處理,或者說無法在一定時間范圍內(nèi)來進行處理,需要用更新的處理模式才可以更好的這些量很大的數(shù)據(jù)

        那么什么叫大數(shù)據(jù),首先應(yīng)該是數(shù)據(jù)量大,種類多,增長的很快,價值密度也很低,我們需要用相應(yīng)的技術(shù)來分析處理得出更有價值的數(shù)據(jù),就像我們上面說的那些技術(shù),可以合作工作更好的進行數(shù)據(jù)的處理和分析

        數(shù)據(jù)量大

        數(shù)據(jù)集合的規(guī)模的不斷擴大,已經(jīng)將數(shù)據(jù)從GB增加到TB、PB級別,甚至數(shù)據(jù)都要以EB和ZB來進行計數(shù)

        數(shù)據(jù)時效性

        數(shù)據(jù)量的產(chǎn)生的速度也在持續(xù)的加快,人們現(xiàn)在使用網(wǎng)絡(luò)的頻率越來越高,也就是隨之產(chǎn)生的數(shù)據(jù)的速度越來越快,我們更需要根據(jù)數(shù)據(jù)來更快的進行提取和分析,才能保證分析結(jié)果的時效性

        比如我們需要根據(jù)用戶的最近的瀏覽來分析出用戶的最近的喜好,來更好的推薦商品,也就是所謂的推薦系統(tǒng),那么如果這個推薦系統(tǒng)每天會進來大量的數(shù)據(jù),但是分析的卻很慢,需要運行一周,那這就很糟糕了啊,這分析出來的結(jié)果的可信度就很低了,時效性很差了就

        數(shù)據(jù)處理速度變得越來越快,處理模式已經(jīng)逐漸的從批處理轉(zhuǎn)向了流處理,即時效性越來越強,我們每時每刻都在瀏覽抖音、淘寶,這些數(shù)據(jù)都會立刻通過推薦系統(tǒng),來給大家推薦出大家更想要的結(jié)果

        當然,很多場景并不需要很好的時效性,可能一周或者一個月都能在接受的范圍內(nèi),比如統(tǒng)計報表這種,這些就是批處理的強項了

        數(shù)據(jù)多樣性

        大數(shù)據(jù)的數(shù)據(jù)類型繁多,傳統(tǒng)的IT行業(yè)產(chǎn)生和處理的數(shù)據(jù)可能通過簡單的數(shù)據(jù)類型處理就可以,大部分都是結(jié)構(gòu)化數(shù)據(jù),而隨著物聯(lián)網(wǎng)的越來越深入,各行各業(yè)都在引入互聯(lián)網(wǎng),產(chǎn)生的數(shù)據(jù)也更加多樣化,需要更多的圖片、數(shù)據(jù)這些非結(jié)構(gòu)化的數(shù)據(jù)進行存儲

        于是就有了MongoDB這種存儲非結(jié)構(gòu)化的數(shù)據(jù)的數(shù)據(jù)庫,各種數(shù)據(jù)層出不窮,也就更需要對這些數(shù)據(jù)進行分析

        數(shù)據(jù)價值低

        由于數(shù)據(jù)量的不斷加大,單位數(shù)據(jù)的價值密度也就變得更低,然而數(shù)據(jù)的總體價值還是在增加的,于是我們?nèi)绾卧诿芏雀偷拇罅繑?shù)據(jù)中提取出那些有用的數(shù)據(jù)變得尤為重要

        了解Hadoop

        大家可能或多或少的了解多Hadoop這個技術(shù)框架,這個屬于大數(shù)據(jù)領(lǐng)域最主流的一套技術(shù)體系了,用Java編寫的一個Apache技術(shù)開源框架,允許使用簡單的編程模型就可以通過計算機集群進行分布式處理大型的數(shù)據(jù)集合

        Hadoop框架的目的在于從單個服務(wù)器擴展到數(shù)千個服務(wù)器,每個都提供者本地計算和本地存儲的功能,突出一個集中力量辦大事

        Hadoop主要包含hdfs分布式文件存儲系統(tǒng)、yarn分布式資源調(diào)度系統(tǒng)、MapReduce分布式計算系統(tǒng),這幾個家伙都是各有各的本事,每個都身懷絕技,下面我們會對這幾個身懷絕技的家伙進行分析一番,看看這些絕技到底是如何煉成的

        我們從一個系統(tǒng)開始分析,系統(tǒng)小的時候,使用數(shù)據(jù)庫mysql和MongoDB就沒問題,mysql存儲結(jié)構(gòu)化數(shù)據(jù),MongoDB存儲非結(jié)構(gòu)化數(shù)據(jù),然后使用redis進行數(shù)據(jù)的緩存增加系統(tǒng)的速度和性能

        我們假設(shè)使用的mysql服務(wù)器的磁盤可以存儲1TB的數(shù)據(jù),但是我們不能保證數(shù)據(jù)量一直在1TB之內(nèi)啊

        隨著系統(tǒng)的業(yè)務(wù)越來越大,1TB的數(shù)據(jù)庫已經(jīng)完全不夠數(shù)據(jù)的存儲了,咋辦,加機器,分庫分表,每個服務(wù)器放一部分數(shù)據(jù)

        分庫分表也就隨之帶來了更多的問題,比如我們需要保證保證數(shù)據(jù)能夠準確的找到相應(yīng)的機器,也能夠準確的存儲到相應(yīng)的機器上,一般由垂直切分和水平切分兩種思路

        再比如涉及到跨表的join的問題,因為基于架構(gòu)規(guī)范和安全性這些考慮,一般是禁止跨庫join這種的,可以采用全局表和字段冗余的方式解決,全局表就是將一些系統(tǒng)中幾乎所有模塊都可能依賴的一些表,讓每個機器都存儲一份,這樣就可以很好的避免跨庫join。字段冗余就是把相同的字段多存儲幾份咯,總的來說思路就是用空間換時間的一種思想

        岔劈了,分庫分表可以用來解決一些必要數(shù)據(jù)的存儲,但是比如一些無關(guān)緊要的數(shù)據(jù),但是又有一些提取的價值,比如用戶在某電商網(wǎng)站在APP或者網(wǎng)站的點擊、購買和瀏覽的行為日志,這些肯定是沒必要全部存儲到mysql的,我們需要保存的是經(jīng)過推薦系統(tǒng)分析之后的數(shù)據(jù),而這些日常的行為數(shù)據(jù)沒必要去全量保存到mysql中的

        沒必要保存到mysql并不意味著不需要保存,Hadoop中的hdfs就是干這個的,負責把這些大量的數(shù)據(jù)保存起來,只需要在機器上部署上Hadoop服務(wù)即可,機器是很廉價的,后續(xù)這種數(shù)據(jù)直接加機器就可以了

        某天leader來了,要看一個報表,如果這些"臟數(shù)據(jù)"全部存儲到mysql中,可能需要寫一個幾百行甚至上千行的SQL才能拿到結(jié)果,幾百行的SQL直接執(zhí)行在分庫分表的架構(gòu)上,這就有點扯了

        更何況,mysql還存儲了大量的無用數(shù)據(jù),我們需要讓專業(yè)的人辦專業(yè)的事

        于是各種處理這種數(shù)據(jù)量極其大的各種技術(shù)應(yīng)運而生,大數(shù)據(jù)分析就涉及到實時性這個特點,我們上面也說過了

        實時性要求不高的可以用批處理進行稍微較慢的處理,而實時性要求較高的場景則需要用流式處理來進行分析,達到一種幾乎實時的效果

        說說主角Hadoop

        Hadoop分為四個模塊,common、hdfs、yarn、MapReduce這四個

        ? ? ? ? ? ?

        common:Hadoop模塊需要的Java庫和實用程序,這些庫等同于是實現(xiàn)各種功能的地基

        hdfs:分布式文件存儲系統(tǒng),像文件夾一樣存儲,數(shù)據(jù)在hdfs中就像存儲在本地磁盤上一樣,而實際上文件會被切分成很多的小塊,然后分布到各個機器中

        yarn:作業(yè)調(diào)度和集群資源管理的一個框架

        MapReduce:用于并行處理大數(shù)據(jù)的計算系統(tǒng),可分為map和reduce兩個重要任務(wù)來協(xié)作完成數(shù)據(jù)的處理

        Hadoop特點

        高擴容能力,支持超大的文件,能夠支持存儲和處理超大數(shù)據(jù)量

        成本低,只需要購買普通的機器部署Hadoop服務(wù),組成Hadoop集群即可進行存儲和處理數(shù)據(jù),服務(wù)群可達數(shù)千個節(jié)點

        高效率,通過多個機器進行分布式處理,可以讓性能更好的服務(wù)器并行地處理數(shù)據(jù),然后把處理結(jié)果進行合并即可,而且Hadoop可以在節(jié)點之間動態(tài)的移動弄個數(shù)據(jù),保證各個節(jié)點之間的動態(tài)平衡

        可靠性,大文件的數(shù)據(jù)的存儲會被切分成多個數(shù)據(jù)塊分別存儲到不同的機器上,而每個數(shù)據(jù)塊存儲都不支一塊,且多塊不會存儲在同一個機器上,保證了數(shù)據(jù)的高可靠性

        Hadoop更適合于那種寫一次,讀多次的業(yè)務(wù)場景,Hadoop是不支持數(shù)據(jù)級別的修改的,只支持到文件級別的操作

        我們在使用Hadoop的過程中的感覺其實也是像在操作一個云上的電腦磁盤,也提供了豐富的API供我們直接使用

        適合場景

        • 大規(guī)模數(shù)據(jù)

        • 流式數(shù)據(jù),然后寫一次讀多次的場景

        • 商用的普通硬件即可


        不適合場景

        • 低延時的業(yè)務(wù)場景

        • 大量的小文件數(shù)據(jù)

        • 頻繁的修改數(shù)據(jù)


        總之,Hadoop很強,但是并不是適合所有的業(yè)務(wù)場景,再時髦的技術(shù)都是隨著業(yè)務(wù)誕生的,脫離了業(yè)務(wù)的技術(shù)就像是沒了靈魂的軀殼,是沒有意義滴

        接下來我們看Hadoop其中的部分組件是如何各顯神通

        HDFS

        hdfs是啥

        hdfs這個的神通就是能夠完成巨大數(shù)據(jù)量的存儲功能

        只需要加機器就可以完成更多的數(shù)據(jù)存儲

        對外提供文件目錄,我們只需要用對外開放的API直接像操作文件夾是的操作即可

        hdfs就像是一個適配器,底層多個硬盤空間,累加到一起,然后對外就是一個/usr/tmp/captain.mp4這樣的文件訪問目錄

        hdfs內(nèi)部原理

        hdfs就是一個文件系統(tǒng),用于存儲文件,通過目錄樹來定位文件,它是屬于一個分布式的,由很多服務(wù)器聯(lián)合起來來實現(xiàn)相應(yīng)的功能

        hdfs的設(shè)計適合的是一次寫入,多次讀出的場景,并且不支持文件的修改,只支持文件級別的修改,就是可以對文件整體進行操作

        hdfs的角色

        • NameNode:負責處理client的請求、元數(shù)據(jù)管理等功能

        • DataNode:主要用來存儲文件塊,并且向NameNode匯報存儲信息

        • Client:客戶端,和NameNode、DateNode進行交互的

        • SecondaryNamenode:分擔NameNode的壓力,但是并不能替代,主要是進行元數(shù)據(jù)的合并


        切記,SecondaryNamenode是不能替代NameNode的,這一點不像是平時那種主從架構(gòu),主掛了,從可以升為從的那種,很多小伙伴可能會混淆


        Client


        上傳文件,向NameNode發(fā)送寫請求


        進行數(shù)據(jù)的切塊,默認128M一塊


        讀取文件,向NameNode發(fā)送讀取請求


        NameNode


        接收客戶端的讀寫請求,進行數(shù)據(jù)庫元數(shù)據(jù)位置的存儲


        分配數(shù)據(jù)塊的存儲節(jié)點


        接收DataNode的數(shù)據(jù)匯報,因為數(shù)據(jù)是存儲到DataNode的,但是它也就是個存數(shù)據(jù)的,至于它存儲哪些都需要NameNode進行管理,并未要匯報給NameNode


        DataNode


        真正的數(shù)據(jù)存儲,每個數(shù)據(jù)塊存儲的還不止一份,默認每個塊是存儲3份


        真正的處理用戶的讀寫請求的,就是真正干活的,拿出數(shù)據(jù)來的


        向NameNode發(fā)送心跳和匯報相應(yīng)的數(shù)據(jù)塊的存儲信息


        SecondaryNamenode


        備份NameNode的元數(shù)據(jù)信息


        幫助NameNode進行元數(shù)據(jù)的合并,減輕NameNode的壓力


        hdfs的優(yōu)點

        高容錯性:默認會存儲三份備份數(shù)據(jù),增加容錯性,副本丟失,可以自動恢復(fù)

        適合大數(shù)據(jù)處理:可以通過增加機器的方式來進行更高級別數(shù)據(jù)的存儲的處理

        hdfs缺點

        不適合低延時數(shù)據(jù)的訪問,毫秒級別的存儲數(shù)據(jù)是做不到的

        不擅長處理大量小文件,無法對大量小文件進行存儲

        不支持多線程寫入文件

        shell操作示例

        //基本語法bin/hadoop fs 具體命令  
        //查看指定目錄下內(nèi)容hadoop fs –ls [文件目錄]
        //顯示文件內(nèi)容hadoop dfs –cat [file_path]
        //將本地文件存儲至hadoophadoop fs –put [本地地址] [hadoop目錄]
        //將hadoop上某個文件down至本地已有目錄下hadoop fs -get [文件目錄] [本地目錄]
        //刪除hadoop上指定文件或文件夾hadoop fs –rm [文件地址]
        //刪除hadoop上指定文件夾(包含子目錄等hadoop fs –rm [目錄地址]
        //在hadoop指定目錄內(nèi)創(chuàng)建新目錄hadoop fs –mkdir /user/t
        //在hadoop指定目錄下新建一個空文件hadoop?fs?-touchz??/user/new.txt
        //將hadoop上某個文件重命名hadoop?fs?–mv??/user/test.txt??/user/ok.txt???(將test.txt重命名為ok.txt)
        //將hadoop指定目錄下所有內(nèi)容保存為一個文件,同時down至本地hadoop fs –getmerge /user /home/t
        //將正在運行的hadoop作業(yè)kill掉hadoop job –kill [job-id]
        //輸出這個命令參數(shù)hadoop fs -help rm
        //從本地剪切粘貼到HDFShadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
        //追加一個文件到已經(jīng)存在的文件末尾hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
        //Linux文件系統(tǒng)中的用法一樣,修改文件所屬權(quán)限hadoop?fs??-chmod??666??/sanguo/shuguo/kongming.txt
        //從本地文件系統(tǒng)中拷貝文件到HDFS路徑去hadoop?fs?-copyFromLocal?README.txt?/
        //從HDFS拷貝到本地hadoop?fs?-copyToLocal?/sanguo/shuguo/kongming.txt?./
        //從HDFS的一個路徑拷貝到HDFS的另一個路徑hadoop?fs?-cp?/sanguo/shuguo/kongming.txt?/zhuge.txt
        //顯示一個文件的末尾hadoop fs -tail /sanguo/shuguo/kongming.txt
        //刪除空目錄hadoop fs -rmdir /test
        //設(shè)置HDFS中文件的副本數(shù)量hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt


        Java的API操作示例

        ????//HDFS文件上傳    public void testPut() throws Exception {          Configuration configuration = new Configuration();          FileSystem fileSystem = FileSystem.get(                  new URI("hdfs://hadoop102:9000"),                  configuration,                  "drift");  
        fileSystem.copyFromLocalFile( new Path("f:/hello.txt"), new Path("/0308_666/hello1.txt")); fileSystem.close(); ????}?????????//HDFS文件下載 public void testDownload() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 執(zhí)行下載操作 fileSystem.copyToLocalFile( false, new Path("/0308_666/hello.txt"), new Path("f:/hello1.txt"), true); // 3 關(guān)閉資源 fileSystem.close(); System.out.println("over"); }
        ????//HDFS文件夾刪除 public void delete() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 執(zhí)行刪除操作 fileSystem.delete(new Path("/0308_777"), true); // 3 關(guān)閉資源 fileSystem.close(); System.out.println("over"); }????????//HDFS文件夾名更改 public void testRename() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 執(zhí)行重命名操作 fileSystem.rename(new Path("/0308_666/hello.txt"), new Path("/0308_666/hello2.txt")); // 3 關(guān)閉資源 fileSystem.close(); System.out.println("over"); }????????//HDFS文件詳情查看 public void testLS1() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 查詢文件信息 RemoteIterator listFiles = fileSystem.listFiles(new Path("/"), true); while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); // 文件的長度 System.out.println(fileStatus.getLen()); // 文件的名字 System.out.println(fileStatus.getPath().getName()); // 文件的權(quán)限 System.out.println(fileStatus.getPermission()); BlockLocation[] locations = fileStatus.getBlockLocations(); for (BlockLocation location : locations) { String[] hosts = location.getHosts(); for (String host : hosts) { System.out.println(host); } } System.out.println("---------------分割線---------------"); } // 3 關(guān)閉資源 fileSystem.close(); }????????//HDFS文件和文件夾判斷 public void testLS2() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 文件和文件夾的判斷 FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/")); for (FileStatus fileStatus : fileStatuses) { if (fileStatus.isFile()) { System.out.println("F:" + fileStatus.getPath().getName()); } else { System.out.println("D:" + fileStatus.getPath().getName()); } } // 3 關(guān)閉資源 fileSystem.close(); }

        Yarn

        yarn是什么

        yarn屬于Hadoop的資源管理系統(tǒng),基本設(shè)計思路是分為一個全局的資源管理器ResourceManager和每個應(yīng)用程序持有的ApplicationMaster,還有一個節(jié)點的資源管理器NodeManager


        yarn組成結(jié)構(gòu)

        YARN總體上仍然是Master/Slave結(jié)構(gòu)

        在整個資源管理框架中,ResourceManagerMaster,NodeManagerSlave,ResourceManager負責對各個NodeManager上的資源進行統(tǒng)一管理和調(diào)度

        當用戶提交一個應(yīng)用程序時,需要提供一個用以跟蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,并要求NodeManger啟動可以占用一定資源的任務(wù)。由于不同的ApplicationMaster被分布到不同的節(jié)點上,因此它們之間不會相互影響

        ResourceManager

        ?

        RM是一個全局的資源管理器,負責整個系統(tǒng)的資源管理和分配。它主要由兩個組件構(gòu)成:調(diào)度器和應(yīng)用程序管理器

        ?

        調(diào)度器

        ?

        調(diào)度器根據(jù)容量、隊列等限制條件(如每個隊列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個正在運行的應(yīng)用程序


        該調(diào)度器是一個純調(diào)度器,它不再從事任何與具體應(yīng)用程序相關(guān)的工作,這些工作均交給應(yīng)用程序相關(guān)的ApplicationMaster


        調(diào)度器僅根據(jù)各個應(yīng)用程序的資源需求進行資源分配,該調(diào)度器是一個可插拔的組件,用戶可根據(jù)自己的需要設(shè)計新的調(diào)度器,YARN提供了多種直接可用的調(diào)度器,比如Fair SchedulerCapacity Scheduler

        ?

        應(yīng)用程序管理器

        ?

        應(yīng)用程序管理器負責管理整個系統(tǒng)中所有應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動ApplicationMaster、監(jiān)控ApplicationMaster運行狀態(tài)并在失敗時重新啟動它等

        ?

        ApplicationMaster

        ?

        用戶提交的每個應(yīng)用程序均包含一個AM,與RM調(diào)度器協(xié)商以獲取資源(Container表示),將得到的任務(wù)進一步分配給內(nèi)部的任務(wù)

        ?

        與NM通信以啟動/停止任務(wù)

        ?

        監(jiān)控所有任務(wù)運行狀態(tài),并在任務(wù)運行失敗時重新為任務(wù)申請資源以重啟任務(wù)

        ?

        NodeManager

        ?

        NM是每個節(jié)點上的資源和任務(wù)管理器


        一方面,它會定時地向RM匯報本節(jié)點上的資源使用情況和各個Container的運行狀態(tài)


        另一方面,它接收并處理來自AMContainer啟動/停止等各種請求

        ?

        Container

        ?

        Container是YARN中的資源抽象,它封裝了某個節(jié)點上的多維度資源,如內(nèi)存、CPU、磁盤等,當AMRM申請資源時,RMAM返回的資源便是用Container表示的


        YARN會為每個任務(wù)分配一個Container,且該任務(wù)只能使用該Container中描述的資源

        MapReduce

        什么是MapReduce

        MapReduce是一個分布式運算程序的編程框架,是用戶開發(fā)基于hadoop的數(shù)據(jù)分析應(yīng)用的核心框架

        Mapreduce核心功能是將用戶編寫的業(yè)務(wù)邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序,并發(fā)運行在一個hadoop集群上

        海量數(shù)據(jù)在單機上處理因為硬件資源限制,無法勝任,引入mapreduce框架后,可以很好的處理多個機器的資源來進行計算,開發(fā)人員可以將絕大部分工作集中在業(yè)務(wù)邏輯的開發(fā)上,而將分布式計算中的復(fù)雜性交由框架來處理。

        mapreduce就是這樣一個分布式程序的通用框架


        優(yōu)點

        MapReduce 易于編程:簡單的實現(xiàn)一些接口,就可以完成一個分布式程序,這個分布式程序可以分布到大量廉價的PC機器上運行


        良好的擴展性:當你的計算資源不能得到滿足的時候,你可以通過簡單的增加機器來擴展它的計算能力


        高容錯性:其中一臺機器掛了,它可以把上面的計算任務(wù)轉(zhuǎn)移到另外一個節(jié)點上運行,不至于這個任務(wù)運行失敗,而且這個過程不需要人工參與,而完全是由Hadoop內(nèi)部完成的


        適合PB級以上海量數(shù)據(jù)的離線處理:可以實現(xiàn)上千臺服務(wù)器集群并發(fā)工作,提供數(shù)據(jù)處理能力


        缺點

        不擅長實時計算:MapReduce無法像Mysql一樣,在毫秒或者秒級內(nèi)返回結(jié)果


        不擅長流式計算:流式計算的輸入數(shù)據(jù)是動態(tài)的,而MapReduce的輸入數(shù)據(jù)集是靜態(tài)的,不能動態(tài)變化。這是因為MapReduce自身的設(shè)計特點決定了數(shù)據(jù)源必須是靜態(tài)的

        Hadoop中的數(shù)據(jù)壓縮

        壓縮技術(shù)能夠有效減少底層存儲系統(tǒng)(HDFS)讀寫字節(jié)數(shù)。壓縮提高了網(wǎng)絡(luò)帶寬和磁盤空間的效率


        Hadoop下,尤其是數(shù)據(jù)規(guī)模很大和工作負載密集的情況下,使用數(shù)據(jù)壓縮顯得非常重要。在這種情況下,I/O操作和網(wǎng)絡(luò)數(shù)據(jù)傳輸要花大量的時間


        鑒于磁盤I/O和網(wǎng)絡(luò)帶寬是Hadoop的寶貴資源,數(shù)據(jù)壓縮對于節(jié)省資源、最小化磁盤I/O和網(wǎng)絡(luò)傳輸非常有幫助,如果磁盤I/O和網(wǎng)絡(luò)帶寬影響了MapReduce作業(yè)性能,在任意MapReduce階段啟用壓縮都可以改善端到端處理時間并減少I/O和網(wǎng)絡(luò)流量


        壓縮Mapreduce的一種優(yōu)化策略:通過壓縮編碼對Mapper或者Reducer的輸出進行壓縮,以減少磁盤IO,提高MR程序運行速度(但相應(yīng)增加了cpu運算負擔)


        注意:采用壓縮技術(shù)減少了磁盤IO,但同時增加了CPU運算負擔。所以,壓縮特性運用得當能提高性能,但運用不當也可能降低性能



        運算密集型的job,少用壓縮


        IO密集型的job,多用壓縮

        結(jié)束語


        感謝大家能夠做我最初的讀者和傳播者,請大家相信,只要你給我一份愛,我終究會還你們一頁情的。


        Captain會持續(xù)更新技術(shù)文章,和生活中的暴躁文章,歡迎大家關(guān)注【Java賊船】,成為船長的學(xué)習(xí)小伙伴,和船長一起乘千里風、破萬里浪


        哦對了,后續(xù)所有的文章都會更新到這里


        https://github.com/DayuMM2021/Java





        瀏覽 68
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 护士脱了衣服让我爽了一夜 | 寂寞少妇勾搭男按摩技师 | 青娱乐人操 | 一线天在线视频 | 夜夜嗨精品 |