大資料3.2 -- 實時筆記

項羽齊發表於2018-04-03

  為什麼要使用Hadoop技術?為什麼會誕生Hadoop技術?

    透過現象看本質:所以應用程式集中4個方面:

    分散式、高併發、高可用(網際網路架構技術)、海量資料(lucene+solr/es資料儲存-索引、資料檢索)

 

  海量資料儲存PBEB

    海量資料分析Hadoop離線分析,Spark實時分析,Storm實時分析。

    海量資料展現 eCharts(總結資料)圖表展現

 

  Solres有什麼差異?

    Solr處理海量資料的量大過es

    Es當資料已經很大量時,建立索引的時間還非常快,幾乎和資料量小的時候一樣的速度。Solr當資料量大時,建立索引的速度越來越慢。

    在業務系統中為了支援更大資料量使用solr離線查詢;

    如果在大資料範疇,一般都採用es實時的查詢。

 

  Hadoop安裝

    1) ip地址必須成功,NAT換成橋接,Centos桌面版,圖形方式配置ip

    2) 安裝zkhostname必須按配置檔案走,

    3) 第一臺namenode 耗費資源,儘量多分配記憶體1g/2g,其它放datanode512m

    4) 配置很多的配置檔案

      a) 預設這些配置臨時資訊預設存放在系統的tmp目錄中,當機器萬一重啟時,服務臨時檔案就被刪除了。Format namenode,就沒法正確操作。修改tmp目錄

      b) 

 

 

  Hadoop 節點

    1) Namenode     記錄管理資訊

    2) Datanode

    3) SecondNamenode

    4) resourceManage

     

 

 

    在叢集環境中執行需要reduce過程這時必須啟動ResouceManage服務!!!

    發生假死!

 

    bin/hdfs namenode -format

      明明命令非常正確配置也正確就是不提示成功

      如果不提示成功再執行一次即可注意要把建立的tmp目錄下的內容刪除

 

    開發中

      1) 配置檔案放在windows中編輯,拷貝到linux

      2) 命令最好敲(命令執行錯誤時,第一個就檢查這個引數-號)

 

  啟動Hadoop

      

 

    Apache Flume

      Why? 為什麼需要Flume這項技術?

      Flume日誌收集工具,收集+加工+轉向到其他工具中

      輸入+處理+輸出(大自然搬運工!)

 

    早期日誌

      1) 理都不理,業務比較簡單這時如果出錯,一看就知道是哪個業務錯誤,立即修改,重新部署就可以。就用System.out

      2) 業務模組眾多,業務模組交叉,日誌資訊的量就大了,又很多人訪問,出現高併發問題。大家一起訪問,一起sysout,業務執行被嚴重干擾!

      3) 出現log4j。出現分級FINALERRORDEBUGINFO。根據開發的階段(需求調研、概要設計、詳細設計、開發編碼、測試、部署、上線試執行、正式執行、維護期、專案結束)的不同,來設定不同的日誌展現級別,展現級別以上資訊才被列印,以下級別就不列印。

    順序:FINAL>ERROR >INFO>DEBUG

      開發編碼DEBUG

      測試DEBUG

      部署DEBUG

      上線試執行DEBUG(企業業務人員)

      正式執行DEBUGINFONONEOFF)關閉

      維護期OFF

       

 

    各個模組單獨配置日誌級別

      1) 先配置所有的模組INFO

      2) 可以單獨設定某個模組mybatis列印詳細的日誌

      分模組:按包路徑設定

       

 

    private static Logger log = Logger.getLogger(LogServlet.class);

      在業務中列印日誌

      Log4j最終是把日誌資訊寫入到日誌檔案中tomcat/log/localhost_2018040223894782834.log

      按日滾動,本質磁碟文字檔案。

 

    1) 傳統log4j日誌IO操作文字檔案,檔案量有限,IO操作會有效能瓶頸,在海量資料下,高併發下支撐不了的

    2) 分散式 log4j不是支撐分散式結構,一般單機。日誌散落在很多機器上,這是不方便檢視

    3) 日誌分析PV/UV/VV日誌流量分析;從這些日誌資訊進行規範處理(清洗)

 

    Flume cloudera公司,開源貢獻給Apache

       名詞概念:

        1) Event 事件,fun(json)資料,把資料包裝了一下

        2) Agent 代理:第一資料收集,第二資料傳輸,第三資料輸出(hfdskafka

        3) Source 資料輸入,資料的源頭

        4) Channel 資料傳輸過程中轉,快取,排隊

        5) Sink 資料輸出

      由上面的這些元件就可以產生千變萬化的結構!

        

        

 

 

    特點:

      Agent高度抽象概念,

      Source可以多資料來源(file,dir,hdfs,log4j,mysql

      Channel在每個Agent中只有一個channel

      Sink可以多個輸出(file,hdfs,kafka

 

      Flume.properties屬性配置檔案,配置agent,source,channel,sink

 

          

 

    步驟:

      1) 根據業務配置flume-avro.properties,配置agent,source,sink,channel

      2) 執行flume程式

    ../bin/flume-ng #bin目錄下的flume-ng執行檔案

    agent #配置一個agent

    -c ./ 配置路徑 ./當前路徑

    -f ./flume-avro.properties #flume配置檔案,路徑:在配置檔案所在路徑執行程式

    -n a1 #agent命名,a1,必須和配置檔案中定義agent名稱一致

    -Dflume.root.logger=INFO,console  #配置輸出logger,列印控制檯

 

    ./flume-ng avro-client flume-ng自帶一個客戶端工具,發出tcp請求

    -c ../conf 配置目錄位置

    -H 0.0.0.0 hostnameip地址,域名 localhost

    -p 22222 

    -F ../../log.txt 資料檔案所在位置

 

    這個資訊如果很多,這裡只列印開頭的部分資訊!

 

      支援http請求,啟動tomcat web中介軟體,flume內建jetty。啟動web服務。

      Linux系統自帶命令:

        curl -X POST -d '[{"headers":{"tester":"tony"},"body":"hello http flume"}]' http://0.0.0.0:22222

         

 

      使用者已http請求發起訪問,訪問a1,獲取到資料,進行處理,封裝avroSink輸出,它作為a2它資料來源,獲取到資料,進行處理,封裝avroSink輸出,它作為a3的資料來源,資料處理,最終將結果列印到控制檯上。

 

 

      步驟:

        1、遠端複製

          scp -r flume/ root@hadoop02:/usr/local/src/

        2、給每個節點建立一個flume配置檔案

        3、分別啟動每個節點上的flume,啟動時有沒有順序啊?從後往前來啟動各自flume

           NoClassDefFoundError: org/apache/hadoop/io/SequenceFile$CompressionType

          HDFS處理很多,需要api支撐

     Common.configrationjar

    hdfs://hadoop01:9000/flume/data2/FlumeData.1522657046769.tmp

    flume預設檔名FlumeData

    1522657046769 時間戳

    正在處理時檔名會有tmp字尾,當處理完成就會自動改掉

 

    cd /usr/local/src/hadoop-2.7.1/share/hadoop/common/lib

    cp *.jar /usr/local/src/flume/apache-flume-1.6.0-bin/lib

 

 

  實現日誌系統資訊收集到flume中,步驟:

    1) 日誌專案要整合flume,外掛包

        

    2) 配置log4j屬性配置,配置appender

 

    log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender

    log4j.appender.flume.Hostname = hadoop01

    log4j.appender.flume.Port = 22222

    log4j.appender.flume.UnsafeMode = true

 

    log4jflume整合,log4j打日誌時就會把資料寫入到flume中,並且封裝成avro方式

 

    3) 配置flume-jt.properties屬性檔案

    a) Source格式:avro(約定)

    b) Channel格式:memory

    c) Sink格式:hdfs

 

    4) 執行agent

    5) 執行日誌系統,訪問a.jspjsp中的埋點就訪問日誌系統servlet,列印log4j日誌,lo4j列印日誌,同時輸出內容到flume中,flume寫入hdfs上。

 

