大數據框架整理

来源:http://www.cnblogs.com/zmdandy/archive/2017/01/06/6255860.html
-Advertisement-
Play Games

大數據離線部分 1、HDFS 1:HDFS的架構部分及工作原理 NameNode:負責管理元素據,將信息保存在記憶體中 DataNode:保存數據,以塊的形式保存。啟動後需要定時的向NameNode發送心跳,報告自身存儲的塊信息 2:HDFS的上傳過程 3:HDFS的下載 4:NameNode的元數據 ...


大數據離線部分

1、HDFS

1:HDFS的架構部分及工作原理

    NameNode:負責管理元素據,將信息保存在記憶體中

    DataNode:保存數據,以塊的形式保存。啟動後需要定時的向NameNode發送心跳,報告自身存儲的塊信息

 

2:HDFS的上傳過程

3:HDFS的下載

 

4:NameNode的元數據安全機制

 

  以記日誌的形式將每一個操作寫在磁碟的日誌文件中,然後藉助Secondary NameNodecheckpoint功能將fsImage和日誌進行合併。

  重點:記住checkpoint工作過程

 

5:如果伺服器的磁碟壞了,如何輓救數據?

  配置多個dfs.namenode.name.dir 路徑為本地磁碟路徑和nfs網路磁碟路徑。

 

6:hdfs集群中,受到拓展瓶頸的是NameNode還是Datanode?

  NameNode,因為DataNode不夠可以很方便的水平拓展,而工作的NameNode只有一個,他的存儲能力完全取決於他的記憶體,所以。。。。,

  但是其實NameNode一般不會成為瓶頸,因為一個塊記錄的元數據信息大小約為150B,如果每一個塊大小為128M的話,那麼15GNameNode記憶體可以存儲12PB的數據。

 

7:datanode明明已啟動,但是集群中的可用datanode列表中就是沒有,怎麼辦?

  已經不是處女,在她的Data目錄下,已經有其他NameNode的標記,這個NameNode不認。

 

8:文件下載到window中,為什麼會報錯?

  預設使用操作系統的內核進行磁碟數據的寫入,也就是需要一個winutil的工具,而預設的安裝包中不提供,所以需要編譯源碼或者設置為使用Java的進行磁碟寫入。

 

9:hadoopHA(高可用)

2、MapReduce

1MapReduce中,fileinputformat -> map -> shuffle -> reduce的過程

2MapReduce中,job提交的過程

3:自定義Javabean作為數據,需要extends writableandCompareble介面。

4:自定義outputformat,進行不同方向的處理。

5MapReduce的一些應用場景

    1、排序並且求 TOPOne TOPN

    2、求某個用戶前幾個月的總流量,並且選擇出流量前幾名的用戶。

    3reduce端的join

    4mapjoin

    5、求共同好友問題

3、hive

1:什麼是hive?

    一個將sql轉化為MapReduce程式的、單機版的、數據倉庫工具。通過關係型資料庫(mysql等)來記錄表元數據信息。真正的數據在HDFS中。

 

    Hive利用HDFS存儲數據,利用MapReduce查詢分析數據

 

    hive2.0版本之後,都是基於Spark處理了。

    安裝的時候,需要註意jline的版本衝突。

 

2:如何啟動?

 

3:執行的sql的形式

    hiveshell、 hive -e "sql命令" hive -f "一個包含著很多SQL語句的文件"

 

4:hive的創建表操作

    內部表、外部表   就差連個關鍵字(external 和 location)

    分區表、分桶表

5:hive查詢表

    join

    動態分區

    分組查詢

    複雜的那個累計報表操作。

6:hive自定義函數(UDF)

4、sqoop

利用hadoop的map端進行數據的並行導入導出。

安裝在HDFS上,配置HDFS的路徑和Hive路徑即可。

5、flume

1agent:sources 、 channel 、 sinks

2sources:exec、spooldir、arvo (加一個攔截器)3channel:men 、 disk4sinks:arvo 、HDFS、kafka

5flume安裝在數據源這一邊。

6:如何自定義攔截器?class myiterceptor implements Iterceptor

    //裡面有一個靜態的公共內部類。

    public static class mybuilder implements Iterceptor.Builder

7:如何實現flume的多級連接,以及如何實現高可用?

大數據實時storm部分

storm

1:storm是一個實時的計算框架,只負責計算,不負責存儲。它通過spout的open和nextTuple方法去外部存儲系統(kafka)獲取數據,然後傳送給後續的bolt處理,

  bolt利用prepareexecute方法處理完成後,繼續往後續的bolt發送,或者根據輸出目錄,把信息寫到指定的外部存儲系統中。

2storm的數據不丟失原理

    交叉收到的數據做異或元算中間結果不為0的原理。

3:設置spout_max_pending (可以限流)

4jstorm的通信機制,每一個:worker都有一個接受線程和輸出線程

