為什麼要使用Hadoop技術?為什麼會誕生Hadoop技術?
透過現象看本質:所以應用程式集中4個方面:
分散式、高併發、高可用(網際網路架構技術)、海量資料(lucene+solr/es資料儲存-索引、資料檢索)
海量資料儲存PB、EB
海量資料分析Hadoop離線分析,Spark實時分析,Storm實時分析。
海量資料展現 eCharts(總結資料)圖表展現
Solr和es有什麼差異?
Solr處理海量資料的量大過es
Es當資料已經很大量時,建立索引的時間還非常快,幾乎和資料量小的時候一樣的速度。Solr當資料量大時,建立索引的速度越來越慢。
在業務系統中為了支援更大資料量使用solr離線查詢;
如果在大資料範疇,一般都採用es實時的查詢。
Hadoop安裝
1) ip地址必須成功,NAT換成橋接,Centos桌面版,圖形方式配置ip
2) 安裝zk,hostname必須按配置檔案走,
3) 第一臺namenode 耗費資源,儘量多分配記憶體1g/2g,其它放datanode,512m。
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。出現分級FINAL、ERROR、DEBUG、INFO。根據開發的階段(需求調研、概要設計、詳細設計、開發編碼、測試、部署、上線試執行、正式執行、維護期、專案結束)的不同,來設定不同的日誌展現級別,展現級別以上資訊才被列印,以下級別就不列印。
順序:FINAL>ERROR >INFO>DEBUG
開發編碼DEBUG
測試DEBUG、
部署DEBUG、
上線試執行DEBUG(企業業務人員)
正式執行DEBUG,INFO,NONE(OFF)關閉
維護期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 代理:第一資料收集,第二資料傳輸,第三資料輸出(hfds,kafka)
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 hostname,ip地址,域名 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.configration包jar
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
log4j和flume整合,log4j打日誌時就會把資料寫入到flume中,並且封裝成avro方式
3) 配置flume-jt.properties屬性檔案
a) Source格式:avro(約定)
b) Channel格式:memory
c) Sink格式:hdfs
4) 執行agent
5) 執行日誌系統,訪問a.jsp,jsp中的埋點就訪問日誌系統servlet,列印log4j日誌,lo4j列印日誌,同時輸出內容到flume中,flume寫入hdfs上。
SEQ!org.apache.hadoop.io.LongWritable"org.apache.hadoop.io.BytesWritable 媯R?
/兠4F?褅 b厔9? 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) 扇入
步驟:
1)3個配置檔案
2)分別啟動服務,131,129/130
3)發起http測試即可
2) 扇出
一個channel對應一個sink
步驟:
1) 三個配置檔案,第一配置檔案要建立2個channel,為了兩個sink
2) 執行flume-ng
小結:
1) Apache Flume 日誌收集工具
2) 概念
a) Event flume把資料封裝json格式:[{“header”:xxx},{body:{xxxx}}]
b) Agent 代理,包括:Source、Channel、Sink
c) Source 資料來源avro、http、jdbc、spooldir….官網
d) Channel 中轉快取,佇列
e) Sink 輸出 avro、hdfs、kafka
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 3個jar包
/usr/local/src/hadoop/hadoop-2.7.1/share/hadoop/hdfs 目錄 hadoop-hdfs-2.7.1.jar