SEQ!org.apache.hadoop.io.LongWritable"org.apache.hadoop.io.BytesWritable      R?
/4F?褅       b9?  http://localhost/a.jsp|a.jsp|欏甸潰A|UTF-8|1024x768|24-bit|zh-cn|0|1||0.5267947720016783||Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3343.4 Safari/537.36|95686657276343000667|6107185215_0_1522658447208|0:0:0:0:0:0:0:1

 不是亂碼,因為對中文按GBK編碼。

 

 

  兩個名詞:

    1) 扇入

       

 

   步驟:

    13個配置檔案

    2)分別啟動服務,131,129/130

    3)發起http測試即可

 

 

  2) 扇出

         

 

    一個channel對應一個sink

    步驟:

      1) 三個配置檔案,第一配置檔案要建立2channel,為了兩個sink

      2) 執行flume-ng

 

 

  小結:

    1) Apache Flume 日誌收集工具

    2) 概念

    a) Event flume把資料封裝json格式:[{“header”:xxx},{body:{xxxx}}]

    b) Agent 代理,包括:SourceChannelSink

    c) Source 資料來源avrohttpjdbcspooldir….官網

    d) Channel 中轉快取,佇列

    e) Sink 輸出 avrohdfskafka

    f) 扇入:匯聚

    g) 扇出:拆分

    3) hdfs在操作時複製很多jar

      /usr/local/src/hadoop/hadoop-2.7.1/share/hadoop/common/lib  所有的jar複製過去

      /usr/local/src/hadoop/hadoop-2.7.1/share/hadoop/common   3jar

      /usr/local/src/hadoop/hadoop-2.7.1/share/hadoop/hdfs    目錄 hadoop-hdfs-2.7.1.jar

 

 

相關文章