5storm的架構分析

    nimbus、zookeeper、supervisor、worker

    nimbus:接受任務請求,並且進行任務的分發,最後寫入到zookeeper中。

    supervisor:接受nimbus的任務調度,然後啟動和管理屬於自己的worker進程,supervisor是可以快速失敗的,不影響任務的執行。

                我們可以寫一個腳本來監控supervisor的進程,如果不存在了,立馬啟動,就可以了。

    worker:啟動spoutTask、boltTask等等任務,去執行業務邏輯。

6storm的編程模型

    topology:由spout和bolt組成的一個流程圖。他描述著本次任務的信息

    spout:

        open

        nexttuple

        declareOutputFields

    bolt:

        prepare

        execute

        declareOutputFields

6storm的tuple結構,它裡面有兩個數據結構,一個list、一個是map

    list:記錄著信息

    map:記錄著每個欄位對應的下表,通過找到下邊再去上面的list中找數據。

7storm任務提交的過程

kafka

1kafka和jms的區別

2kafka的topic理解

    topic是邏輯存在的,真正在物理磁碟中的體現是partitioner,一個topic可以對應多個partition,不同的paritition存放在不同的broker中,以提高併發存儲能力。

3partitioner

    partitiontopic信息在屋裡存儲中的具體體現,在磁碟中它是一個文件夾,名字是topic名字_partition編號。4segment

    每個partition對對應多個segment文件,預設大小是1G,為了快速定位到指定的offset位置。

5kafka為什麼這麼快

    1/使用了操作系統使用的pagecache緩存,緩存大,緩存到一定量的數據時,以順序寫入的方    式寫入到磁碟中。

        因為:磁碟順序寫入的方式非常的快=>600MB/s,而隨機存儲只有100kb/s左右。

    2/使用操作系統的sendfile技術。在讀取信息發送的時候,不需要經過用戶區,而是在os端直接發送,可以減少很多步驟。

6、為什麼要多個partitioner7、為什麼每個partitioner需要切分為多個segment文件

8kafka的HA

    partitioner分區進行備份,利用zookeeper的選舉機制選擇leader。數據的生產存儲和消費讀取都是有leader負責,其他的replicatition只是負責備份而已。

9kafka如何用shell腳本來講一個文件讀寫進去?10kafka如何用JavaAPI實現生產者和消費者?

大數據一站式解決方案:Scala和Spark部分

scala回顧

1、如何定義變數

2、如何定義函數、方法,如何在將函數作為方法的參數傳入進去?

3、條件判斷語句,迴圈控制語句

4、集合操作:Array、list、settuple、map    (註意:可變和不可變的區別)5、樣例類的使用6trit、抽象類的使用7、主構造器和輔助構造器的使用

8scala的高級特性

    高階函數:作為值得函數、匿名函數、閉包、柯里化

    隱式轉換:一個類對象中,如果他沒有摸一個功能,但是我們有想要它實現,可以使用英式轉換的方式。

        object MyPredef{

          //定義隱式轉換方法

          implicit def fileReadToRichFile(file: File)=new RichFile(file)

        }

    使用:

        import MyPredef._9Actor

    寫起來像多線程,用起來像socket10akka

    ActorSystem.actorOf()創建一個Actor,

    創建的同時,就是執行Actor中的prestart方法,去初始化一些信息。

Spark RDD

1SparkRDD叫做:彈性分散式數據集,其實就是一個類,用來描述:任務的數據從哪裡讀取、用那個算進行計算、得到的結果有存放在哪裡、RDD之間的依賴關係是款以來還是窄依賴

2RDD有五個特點

    一系列分區

    每個運算元作用在每個分區上

    一系列依賴關係

    最有位置(如果從HDFS上讀取數據)

3RDD的兩種運算元TransformationAction

    Transformation是懶載入,只是定義了這個運算元的任務,該如何做,但是還沒有做。

    Action是立即執行,當執行到Action時,會觸發DAGSchudle切分stage,切分完成後,有TaskScheduler將任務通過DriverActor發送到executor中執行。

4RDD的幾個複雜的Transformation

->combineByKey(x=>x,(a:List[String],b:String) => a :+ b,

            (m:List[String],n:List[String])=> m ++ n)

   第一個參數表示分組後的第一個值如何處理,

   第二個參數表示後續的值和前一個值如何處理,

   第三個參數表示,map端處理完成後,在reduce端如何對這些list進行處理。

 

->aggregate("初始量,可以是String也可以是int")(第一個func,第二個func)

      初始量作用於沒一個分區,第一個func作用於map端,第二個func作用於reduce端。

 

->reduceByKey(_+_)  作用於map端和reduce端,可以進行局部聚合。

其實reduceByKey和aggregateByKey在底層都調用了combineByKey方法來實現響應的功能。

 

 

->mapPartitions

   對每一個分區進行操作,直接在裡面使用匿名函數即可

   當然如果邏輯非常複雜也是可以考慮在外面先定義好這個函數之後在傳輸進去。

    rdd1.mapPartitions((it:Iterator[String]) => {

    it.toList.map(x => (x,1)).iterator

    })

 

->mapPartitionsWithIndex

  首先定義一個函數,當然也可以寫在裡面作為匿名函數

  val func = (index:Int, it:Iterator[Int]) => {

      it.toList.map(x => ("index:" + index, x)).iterator

  }

  rdd1.mapPartitionsWithIndex(func).collect

5RDD自定義Partitioner

    //自定義分區器,重寫裡面的getPartition方法和numPartitions方法。

    //構造這個對象的時候,就把所有情況的信息傳輸過來,然後在裡面進行分類處理。

    class HostPartition(hostArr:Array[String]) extends Partitioner{

 

      //對所有的數據進行分類,每一種類型對應一個int編號。所以使用map比較合適。

      val map = new mutable.HashMap[String,Int]()

      for(index <- 0 until(hostArr.length)){

        map.put(hostArr(index),index)

      }

 

      //重寫getPartition的方法。

      override def getPartition(key: Any): Int = {

        map.getOrElse(key.toString,0)

      }

 

      override def numPartitions: Int = hostArr.length

    }

 

    應用:

    val hostPartition: HostPartition = new HostPartition(hostList)

 

    val allPartitionRDD: RDD[(String, (String, Int))] = host_url_count.partitionBy(hostPartition)

6、自定義排序規則  ==>定義一個

    case class Gril(yanzhi:Int,nianling:Int) extends Ordered[Gril] with Serializable{

      override def compare(that: Gril): Int = {

        val yanzhiResult: Int = this.yanzhi.compareTo(that.yanzhi)

        if(yanzhiResult == 0){

          return this.nianling.compareTo(that.nianling)

        }

        return yanzhiResult

      }

    }

 

    應用:

     val rdd2: RDD[(String, Int, Int)] = rdd1.sortBy(msg => Gril(msg._2,msg._3))

Spark的SQLContext 1、Spark整合Hive和HDFS 只需要將Hive的hive-site.xml ; hadoop的core-site.xml和hdfs-site.xml拷貝到Spark的conf目錄下即可。Spark就知道如何使用hive的表,同時也知道去哪個NameNode哪裡都數據了。

2DataFrame是什麼?

    是一個分散式數據集,對RDD的封裝。RDD有的方法他基本上都有

3DataFrame如何創建?

    三種方式:->RDD + case class

             ->RDD + structType

             ->sqlContext.read.format.options(Map())

4DataFrame首先需要註冊成表結構之後才可以使用sqlContext來操作。

    dF.registerTempTable("person")

5、使用sqlContext  ==> 返回一個DataFrame

    sqlContext.sql("select * from person")

6DataFrame將數據寫入到HDFS或者mysql中

    val prop = new Properties()

    prop.put("user", "root")

    prop.put("password", "815325")

 

    //如果資料庫中沒有這個表,那麼他也會創建一張表(很強大)

    resultDF.write.mode("append").jdbc("jdbc:mysql://localhost:3306/bigdata","result",prop)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習oracle也有一段時間了,發現oracle中的函數好多,對於做後臺的程式猿來說,大把大把的時間還要學習很多其他的新東西,再把這些函數也都記住是不太現實的,所以總結了一下oracle中的一些常用函數及示例,一是為了和大家分享,二是可以在以後工作中忘記了隨時查閱。廢話不多說,下麵直接上函數。 一. ...
  • 彙總篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 第一次引入文件組的概念:http://www.cnblogs.com/dunitian/p/5276431.html 上次說了其他的解決方案(http://www.cnblogs.com/ ...
  • SQL Server 2008 R2安裝時選擇的是windows身份驗證,未選擇混合身份驗證的解決辦法。 ...
  • 1. 本月的第一天SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2. 本月的最後一天SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 3.上個月的第一天select dat ...
  • --但是索引本質到底是什麼? --百度百科: --索引是為了加速對錶中數據行的檢索而創建的一種分散的存儲結構。索引是針對錶而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。 --在資料庫關係圖中,可以在選定表的“索引/鍵”屬性頁中創建、編輯或刪除 ...
  • 1.前言 上篇 寫出易調試的SQL , 帶來了一些討論, 暴露了不能重用執行計劃和sql註入問題, 十分感謝園友們的建議 . 經過調整後 ,將原來的SQLHelper 抓SQL 用做調試環境用, 發佈環境還是走Dapper的參數化查詢, 保持原有優勢. 見如下代碼. 2. 在開發調試階段 抓最終SQ ...
  • 該視頻意在讓所有學員一次通過考試,避免重覆考試而承擔的巨額考試費用! 目前MongDB發展迅猛,有趕超mysql,和oracle看齊的苗頭。在這個時候MongoDB也適時的推出了官方的認證考試“MongoDB Certified DBA Associate Level”。該證書和OCP一樣,值得擁有 ...
  • 在逝去的2016後半年,由於項目需要支持數據的快速更新和多用戶的高併發負載,我試水SQL Server 2016的In-Memory OLTP,創建記憶體資料庫實現項目的負載需求,現在項目接近尾聲,系統運行穩定,寫一篇博客,記錄一下使用記憶體資料庫的經驗。 SQL Server 2016的In-Memo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...