elasticSearch的安装与使用
__________________________________________________________________________
上課流程:
? ? ? 學生知識點分享
? ? ?上堂課知識點回顧(采取默寫的形式)
?? ? 上堂課作業(項目)講授?
?? ? ? ? 2018-12-24-【車流量監控項目】\5_作業\①本堂課\12-1_9班項目完成情況.xlsx
?? ? 本堂課新知識點講授
?? ??
__________________________________________________________________________
本堂課新知識點講授:
? ? ElasticSearch: 分布式的搜索和分析引擎
?? ? ? 簡介
?? ? ??
?? ? ? ES安裝
?? ? ??
?? ? ? ES的使用:使用客戶端來操作遠程的es服務器,客戶端有如下三種:
?? ? ? ? ①curl 命令
?? ??? ? ②插件
?? ??? ? ③Java API?
? ? Spark階段知識點回顧
?? ?
?? ?Git服務器的搭建以及使用
?? ? ? GitBlit:B/S結構的git server
?? ? ??
?? ? 車流量監控項目(Spark):?? ? ? ?
?? ? ? Spark Core
?? ? ? Spark SQL
?? ? ? Spark Streaming
?? ? ??
===>主題:ElasticSearch: 分布式的搜索和分析引擎
ElasticSearch是一款基于Apache Lucene構建的開源搜索引擎,它采用Java編寫并使用Lucene構建索引、提供搜索功能,ElasticSearch的目標是讓
? ?全文搜索變得簡單,開發者可以通過它簡單明了的RestFul API輕松地實現搜索功能,而不必去面對Lucene的復雜性。ES能夠輕松的進行大規模的
? ?橫向擴展,以支撐PB級的結構化和非結構化海量數據的處理。
? ?
? ?一言以蔽之:ElasticSearch是一款基于Lucene的實時分布式搜索和分析引擎。
ES與MySQL的對比:
?? ?MySQL?? ??? ??? ??? ??? ? ? ?ElasticSearch
?? ?——————————————————————
?? ?database(數據庫)?? ?index(索引庫)
?? ?table(表) ? ? ? ? ? ? ?? ? ? ?type(類型)
?? ?row(行) ? ? ? ? ? ? ? ? ? ?document(文檔)
?? ?column(列) ? ? ? ? ? ? ?field(字段)
百度指數:
? ? 統計的是不同關鍵字搜索的熱度
?? ?
全文搜索:
?? ? ①倒排索引
?? ? ?例如:檢索出不同單詞在不同文件中出現的總次數
?? ??? ? ? 效果:
?? ??? ??? ?hello a.txt~>3, b.txt~>2,...
?? ??? ??? ?you ? a.txt~>3, b.txt~>1,...
?? ??? ??? ?
?? ? ②正排索引?? ?
?? ??
ELK技術棧:
? E: elasticSearch, 用于存儲索引信息的實時的分布式的搜索和分析引擎。
? L:logstash, 數據采集的框架,類似于:Flume, 將采集到的數據存儲到es中。
? k: kibana, 用于從es中讀取數據,以可視化的圖表呈現出來。
??
??
====>主題: ES的安裝
~~>默認配置單機版:
? 步驟:
? ?將安裝包上傳到Linux下,解壓,在普通用戶下運行elasticSearch/bin/elasticsearch 文件
? ?
? ?注意點:
? ? ?①必須是普通用戶,不能是root用戶
?? ? ②elasticSearch/bin/elasticsearch -d ~>以后臺進程的方式啟動es,通過jps命令,可以察覺到進程名為:Elasticsearch
? ? ?③Linux命令:
?? ? ? ? useradd 新用戶名 ?~>新建用戶
?? ? ? ? passwd 用戶名 ~>設置密碼
?? ? ? ? su -l 用戶名 ?~>用戶切換
?? ? ?④curl: linux命令,可以模擬browser向遠程的服務器發送請求,并獲得反饋。
?? ? ? ?語法:curl -XGET 'http://127.0.0.1:9200'
~~>手動定制單機版
配置config/elasticsearch.yml
cluster.name: bigdata ?~>集群名
node.name: hadoop ? ~>集群中當前es服務器節點名
path.data: /home/mike/data/elastic ? ? ~> es索引庫中的數據最終存儲到哪個目錄下
path.logs: ?/home/mike/logs/elastic ? ?~> es進程啟動后,對應的日志信息存放的目錄
network.host: JANSON01 ? ?~> 當前虛擬機的ip地址的別名
http.cors.enabled: true ? ? ~> 下面兩個配置參數指的是es服務器允許別的插件服務訪問
http.cors.allow-origin: "*"
啟動:(daemon: 精靈進程,后臺進程的方式啟動)
$ELASTICSEARCH_HOME/bin/elasticsearch -d?
注意:
?? ?1,若是進程啟動不了,查看日志文件/home/janson/logs/elastic/bigdata.log,報錯:
?? ?max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536],
?? ?解決方案見:2018-12-20-【ElasticSearch】\1_資料\⑦異常\Ⅰ-es安裝異常.txt
?? ?2,yml,properties:
?? ??? ??? ?同:都是用來操作資源文件的。
?? ??? ??? ?不同點:?
?? ??? ??? ? ?①properties資源文件中,鍵與值之間使用=進行分隔 (等于號)
?? ??? ??? ??? ? ?yml資源文件中,鍵與值之間使用:進行分隔 (半角空格)
?? ??? ??? ? ?②較之于properties資源文件中,yml資源文件書寫起來更加簡潔一些,通過縮進來標識層次關系。
?? ??? ??? ? ? ~>properties:
?? ??? ??? ??? ?db.mysql.url=txxxx
?? ??? ??? ??? ?db.mysql.pwd=txxxx
?? ??? ??? ??? ?
?? ??? ??? ??? ?~>yml: (更加精簡,相同的目錄只需要書寫一次即可)
?? ??? ??? ??? ?db.mysql.url: txxxx ~> 鍵和值之間使用:隔開,且至少必須有一個半角空格
?? ??? ??? ??? ??? ??? ??? ? ?pwd: txxxx ~> 通過縮進用來標識層次關系
====>主題: ES的使用之curl 命令方式
~>curl命令行方式 (curl: Linux的命令,可以模擬browser向遠程的server發送請求,獲得反饋)
?? ?案例1:操作索引庫bigdata下的type之product。
?? ?
?? ??? ?#①創建一個索引庫 (客戶端向遠程es服務器發送請求的方式包括:get,post,put,delete等等)
?? ??? ?curl -XPUT ‘http://JANSON01:9200/bigdata’
?? ??? ?返回值{"acknowledged":true,"shards_acknowledged":true,"index":"bigdata"}
? ? ? ? #②查看索引庫bigdata的信息(元數據信息:描述信息)
?? ??? ?curl -XGET ?'http://JANSON01:9200/bigdata'
?? ??? ?
?? ??? ?#③在索引庫中添加若干索引信息
?? ??? ?curl -H 'Content-Type: application/json' ?-XPOST ?'http://had01:9200/bigdata/product/1?pretty' -d '{"name":"hadoop","author":"Doc Culting","version":"3.0.1" }'
?? ??? ?curl -H 'Content-Type: application/json' ?-XPOST ?'http://had01:9200/bigdata/product/2?pretty' -d '{"name":"hive","author":"劉德華","version":"2.5.1" }'
?? ??? ?curl -H 'Content-Type: application/json' ?-XPOST ?'http://had01:9200/bigdata/product?pretty' -d '{"name":"sqoop","author":"楚留香","version":"1.9.8" }'
?? ??? ?curl -H 'Content-Type: application/json' ?-XPOST ?'http://had01:9200/bigdata/product?pretty' -d '{"name":"flume","author":"lesie","version":"1.5.1" }'
?? ??? ?curl -H 'Content-Type: application/json' ?-XPOST ?'http://had01:9200/bigdata/product?pretty' -d '{"name":"hbase","author":"jack","version":"3.9.8" }'
?? ??? ?
?? ??? ?
?? ??? ?#④查詢索引庫bigdata下面的type之product下所有的數據 (“所用”:指的是第一頁的數據)
?? ??? ?(若是不指定數據量<通過分頁標識來指定>more顯示的是第一頁的10條記錄。通過參數from指定索引的開始下標, size指定當前頁要顯示的記錄條數)
?? ??? ?curl -XGET 'http://JANSON01:9200/bigdata/_search?pretty'
?? ??? ?
?? ??? ?附注:
?? ??? ??? ? from:指定索引的開始下標,從0開始計數。
?? ??? ??? ? size :指定當前頁要顯示的記錄條數,默認是10
?? ??? ??? ??
?? ??? ??? ? 需求:每頁顯示2條記錄,推導出from的規律。
?? ??? ??? ??? ?currentPageNo ? ? ? ?from ? ? ?
?? ??? ??? ??? ?________________________________?
?? ??? ??? ??? ??? ??? ?1 ? ? ? ? ? ? ? ? ? ? ? ? 0
?? ??? ??? ??? ??? ??? ?2 ? ? ? ? ? ? ? ? ? ? ? ? 2
?? ??? ??? ??? ??? ??? ?...
?? ??? ??? ??? ??? ??? ?n ? ? ? ? ? ? ? ? ? ? ? ?(n-1)*size
?? ??? ??? ??? ??? ??? ?
?? ??? ? ?#⑤只查詢索引庫bigdata下面的type之product下_source中的字段name,author (類似于: select name,author from tb_product)
?? ??? ? ? curl -XGET 'http://JANSON01:9200/bigdata/_search?pretty&_source=name,author'
?? ??? ? ? ?? ??? ? ?
?? ??? ? ?#⑥條件查詢:查詢name為hbase的索引信息。 (類似于: select * from tb_product where name='hbase')
?? ??? ? ?curl -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty&q=name:hbase'
?? ??? ? ?
?? ??? ? ? curl -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty&q=name:hbase,flume'
? ?? ??? ? ? ? (類似于: select * from tb_product where name='hbase' or name='flume'
?? ??? ??? ? ? ? ? ? ? ? ? ? ?select * from tb_product where name in ('hbase','flume')
?? ??? ??? ? )
?? ??? ??? ??
?? ??? ? ?#⑦通配符查詢案例:查詢name以h打頭的索引信息。 (類似于: select * from tb_product where name like 'h%')
?? ??? ? ?curl -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty&q=name:h*'
?? ??? ? ?
?? ??? ?#⑧更新:
?? ??? ??? ?# 全局更新 ~> 一般不使用
?? ??? ??? ??? ?#使用post put都可以
?? ??? ??? ??? ?使用post,將索引標識為yEUC32cBcPsnu3_raoHh索引信息更新為:"name":"Flume", "author":"郭富城"
?? ??? ??? ??? ?curl ?-H 'Content-Type: application/json' ?-XPOST 'http://JANSON01:9200/bigdata/product/yEUC32cBcPsnu3_raoHh?pretty' ?-d'{"name":"Flume", "author":"郭富城"}'
?? ??? ??? ??? ?
?? ??? ??? ??? ?curl ?-H 'Content-Type: application/json' ?-XPUT 'http://JANSON01:9200/bigdata/product/yEUC32cBcPsnu3_raoHh?pretty' ?-d'{"name":"Fluming", "author":"Aron"}'
?? ??? ??? ??? ?
?? ??? ??? ??? ?說明:
?? ??? ??? ??? ? ?①但是這些操作都是全局更新,理解為刪除之前的,重新創建一個新的、id相同的document。?? ?
?? ??? ??? ??? ? ?②PUT是冪等方法,POST不是。所以PUT用戶更新,POST用于新增比較合適。
?? ??? ??? ??? ? ?③ES創建索引庫和索引時的注意點
?? ??? ??? ??? ??? ?a)索引庫名稱必須要全部小寫,不能以下劃線開頭,也不能包含逗號
?? ??? ??? ??? ??? ?b)如果沒有明確指定索引數據的ID,那么es會自動生成一個隨機的ID,需要使用POST參數
?? ??? ??? ??? ??? ? ?curl ?-H 'Content-Type: application/json' ?-XPOST http://localhost:9200/bigdata/product/ -d '{"author" : "Doug Cutting"}'
?? ??? ??? ??? ??? ? ?
?? ??? ??? ?# 局部更新 ?~> 使用得最為廣泛
?? ??? ??? ?#要是用_update,同時要更新的是source中的doc內容
?? ??? ??? ?curl ?-H 'Content-Type: application/json' ?-XPOST http://JANSON01:9200/bigdata/product/AWA184kojrSrzszxL-Zs/_update -d'
?? ??? ??? ?{"doc":{"name":"sqoop", "author":"apache"}}'
?? ??? ??? ?
?? ??? ??? ?需求:使用post,將索引標識為yEUC32cBcPsnu3_raoHh索引信息更新為:"author":"張學友","version":"1.2.4"
?? ??? ??? ?curl ?-H 'Content-Type: application/json' ?-XPOST 'http://JANSON01:9200/bigdata/product/yEUC32cBcPsnu3_raoHh/_update?pretty' -d '{"doc":{"author":"張學友","version":"1.2.4"}}' ~>doc:document的縮寫,表示一條記錄
?? ??? ??? ?
?? ??? ??? ?注意:
?? ??? ??? ? _update: 更新的動作(action),在url中,以下劃線開頭的是動作,es內部賦予了特殊的含義。
?? ??? ??? ??
?? ??? ?#⑨批量操作:
?? ??? ??? ?前提:
?? ??? ??? ?①新建名為bank的索引庫
?? ??? ??? ?②將帶處理的數據上傳到linux指定目錄下
?? ??? ??? ?③進行批量導入操作
?? ??? ??? ?curl ?-H "Content-Type: application/json" -XPOST 'http://had01:9200/bank/account/_bulk?pretty' --data-binary @/datas/accounts.json
?? ??? ??? ?說明:
?? ??? ??? ??? ?可以查看一下各個索引庫信息
?? ??? ??? ??? ?curl 'http://had01:9200/_cat/indices?v'
?? ??? ??? ??? ?
?? ??? ??? ??? ?[root@JANSON01 ~]# curl 'http://janson01:9200/_cat/indices?v'
?? ??? ??? ??? ?health status index ? uuid ? ? ? ? ? ? ? ? ? pri rep docs.count docs.deleted store.size pri.store.size
?? ??? ??? ??? ?yellow open ? bigdata Np2VvkyQQeqtNyzOug8cOA ? 5 ? 1 ? ? ? ? ?5 ? ? ? ? ? ?0 ? ? 19.2kb ? ? ? ? 19.2kb
?? ??? ??? ??? ?yellow open ? bank ? ?yrks_XJdSJWJZg0Ibt0GkQ ? 5 ? 1 ? ? ? 1000 ? ? ? ? ? ?0 ? ?482.7kb ? ? ? ?482.7kb
?? ??? ??? ??? ?
?? ??? ?
?? ??? ??? ??? ?ElasticSearch的集群狀態:
?? ??? ??? ??? ??? ?Green:?? ?所有的主分片和副分片都可用
?? ??? ??? ??? ??? ?Yellow:所有的主分片都可用,不是所有的副分片都可用
?? ??? ??? ??? ??? ?Red:?? ?不是所有的主分片和副分片都可用?? ??? ??? ??? ?
?? ??? ??? ??? ?Bulk請求可以在URL中聲明/_index或者/_index/_type
?? ??? ??? ??? ?Bulk一次最大處理多少數據量
?? ??? ??? ??? ?Bulk會把將要處理的數據載入內存中,所以數據量是有限制的
?? ??? ??? ??? ?最佳的數據量不是一個確定的數值,它取決于你的硬件,你的文檔大小以及復雜性,你的索引以及搜索的負載
?? ??? ??? ??? ?一般建議是1000~5000個文檔,如果你的文檔很大,可以適當減少隊列,大小建議是5~15MB,默認不能超過100M,可以在es的配置文件中修改這個值
?? ??? ??? ??? ?http.max_content_length: 100mb
?? ??? ??? ??? ?
?? ??? ??? ?#⑩刪除一個文檔:需求~>刪除一個唯一標識為
?? ??? ? ? ? curl -XDELETE 'http://JANSON01:9200/bigdata/product/yUUC32cBcPsnu3_rbIEE'
?? ??? ??? ? 注意:
?? ??? ??? ? ? a)針對當前記錄,僅僅是添加了一個刪除標記,沒有真正從物理上刪除掉。(是一個邏輯刪除)
?? ??? ??? ? ? b) curl -XPOST 'http://janson01:9200/bigdata/_optimize?only_expunge_deletes=true' ?~> 通過curl命令行方式執行物理刪除
?? ??? ??? ??? ? ? ?TransportClient的實例.admin().indices().prepareOptimize("bigdata").setOnlyExpungeDeletes(true).get(); ? ?~> 通過Java API方式執行物理刪除
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?
====>主題: ES常用插件(bigdesk, head, kibana)
學習插件的目的:
? ? ? ES本身服務相對比較少,其功能的強大之處就體現在插件的豐富性上。有非常多的ES插件用于ES的管理,性能的完善,
下面就給大家介紹幾款常用的插件。
→bigdesk:該工具的Git地址是:https://github.com/lukas-vlcek/bigdesk?? ~> 適用對象:es集群的運維人員。
?? ??? ?①BigDesk主要提供的是節點的實時狀態監控,包括jvm的情況,linux的情況, ? ?elasticsearch的情況,推薦大家使用。
?? ??? ?②里面可以看到集群名稱,節點列表。內存消耗情況,GC回收情況。可以自由的在各個節點之間進行切換,自動的添加或是移除一些舊的節點。
?? ?同樣可以更改refresh inerval刷新間隔,圖標能夠顯示的數據量。
?? ?
?? ??? ?安裝:?? ?
?? ??? ??? ?①解壓下載的bigdesk插件,注意一定不要下載到elasticsearch的plugins目錄下 ,可以與elasticsearch的安裝目錄一致。
?? ??? ??? ?②進入到bigdesk的_site目錄,在Linux命令行啟動:python -m SimpleHTTPServer
?? ??? ??? ? 或者以后臺進程的方式啟動:nohup python -m SimpleHTTPServer > /dev/null 2>&1 & ? ~>以后臺進程的方式啟動bigdesk監控服務(監控es集群的)
?? ??? ??? ?③啟動,訪問(web):http://janson01:8000/#nodes ?~>訪問bigdesk插件,bigdesk插件再去訪問es服務器(用于監控es服務器的狀況)
?? ??? ?
→es head:elasticsearch-head是一個elasticsearch的集群管理工具,它是完全由HTML5編寫的獨立網頁程序,你可以通過插件把它集成到es。 ~> 使用對象:程序員使用
? ? 官方的資料:
?? ? ? https://github.com/mobz/elasticsearch-head#running-with-built-in-server
?? ?安裝步驟:(注意:在root用戶下安裝)
?? ??? ?①nodejs npm grunt安裝 (在安裝html5運行的環境)
?? ??? ??? ?
?? ??? ??? ?sudo yum install epel-release
?? ??? ??? ?sudo yum install nodejs
?? ??? ??? ?node --version
?? ??? ??? ?yum install nodejs
?? ??? ??? ?yum install npm
?? ??? ??? ?npm install -g grunt
?? ??? ??? ?npm install -g grunt-cli
?? ??? ??? ?
?? ??? ??? ?# 下述的命令需要將os的當前目錄設定為head插件的根目錄(正式開始實施)
?? ??? ??? ? ?cnpm install (或是:npm install -g cnpm --registry=https://registry.npm.taobao.org ; 或者是: npm install ?//執行后會生成node_modules文件夾)
?? ??? ? ? 注意:?
?? ??? ??? ? ?★若是在線安裝失敗的話,需要手動下載安裝包手動安裝。
?? ??? ?②修改Gruntfile.js
?? ??? ??? ?在該文件中添加如下,務必注意不要漏了添加“,”號,這邊的hostname:’*’,表示允許所有IP可以訪問,此處也可以修改端口號
?? ??? ??? ?server: {
?? ??? ??? ??? ??? ??? ? options: {
?? ??? ??? ??? ??? ??? ??? ??? ?hostname: '*',
?? ??? ??? ??? ??? ??? ??? ??? ?port: 9100,
?? ??? ??? ??? ??? ??? ??? ??? ?base: '.',
?? ??? ??? ??? ??? ??? ??? ??? ?keepalive: true
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ?③啟動grunt server?
?? ??? ? ? ?或者是以后臺進程的方式啟動:
?? ??? ??? ?nohup grunt server > /dev/null 2>&1 &
?? ??? ??? ?
?? ??? ?④訪問 http://JANSON01:9100?
?? ?第二天:
上堂課知識點回顧:
? ? ?1,給ElasticSearch下一個定義,并闡述其特點,介紹適用場景。
?? ??
?? ? 2,ElasticSearch單機定制版的安裝步驟有哪些,如何驗證安裝成功了?
?? ??
?? ? 3,ElasticSearch常用的插件有哪些?請分別介紹各自的作用。
?? ??
?? ? 4,使用curl來操作es,請舉例說明常用的CRUD操作包含哪些。
?? ??
?? ? 5,Spark中常用的Transformation(轉換)算子和Action(動作)算子有哪些,各個算子的作用何在?
?? ??
—————————————————————————————
上堂課作業點評:
? ?xxx
?
—————————————————————————————
本堂課新知識點講授:
? ? ElasticSearch
?? ? ? 插件的安裝(kibana)
?? ? ??
?? ? ? 使用curl和head插件進行高級查詢
?? ? ??
?? ? ? ES集群的搭建
?? ? ??
?? ? ? ES中涉及到哪些核心概念
?? ? ??
?? ? ? 快速啟動es及其常用的插件
?? ? ??
?? ? ? 使用JavaAPI 操作 ES
?? ? ??
?? ? ? 中文分詞插件的安裝以及使用
?? ? ??
?? ? ? Logstash使用(ruby來開發的)
?? ? ??
===>主題: 插件的安裝(kibana)
?? ?kibana:
?? ??? ?配置:
?? ??? ??? ?server.port: 5601 ?~> 端口號:具有聯網功能的應用程序的唯一標識。 ?
?? ??? ??? ?server.host: "JANSON01"
?? ??? ??? ?elasticsearch.url: "http://JANSON01:9200"
?? ??? ??? ?# elasticsearch.username: "jack"
?? ??? ??? ?# elasticsearch.password: "123"
?? ??? ??? ?
?? ??? ?啟動kibana:
?? ??? ? ? bin/kibana
?? ??? ??? ?
?? ??? ??? ?后臺啟動: kibana]$ nohup bin/kibana >logs/kibana.log 2>&1 &
?? ??? ??? ?
?? ??? ?訪問:
?? ??? ??? ?http://JANSON01:5601
?? ??? ??? ?
?? ??? ?常見的報表工具:
?? ??? ??? ?折線圖
?? ??? ??? ?餅形圖
?? ??? ??? ?柱狀圖
?? ??? ? ? ?...
?? ??? ??? ?
?? ? ?使用:
?? ??? ? ? 使用kibana制作一張餅狀圖,查詢出bank索引庫中的type之account中所有員工在不同薪資范圍內的占比情況。
?? ??? ??? ?步驟:
?? ??? ??? ??? ? ①選中management選項卡,對所要分析的索引庫創建模板pattern?
?? ??? ??? ??? ? ②選中visualize選項卡,選中圖形模板【柱狀圖,餅狀圖,折線圖...】,創建圖表
?? ??? ??? ??? ? ③將結果保存起來?? ??? ? ??
?? ??? ?
? ? ? ?說明:?
?? ??? ??? ?kibana 本質上是elasticsearch web客戶端,是一個分析和可視化elasticsearch平臺,可通過kibana搜索、查看和與存儲在elasticsearch的索引進行交互。
?? ??? ??? ?可以很方便的執行先進的數據分析和可視化多種格式的數據,如圖表、表格、地圖等。
?? ??? ??? ?下載地址:http://www.elastic.co/downloads/kibana,這里下載的版本為kibana-4.5.0-linux-x64.tar.gz,需要特別注意的就是kibana和ES之間的版本匹配問題。
===>主題:使用curl和head插件來進行高級查詢?
~~> # 精準匹配
curl -XGET 'http://JANSON01:9200/bigdata/product/_search' -d '{
? "query": {
? ? "bool": {
? ? ? "must": [
? ? ? ? {
? ? ? ? ? "term": {
? ? ? ? ? ? "name.keyword": "sqoop"
? ? ? ? ? }
? ? ? ? }
? ? ? ],
? ? ? "must_not": [],
? ? ? "should": []
? ? }
? },
? "from": 0,
? "size": 10,
? "sort": [],
? "aggs": {}
}'
在命令行下演示,最好書寫在一行:
curl -H 'Content-Type:application/json' -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty' ? -d '{"query":{"bool":{"must":[{"term":{"name.keyword":"sqoop"}}],"must_not":[],"should":[]}},"from":0,"size":10,"sort":[],"aggs":{}}'
~~> # 多條件查詢
類似的,Elasticsearch也有 and, or, not這樣的組合條件的查詢方式
and <=>must?
or <=>should?
not <=> must_not
curl ?-H 'Content-Type:application/json' -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty' ? -d '{"query":{"bool":{"must":[],"must_not":[],"should":[{"term":{"name.keyword":"sqoop"}},{"term":{"name.keyword":"hive"}}]}},"from":0,"size":10,"sort":[],"aggs":{}}'
~~># 嵌套查詢
需求:查詢工資在2萬~3萬之間,或者是性別為女的員工信息。
?SELECT * FROM account WHERE (balance >=2000 and banlace<=30000) ?OR gender='F';
?? ??
curl ?-H 'Content-Type:application/json' -XGET 'http://JANSON01:9200/bank/account/_search?pretty' ?-d '{"query":{"bool":{"must":[],"must_not":[],"should":[{"range":{"balance":{"gte":"20000","lte":"30000"}}},{"term":{"gender.keyword":"F"}}]}},"from":0,"size":10,"sort":[],"aggs":{}}'
?? ?
====>主題:ES集群的搭建?
?? ?前提:(在另外兩臺節點上名為mike的用戶)?? ?
?? ? ?
?? ? ?①基于單機版,別的節點上安裝的前提事先要準備好:
?? ??? ??? ?三個異常*************改完重新啟動
?? ??? ? max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
?? ? ? ? ?2018-12-25-【ElasticSearchⅡ】\1_資料\⑦異常\Ⅰ-es安裝異常.txt
?? ??? ? ?
?? ? ?②配置janson用戶到另外兩臺節點的免密碼登錄
?? ? ? ? ? ssh-keygen -t rsa
?? ??? ? ? ssh-copy-id -i mike@janson02
?? ? ?
? ? ? ③es集群安裝注意點:(集群中所有節點都需要配置)
?? ??? ?discovery.zen.minimum_master_nodes: 2 ?<~ 防止“腦裂”
?? ??? ?discovery.zen.ping.unicast.hosts: ["JANSON01", "JANSON02", "JANSON03"] ?<~ es集群中有哪些節點
?? ??? ?
?? ?步驟:?
?? ? ?①將JANSON01節點上es目錄拷貝到JANSON02,JANSON03上
?? ??? ?scp -r ~/elasticsearch ?mike@janson03:~/
?? ??? ?mkdir -p /home/mike/data/elastic <~ 新建目錄,不能直接從janson01節點拷貝。 (會自動將節點JANSON01上的數據自動同步到別的節點上)
?? ??? ?mkdir -p /home/mike/logs/elastic
?? ??? ?
?? ? ?②修改es核心配置文件elasticsearch.yml
?? ??? ? node.name: 集群中當前節點的名字
?? ??? ? network.host: ip地址的別名
?? ??? ? 配置文件信息:(cluster、node名字隨機)
?? ??? ? master:
?? ??? ? cluster.name: bigdata
?? ??? ? node.name: master
?? ??? ? path.data: /opt/app/elasticsearch-6.5.3/tmp/data
?? ??? ? path.logs: /opt/app/elasticsearch-6.5.3/tmp/logs
?? ??? ? bootstrap.memory_lock: false
?? ??? ? bootstrap.system_call_filter: false
?? ??? ? network.host: had01
?? ??? ? discovery.zen.ping.unicast.hosts: ["had01", "had02","had03"]
?? ??? ? discovery.zen.minimum_master_nodes: 2?
?? ??? ? http.cors.enabled: true
?? ??? ? http.cors.allow-origin: "*"
?? ??? ??
?? ??? ? node1:
?? ??? ? cluster.name: bigdata
?? ??? ? node.name: node1
?? ??? ? path.data: /opt/app/elasticsearch-6.5.3/tmp/data
?? ??? ? path.logs: /opt/app/elasticsearch-6.5.3/tmp/logs
?? ??? ? bootstrap.memory_lock: false
?? ??? ? bootstrap.system_call_filter: false
?? ??? ? network.host: had02
?? ??? ? discovery.zen.ping.unicast.hosts: ["had01", "had02","had03"]
?? ??? ? discovery.zen.minimum_master_nodes: 2?
?? ??? ? http.cors.enabled: true
?? ??? ? http.cors.allow-origin: "*"
?? ??? ??
?? ? ? ③驗證:(不需要在別的節點上安裝插件,因為插件是獨立于es服務器單獨存在)
?? ??? ? 通過插件進行驗證?
?? ??? ??
?? ??? ?④集群的健康狀況:
?? ??? ?Green:?? ?所有的主分片和副分片都可用
?? ??? ?Yellow:所有的主分片都可以不是所有的副分片都可用
?? ??? ?Red:?? ?不是所有的主分片和副分片都可用
?? ??? ?
?? ??? ?
===>主題:es常見的核心概念
?? ??? ?Cluster
?? ??? ??? ?代表一個集群,集群中有多個節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對于集群內部來說的。ES的一個概念就是去中心化,
?? ??? ??? ?字面上理解就是無中心節點,這是對于集群外部來說的,因為從外部來看ES集群,在邏輯上是個整體,你與任何一個節點的通信和與整個ES集群通信是等價的。
?? ??? ??? ?主節點的職責是負責管理集群狀態,包括管理分片的狀態和副本的狀態,以及節點的發現和刪除。
?? ??? ??? ?只需要在同一個網段之內啟動多個ES節點,就可以自動組成一個集群。
?? ??? ??? ?默認情況下ES會自動發現同一網段內的節點,自動組成集群。
?? ??? ?集群的查看狀態
?? ??? ??? ?如:http://<ip|host>:9200/_cluster/health?pretty
?? ??? ? ??
?? ??? ?shards
?? ??? ??? ?可以在創建索引庫的時候指定
?? ??? ??? ?如:curl -XPUT 'JANSON01:9200/test1/' -d '{"settings":{"number_of_shards":3}}'
?? ??? ??? ?默認是一個索引庫有5個分片 index.number_of_shards:5
?? ??? ?replicas
?? ??? ? ? 代表索引副本,ES可以給索引設置副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高ES的查詢效率,ES
?? ??? ? ?會自動對搜索請求進行負載均衡。可以在創建索引庫的時候指定
?? ??? ? ?如:curl -XPUT 'JANSON01:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'
?? ??? ? ? 默認是一個分片有1個副本 index.number_of_replicas:1
?? ??? ?創建副本為2,分片為3的index
?? ??? ?如:curl -XPOST http://JANSON02:9200/t-s-r -d'{"settings":{"number_of_shards":3,"number_of_replicas": 2}}'
?? ??? ?
?? ??? ?recovery
?? ??? ? ? 代表數據恢復或者叫數據重新分布,ES在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。
?? ??? ? ??
?? ??? ?gateway
?? ??? ? ? 代表ES索引的持久化存儲方式,ES默認是先把索引存放到內存中,當內存滿了時再持久化到硬盤。當這個ES集群關閉在重新啟動是就會從gateway中讀取索引數據。
?? ??? ? ? Es支持多種類型的gateway,有本地文件系統(默認),分布式文件系統,Hadoop的HDFS和amazon的s3云存儲服務。
?? ??? ? ??
?? ??? ?discovery.zen
?? ??? ? ? 代表ES的自動發現節點機制,ES是一個基于p2p的系統,它先通過廣播尋找存在的節點,再通過多播協議來進行節點之間的通信,同時也支持點對點的交互。
?? ??? ??? ?**如果是不同網段的節點如果組成ES集群
?? ??? ??? ?禁用自動發現機制 ??
?? ??? ??? ??? ?discovery.zen.ping.multicast.enabled: false
?? ??? ??? ?設置新節點被啟動時能夠發現的注解列表
?? ??? ??? ??? ?discovery.zen.ping.unicast.hosts: ["master:9200", "slave01:9200"]
?? ??? ??? ??? ?
?? ??? ?Transport?
?? ??? ??? ?代表ES內部節點或集群與客戶端的交互方式,默認內部是使用tcp協議進行交互,同時它支持http協議(json格式)、thrift、servlet、memcached、zeroMQ等傳輸協議
?? ??? ?(通過插件方式集成)。在使用Transport客戶端執行操作的是需要注意一個問題:
?? ??? ?NoNodeAvailableException[None of the configured nodes are available
?? ??? ?這是因為沒有正確指定集群名稱導致的
?? ??? ?Settings settings = Settings.builder().put("cluster.name","bigdata-08-28").build();
?? ??? ?client = TransportClient.builder().settings(settings).build();
?? ??? ?構建json字符串的時候不能使用單引號,不然:
?? ??? ?was expecting either valid name character (for unquoted name) or double-quote (for quoted) to start fi
?? ??? ?
===>主題:快速啟動es及其常用的插件的shell腳本演示(腳本就是將命令寫入到.sh文件中,然后將文件賦予可執行權限就可以)
lsof -i:5601 ~>根據端口號查詢進程
ps -ef |grep SimpleHTTPServer ~>根服務名查詢進程
————
前提:當前用戶是root
# 切換到mike用戶 (在shell腳本中,經驗證,切換用戶失效。)
# su -l mike
# 啟動elasticsearch?
~/es/bin/elasticsearch -d
# 啟動bigDesk插件
cd ~/bigdesk/_site
nohup python -m SimpleHTTPServer >/dev/null 2>&1 &
# 啟動head插件
cd ~/head/node_modules
?nohup grunt server >/dev/null 2>&1 &
# 啟動kibana插件
cd ~/kibana/bin
nohup ./kibana > /dev/null 2>&1 &
# 關閉es (根據grep出的Elasticsearch進程的id,kill掉)` ~>飄號
kill `ps -ef | grep Elasticsearch | grep -v grep | awk '{print $2}'`
===>主題: 使用JavaAPI 操作 ES
前提:?
? 涉及到哪些核心的api:
? TransportClient <~ 封裝了對es服務器的各種操作
??
? 簡單的crud:
?? ? ?TransportClient實例.prepareIndex(索引庫,類型,標識) ?<~ 新增索引
?? ? ?TransportClient實例.prepareDelete(索引庫,類型,標識) ?<~ 刪除索引
?? ? ?TransportClient實例.prepareUpdate(索引庫,類型,標識) ?<~ 更新索引
?? ? ?TransportClient實例.prepareGet(索引庫,類型,標識) ?<~ 查詢單條索引信息
?? ? ?
? 查詢多條索引信息:
? ? ? TransportClient實例.prepareSearch
步驟:?
? 1, 使用idea新建maven工程
? 2,導入maven依賴
? ? ? <!-- ?日志格式定制的maven依賴, 需要和資源目錄resources下的log4j.properties結合在一起使用 -->
? ? ?<dependency>
? ? ? <groupId>org.apache.logging.log4j</groupId>
? ? ? <artifactId>log4j-core</artifactId>
? ? ? <version>2.10.0</version>
? ? </dependency>
??
? ? ?<!-- es客戶端的依賴,其中包含了一個核心的api: TransportClient -->
?? ? <dependency>
?? ??? ? ?<groupId>org.elasticsearch.client</groupId>
?? ??? ? ?<artifactId>transport</artifactId>
?? ??? ? ?<version>${es-version}</version>
?? ??? ?</dependency>
?? ?
?? ?<!-- es服務器對應的核心依賴 -->
? ? <dependency>
? ? ? <groupId>org.elasticsearch</groupId>
? ? ? <artifactId>elasticsearch</artifactId>
? ? ? <version>${es-version}</version>
? ? </dependency>?? ?
? ? <!-- 該依賴中自定義了諸如:@data的注解,作用在實體類之上,用來簡化實體類的書寫,代替:getter/setter訪問器;
?? ?除了導入依賴之外,還需要在idea中進行配置,參考:https://jingyan.baidu.com/article/0a52e3f4e53ca1bf63ed725c.html ?-->
? ? <dependency>
? ? ? <groupId>org.projectlombok</groupId>
? ? ? <artifactId>lombok</artifactId>
? ? ? <version>1.16.20</version>
? ? </dependency>
? ?
? ?<!-- 用來操作json格式數據的maven依賴,阿里巴巴公司貢獻的,阿里編程規約,p3c -->
? ? <dependency>
? ? ? <groupId>com.alibaba</groupId>
? ? ? <artifactId>fastjson</artifactId>
? ? ? <version>1.2.46</version>
? ? </dependency>
? 3, 測試:
??
? 關于test注解,可以有@Before、@Test、@After三個過程,Before進行初始化 Test執行計算 After關閉資源
? ? ①建立Java API客戶端和es服務器的連接
?? ?②使用JavaAPI對es集群進行簡單的crud操作
?? ?③使用JavaAPI對es集群進行 批處理操作
?? ?④使用JavaAPI對es集群進行 ?高級查詢 操作
?? ??? ?es的搜索類型有4種
?? ??? ??? ?query and fetch(速度最快)(返回N倍數據量)
?? ??? ??? ?query then fetch(默認的搜索方式)
?? ??? ??? ?DFS query and fetch ?~>用來給檢索到的每條記錄計算分數
?? ??? ??? ?DFS query then fetch(可以更精確控制搜索打分和排名。)
?? ??? ??? ?DFS解釋:
?? ??? ??? ?總結一下,從性能考慮QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。從搜索的準確度來說,DFS要比非DFS的準確度更高。
?? ??? ??? ?DFS是什么縮寫?
?? ??? ??? ?這個D可能是Distributed,F可能是frequency的縮寫,至于S可能是Scatter的縮寫,整個單詞是分布式詞頻率和文檔頻率散發的縮寫。
?? ?
上堂課知識點回顧:
? ? 1,es常用的插件之kibana作用何在,如何使用?
?? ?
?? ?2,es集群搭建的步驟有哪些,注意點有哪些,如何驗證搭建成功?
?? ?
?? ?3,es涉及到的一些核心概念有哪些,請分別進行闡述。
?? ?
?? ?4,使用Java AI操作es,涉及到哪些核心的類,以及核心的方法?如:簡單的crud操作,高級查詢(分頁,查詢類型,高亮顯示,聚合操作)?
?? ?
?? ?5,Scala語言中,神奇的下劃線“_”,作用有哪些,請舉例說明。
?? ?
————————————————————
上堂課作業講授:
? ?xxx
??
————————————————————
本堂課新知識點講授:
? ? ? ?JavaAPI操作ES
?? ? ??
?? ? ? 插件:Elasticsearch-SQL?
?? ? ? ? 官方提供的
?? ??? ? 第三方(國產)
?? ? ??
?? ? ? 中文分詞(安裝插件:ik, 庖丁解牛等等)
?? ? ??
?? ? ? Logstash(ELK技術棧中的一員,用于數據的采集)
?? ??? ? input
?? ??? ? filter
?? ??? ? output
?? ??? ??
? ? ? ?車流量監控項目(Spark項目,涉及到的知識點:SparkCore, Spark SQL, Spark Streaming等等)
?? ? ??
===>主題: JavaAPI操作ES
案例:檢索索引庫bank中的type之account,根據得分降序排列,若得分相同,然后根據每個賬戶的余額升序排列。
? sql: ?select * from account order by score desc, balance asc;
??
? 涉及到的api:?
? ? ?TransportClient
?? ? 方法: prepareSearch(xxx).
?? ? ? ? ? ? ? ? .addSort(xxx)
?? ??? ??? ??? ? .addSort(xxx)
? ? ? ? ? ? ? ? ?.get()
?? ??? ??? ??? ??
?? ??? ??? ??? ??
===>主題: 插件:Elasticsearch-SQL (上面的是傳統的es的api,用sql語句來操作es也是很好的)
?? ? 官方提供的:https://elasticsearch.cn/article/687?
?? ? ? ?只支持查詢操作
?? ??? ?
?? ? 第三方(國產, https://github.com/NLPchina/elasticsearch-sql)?
?? ? ? ?支持使用sql語句對es進行crud操作
?? ??? ?
? ? RESTful:客戶端和服務器端通信的url書寫的規范。使得url的可讀性更強。(url: 統一資源定位符,如:http://xxx/a.jpg)
?? ??
?? ? 官方介紹:一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用于客戶端和服務器交互類的軟件。
?? ? ? ? ? ? ? ? ? ? ?基于這個風格設計的軟件可以更簡潔,更有層次
?? ?
?? ? Restful風格的url:
?? ? ? ?http://xxx/regist.action/zs/123
?? ??? ?
?? ? 之前的url(沒有使用Restful風格的url):
?? ? ? http://xxx/regist.action?name=zs&pwd=123
?? ? ??
?? ??
~~>第三方的elasticSearch sql插件
? 高版本安裝:(注意:安裝之前,需要停止es) ??
? ? 在線安裝:
? ? ? ./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/6.5.3.0/elasticsearch-sql-6.5.3.0.zip
? ? 離線安裝:
?? ? ?./bin/elasticsearch-plugin install ?file:/xxx/elasticsearch-sql-6.5.3.0.zip
?? ?
? ?下載一個單獨的軟件:es-sql-site-standalone.zip ?~> 連接elasticSearch sql插件, 該插件再連接es集群
?? ??? ?cd site-server
?? ??? ?npm install express --save
?? ??? ?node node-server.js ? ?~> 以前臺進程啟動,占據一個終端。?
?? ??? ?nohup node node-server.js > /dev/null 2>&1 &
?? ?
? ? 測試:
?? ? ?http://janson01:8080 ?
?? ? ?
?? ?使用:?? ?
?? ??? ? 1, 查詢bank中前10條索引信息。(curl方式,browser方式,會報錯)
?? ??? ? ?curl -XGET 'http://janson01:9200/_sql?sql=select * from bank limit 10'
?? ??? ? ?
?? ??? ? 2,使用 es插件之sql的輔助的應用
?? ??? ??? ?http://janson01:8080/
??
? ? ? ? ?3,使用jdbc借助es-sql插件如何訪問es
?? ??? ? ? https://github.com/NLPchina/elasticsearch-sql/pull/283
===>主題:中文分詞(安裝插件:ik, 庖丁解牛等等)
?? ?查詢詞語時,默認每個漢字就是一個詞,不滿足需要。
?? ?如: 我愛你中國
?? ?思路:
?? ?1, 先不安裝任何中文分詞的插件,使用termQuery查詢,看能否查詢到需要的結果
?? ??? ?新建索引庫ok
?? ??? ?##添加數據
?? ??? ?curl -H 'Content-Type:application/json' -XPOST http://had01:9200/ok/news/1 -d'{"content":"美國留給伊拉克的是個爛攤子嗎"}'
?? ??? ?curl -H 'Content-Type:application/json' -XPOST http://had01:9200/ok/news/2 -d'{"content":"公安部:各地校車將享最高路權"}'
?? ??? ?curl -H 'Content-Type:application/json' -XPOST http://had01:9200/ok/news/3 -d'{"content":"中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"}'
?? ??? ?curl -H 'Content-Type:application/json' -XPOST http://had01:9200/ok/news/4 -d'{"content":"中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首"}'?? ?
?? ??? ?
?? ?2, 安裝了中文分詞的插件(如:ik),使用termQuery查詢,看能否查詢到需要的結果?
?? ? 具體步驟:
?? ??? ?①Elasticsearch-6.5.3安裝配置完畢。
?? ??? ?②下載IK-6.5.3
?? ??? ?????源碼下載:https://github.com/medcl/elasticsearch-analysis-ik/releases
?? ??? ?????編譯版本:elasticsearch-analysis-ik-6.3.0.zip
?? ??? ?③解壓到到ES_HOME/plugins/ik目錄下面(直接包含一個conf文件夾和一堆.jar包)
?? ??? ?④重新啟動ES
?? ??? ?⑤啟動 看到try load config ……IK相關信息,說明啟動完成和安裝IK插件完成。
?? ??? ?⑥測試例子:
?? ??? ??? ?~>在Kibana的Dev Tools中,運行
?? ??? ??? ??? ?POST _analyze?? ?
?? ??? ??? ??? ?{
?? ??? ??? ??? ? ?"analyzer":"ik_smart",
?? ??? ??? ??? ? ?"text":"中國人民警察的服務宗旨"
?? ??? ??? ??? ?} ?
?? ??? ??? ??
?? ??? ??? ?
?? ??? ? ? ~>使用head插件來測試?? ??? ?
?? ??? ??? ??? ?http://JANSON01:9200/_analyze
?? ??? ??? ??? ?{
?? ??? ??? ??? ? ?"analyzer":"ik_smart",
?? ??? ??? ??? ? ?"text":"天團S.H.E昨在兩廳院藝文廣場舉辦17萬人露天音樂會,3人獻唱多首經典好歌,讓現場粉絲聽得如癡如醉"
?? ??? ??? ??? ?}
?? ??? ?注意點:
?? ??? ??? ?①針對于es集群中已經存在的歷史索引庫,不會進行重新分詞,分詞插件不起作用。
?? ??? ??? ?②新建索引庫,以及索引庫下的type時,要指定相應的中文分詞插件,才會起作用。
?? ??? ??? ? ? 會根據分詞插件,對新增的索引信息進行分詞,存儲到es集群中。
?? ??? ??? ?③需要將安裝好的ik中文分詞插件拷貝到集群中別的節點上。
?? ??? ??? ?④給es集群安裝插件時,優先安裝中文分詞插件(建議排在第一位!!)。
?? ??? ??? ??
?? ?~~>
?? ??? ?##創建索引庫,并指定相應分詞法
?? ??? ?1.create a index
?? ??? ?curl -XPUT http://janson01:9200/chinese
?? ??? ?2.create a mapping
?? ??? ?curl -XPOST http://had01:9200/chinese/hot/_mapping -H 'Content-Type:application/json' -d'{"properties": {"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"}}}'
?? ??? ?3, 添加數據
?? ??? ?curl ?-H 'Content-Type:application/json' -XPOST http://had01:9200/chinese/hot/1 -d'{"content":"美國留給伊拉克的是個爛攤子嗎"}'
?? ??? ?curl ?-H 'Content-Type:application/json' -XPOST http://had01:9200/chinese/hot/2 -d'{"content":"公安部:各地校車將享最高路權"}'
?? ??? ?curl ?-H 'Content-Type:application/json' -XPOST http://had01:9200/chinese/hot/3 -d'{"content":"中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"}'
?? ??? ?curl ?-H 'Content-Type:application/json' -XPOST http://had01:9200/chinese/hot/4 -d'{"content":"中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首"}'
?? ??? ?4,執行查詢
curl ? -H 'Content-Type:application/json' -XPOST 'http://had01:9200/chinese/hot/_search?pretty' ?-d'{
?? ?"query" : { "match" : { "content" : "自首" }},
?? ?"highlight" : {
?? ??? ?"pre_tags" : ["<font>", "<u>"],
?? ??? ?"post_tags" : ["</font>", "</u>"],
?? ??? ?"fields" : {
?? ??? ??? ?"content" : {}
?? ??? ?}
?? ?}?
}'
?? ??? ?
===>主題:Logstash(ELK技術棧中的一員,用于數據的采集)
~~> 包括三個組件:
?? ? Logstash ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Flume (三個組件組織成agent)
?? ? ___________________________________________________________________________________________________
?? ? input ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?source ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? output ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sink
?? ??
?? ? filter (過濾采集后的數據 ) ? ? ? ?Channel(采集后的數據存儲的媒介,一般是內存memery)
?? ?
~~> Logstash安裝:?? ?
?? ?①下載安裝包
?? ??? ?https://www.elastic.co/guide/en/logstash/current/index.html
?? ??? ?首先下載logstash,上傳到服務器?
?? ??? ?logstash是用JRuby語言開發的,所以要安裝JDK?
?? ??? ?
?? ?②解壓:
?? ? ?tar -zxvf logstash-6.5.3.tar.gz -C 指定的目錄
?? ? ?
?? ?③修改logstash核心的執行文件
?? ??? ?在bin目錄下,有一個可執行的文件logstash,需要添加參數:(可以先不用設置,報錯的話再設置)
?? ??? ?LS_JAVA_OPTS="-server -Xms256m -Xmx512m ?-XX:PermSize=128m -XX:MaxPermSize=256m"
?? ??? ?
?? ?④驗證安裝是否成功:
?? ? ? a) ?bin/logstash -e 'input { stdin {} } output { stdout{} }' ?~>啟動需要等一會兒?
?? ??? ??? ?are you ok?
?? ??? ??? ?{
?? ??? ??? ??? ? ? "message" => "are you ok?",
?? ??? ??? ??? ? ?"@version" => "1",
?? ??? ??? ??? ??? ? ?"host" => "JANSON01",
?? ??? ??? ??? ?"@timestamp" => 2018-12-26T07:08:26.301Z
?? ??? ??? ?}
?? ??? ??? ?哥們,蒙圈否?
?? ??? ??? ?{
?? ??? ??? ??? ? ? "message" => "哥們,蒙圈否?",
?? ??? ??? ??? ? ?"@version" => "1",
?? ??? ??? ??? ??? ? ?"host" => "JANSON01",
?? ??? ??? ??? ?"@timestamp" => 2018-12-26T07:09:04.336Z
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?說明:高版本的logstash,日志輸出的格式(若是stdout),默認格式就是rubydebug。
?? ??? ? ? ? ? ? ? 舊版本的logstash,輸出的格式形如: JANSON01 ?2018-12-26T07:09:04.336Z are you ok
?? ??? ??? ??? ? ??
?? ? ? b)啟動后,通過jps命令,可以查看到名為Logstash的進程名
? ?
~~> Logstash使用演示:
案例1:使用logstash收集控制臺上的錄入,并使用rubydebug日志輸出格式,輸出到控制臺上。
?? ?./logstash -e 'input { stdin {} } output { stdout{codec => rubydebug} }'
案例2:使用logstash收集控制臺上的錄入,將結果輸出到控制臺上;且輸出到Elastisearch索引庫中(es單機版)。
?? ?./logstash -e 'input { stdin {} } output { elasticsearch {hosts => ["had01:9200"]} stdout{} }'
?? ?注意:
?? ? ?①索引庫的名字?默認:logstash-年月日
?? ? ?②默認的type的名字是:type
??
案例3:使用logstash收集控制臺上的錄入,將結果輸出到控制臺上;且輸出到Elastisearch索引庫中
?? ?(es集群版,可以提高logstash輸出數據的健壯性,不容易丟失。相當于:開啟了重試機制)。
?? ?./logstash -e 'input { stdin {} } output { elasticsearch {hosts=>["had02:9200", "had03:9200"]} stdout{} }'
?? ?注意:?
?? ? ?①若是搭建了es集群,向集群中的某臺es服務器寫入數據,也會自動從該服務器同步到別集群中別的es服務器上。
?? ? ?②若是搭建了真實的es集群,建議向集群中多個節點寫入(本質上也是向一臺可用的es服務器中寫入,該es服務器宕機了,才會選擇其他es服務器)。
?? ? ?
案例4:使用logstash收集控制臺上的錄入,將結果輸出到控制臺上;且輸出到kafka消息隊列中。
?? ?./logstash -e 'input { stdin {} } output { kafka { topic_id => "test" bootstrap_servers => "had01:9092,had02:9092,had03:9092"} stdout{codec => rubydebug} }'
?? ?注意:?
?? ? ①若目的地是kafka,需要指定主題名(主題若是存在,直接使用;若不存在,會自動創建)。
?? ??? ? bootstrap_servers參數用于指定kafka集群的配置信息。
?? ??? ??
?? ? ?②開啟kafka集群:
?? ??? ? 前提:開啟zookeeper集群 zkServer.sh start
?? ??? ? kafka-server-start.sh -daemon /opt/kafka/config/server.properties
?? ??? ??
?? ??? ? kafka-console-consumer.sh --bootstrap-server had01:9092 --topic test
?? ??? ??
———————
后續的案例是真實項目中的方式:
?? ? ?
案例5:使用logstash收集指定文件中的數據,將結果輸出到控制臺上;且輸出到kafka消息隊列中。
?? ?核心配置文件:logstash2kafka.properties?
?? ?input {
?? ? ?file {
?? ??? ?path => "/home/mike/data/access_log" ?-- 將path參數對應的值:可以是具體的文件,也可以是目錄
?? ??? ?discover_interval => 5 ? -- ?每間隔5秒鐘從文件中采集一次數據,已經采集過的不是重復采集
?? ??? ?start_position => "beginning" ?-- ?默認是end,以追加的形式在文件中添加新數據,只會采集新增的數據;若指定beginning,每次都從頭開始采集數據。
?? ? ?}
?? ?}
?? ?output {
?? ??? ?kafka {
?? ??? ? ?topic_id => "accesslogs"
?? ??? ? ?codec => plain { ? -- 用于定制輸出的格式,如:對消息格式化,指定字符集等等
?? ??? ??? ?format => "%{message}"
?? ??? ??? ?charset => "UTF-8"
?? ??? ? ?}
?? ??? ? ?bootstrap_servers => "JANSON01:9092,JANSON02:9092,JANSON03:9092"
?? ??? ?}
?? ?}
?? ?注意:
?? ??? ?①在真實項目中,logstash三大組件通過配置文件進行組裝。不是直接通過-e參數書寫在其后。
?? ??? ?./logstash -f ?配置文件名
?? ??? ?以后臺進程的方式啟動:
?? ??? ?nohup ./logstash -f ?配置文件名 > /dev/null 2>&1 &
?? ?
? ? ? ? ?②需要將指定目錄下所有子目錄中的所有文件都采集到(后綴是.log)
?? ??? ? ?path => "/home/mike/data/*/*.log"?
?? ??? ? ?
案例6:真實項目中logstash進行數據對接的過程
步驟:?
?? ?1,使用logstash對指定目錄下的日志信息進行采集,采集到之后,直接輸出到kafka消息多列中。
?? ??? ? 原因:若目錄下的文件是海量的,將數據采集后,直接發送給es的話,es因為承載不了壓力可能會宕機。
?? ??? ??? ??? ??? ?通用的解決方案是:
?? ??? ??? ??? ??? ?先將日志信息采集到kafka消息隊列中,然后,再使用logstash從kafka消息隊列中讀取出消息,發送給es
?? ??? ?
?? ?2, 使用logst?? ?ash從kafka消息隊列中采集數據,發送給es.
? ??
實施:
步驟1:游戲日志目錄中所有子目錄下所有的file使用logstash采集到kafka消息隊列 (dir2kafka.properties)
input {
? file {
? ? codec => plain { charset => "GB2312" }?
? ? path => "/datas/gamelog/*/*.txt"
? ? discover_interval => 5
? ? start_position => "beginning"
? }
}
output {
? ? kafka {
?? ? ?topic_id => "gamelogs"
?? ? ?codec => plain {
? ? ? ? format => "%{message}"
?? ??? ?charset => "GB2312"
? ? ? }
?? ? ?bootstrap_servers => "had01:9092,had02:9092,had03:9092"
? ? }
}
kafka-console-consumer.sh --bootstrap-server had01:9092 --topic gamelogs
./bin/logstash -f config/dir2kafka.properties?
?? ? ? ?
步驟2:使用logstash從kafka消息隊列中采集數據,輸出到es集群中 (kafka2es.properties)
earliest (一般用這個)
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,從頭開始消費?
latest?
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,消費新產生的該分區下的數據?
none?
topic各分區都存在已提交的offset時,從offset后開始消費;只要有一個分區不存在已提交的offset,則拋出異常
__
input {
? kafka {
? ? type => "accesslogs"
? ? codec => "plain"
? ? auto_offset_reset => "earliest"
? ? group_id => "elas1"
? ? topics ?=> "accesslogs" ?-- 舊版本的logstash需要使用參數:topic_id
? ? bootstrap_servers => "JANSON01:9092,JANSON02:9092,JANSON03:9092" -- 舊版本的logstash需要使用參數:zk_connect=>"JANSON01:2181,xx"
? }
? kafka {
? ? type => "gamelogs"
? ? auto_offset_reset => "earliest"
? ? codec => "plain"
? ? group_id => "elas2"
? ? topics => "gamelogs"
? ? bootstrap_servers => "JANSON01:9092,JANSON02:9092,JANSON03:9092"
? }
}
filter {
? if [type] == "accesslogs" {
? ? json {
? ? ? source => "message"
?? ? ?remove_field => [ "message" ]
?? ? ?target => "access"
? ? }
? }
? if [type] == "gamelogs" {
? ? mutate {
? ? ? split => { "message" => "?? ?" }
? ? ? add_field => {
? ? ? ? "event_type" => "%{message[3]}"
? ? ? ? "current_map" => "%{message[4]}"
? ? ? ? "current_X" => "%{message[5]}"
? ? ? ? "current_y" => "%{message[6]}"
? ? ? ? "user" => "%{message[7]}"
? ? ? ? "item" => "%{message[8]}"
? ? ? ? "item_id" => "%{message[9]}"
? ? ? ? "current_time" => "%{message[12]}"
? ? ?}
? ? ?remove_field => [ "message" ]
? ?}
? }
}
output {
? if [type] == "accesslogs" {
? ? elasticsearch {
? ? ? index => "accesslogs"
?? ? ?codec => "json"
? ? ? hosts => ["JANSON01:9200", "JANSON02:9200", "JANSON03:9200"]
? ? }?
? }
? if [type] == "gamelogs" {
? ? elasticsearch {
? ? ? index => "gamelogs"
? ? ? codec => plain {
? ? ? ? charset => "UTF-16BE"
? ? ? }
? ? ? hosts => ["JANSON01:9200", "JANSON02:9200", "JANSON03:9200"]
? ? }?
? }
}
?./bin/logstash -f config/kafka2es.properties?
1?? ?0?? ?0?? ?19?? ?MAYA3?? ?38?? ?37?? ?龍格?? ?FZ-0_F3-0?? ?0?? ?1?? ?#祖瑪弓箭手2?? ?2018-02-02 00:00:04
1?? ?0?? ?0?? ?10?? ?3?? ?323?? ?327?? ?龍格?? ?騎士手鐲?? ?5807419?? ?1?? ?裝備回收?? ?2018-02-02 00:00:37
1?? ?0?? ?0?? ?10?? ?3?? ?323?? ?327?? ?龍格?? ?裁決之杖?? ?6379558?? ?1?? ?裝備回收?? ?2018-02-02 00:00:43
1?? ?0?? ?0?? ?10?? ?3?? ?323?? ?327?? ?龍格?? ?裁決之杖?? ?6184692?? ?1?? ?裝備回收?? ?2018-02-02 00:00:43
1?? ?0?? ?0?? ?10?? ?3?? ?323?? ?327?? ?龍格?? ?泰坦戒指?? ?5807411?? ?1?? ?裝備回收?? ?2018-02-02 00:00:49
1?? ?0?? ?0?? ?19?? ?SWCL?? ?81?? ?47?? ?寂寞哦寂寞?? ?FZ-0_F3-0?? ?0?? ?1?? ?#祖瑪弓箭手2?? ?2018-02-02 00:01:55
1?? ?0?? ?0?? ?19?? ?SLG2?? ?12?? ?69?? ?妹特思棒威?? ?FZ-0_F3-0?? ?0?? ?1?? ?#精英萬年樹妖?? ?2018-02-02 00:03:07
1?? ?0?? ?0?? ?15?? ?SLG2?? ?10?? ?64?? ?精英萬年樹妖?? ?法神頭盔?? ?6249791?? ?0?? ?0?? ?2018-02-02 00:03:19
1?? ?0?? ?0?? ?15?? ?SLG2?? ?10?? ?64?? ?精英萬年樹妖?? ?力量戒指?? ?6249790?? ?0?? ?0?? ?2018-02-02 00:03:19
1?? ?0?? ?0?? ?4?? ?SLG2?? ?10?? ?64?? ?刀鋒刺骨?? ?法神頭盔?? ?6249791?? ?1?? ?0?? ?2018-02-02 00:03:19
1?? ?0?? ?0?? ?4?? ?SLG2?? ?11?? ?64?? ?牛B不是吹出來D?? ?力量戒指?? ?6249790?? ?1?? ?0?? ?2018-02-02 00:03:19
1?? ?0?? ?0?? ?7?? ?SLG2?? ?11?? ?67?? ?刀鋒刺骨?? ?法神頭盔?? ?6249791?? ?1?? ?0?? ?2018-02-02 00:03:25
1?? ?0?? ?0?? ?4?? ?SLG2?? ?11?? ?66?? ?牛B不是吹出來D?? ?法神頭盔?? ?6249791?? ?1?? ?0?? ?2018-02-02 00:03:28
1?? ?0?? ?0?? ?15?? ?SWCL?? ?87?? ?47?? ?祖瑪雕像1?? ?惡魔鈴鐺?? ?7670398?? ?0?? ?0?? ?2018-02-02 00:03:55
1?? ?0?? ?0?? ?4?? ?SWCL?? ?87?? ?47?? ?放火燒山?? ?惡魔鈴鐺?? ?7670398?? ?1?? ?0?? ?2018-02-02 00:04:01
1?? ?0?? ?0?? ?15?? ?SWCL?? ?77?? ?58?? ?雙頭金剛?? ?裁決之杖?? ?7809205?? ?0?? ?0?? ?2018-02-02 00:07:07
1?? ?0?? ?0?? ?4?? ?SWCL?? ?76?? ?58?? ?放火燒山?? ?裁決之杖?? ?7809205?? ?1?? ?0?? ?2018-02-02 00:07:19
1?? ?0?? ?0?? ?15?? ?SLG2?? ?23?? ?81?? ?精英雙頭血魔?? ?法神項鏈?? ?4940?? ?0?? ?0?? ?2018-02-02 00:07:31
1?? ?0?? ?0?? ?15?? ?SLG2?? ?23?? ?81?? ?精英雙頭血魔?? ?天尊手鐲?? ?4939?? ?0?? ?0?? ?2018-02-02 00:07:31
1?? ?0?? ?0?? ?4?? ?SLG2?? ?22?? ?80?? ?刀鋒刺骨?? ?法神項鏈?? ?4940?? ?1?? ?0?? ?2018-02-02 00:07:34
1?? ?0?? ?0?? ?4?? ?SLG2?? ?23?? ?80?? ?刀鋒刺骨?? ?天尊手鐲?? ?4939?? ?1?? ?0?? ?2018-02-02 00:07:37
1?? ?0?? ?0?? ?7?? ?SLG2?? ?24?? ?80?? ?刀鋒刺骨?? ?法神項鏈?? ?4940?? ?1?? ?0?? ?2018-02-02 00:07:43
1?? ?0?? ?0?? ?4?? ?SLG2?? ?23?? ?79?? ?新年哈皮?? ?法神項鏈?? ?4940?? ?1?? ?0?? ?2018-02-02 00:07:52
1?? ?0?? ?0?? ?1?? ?0?? ?305?? ?260?? ?放火燒山?? ?裁決之杖?? ?7809205?? ?1?? ?0(23680)?? ?2018-02-02 00:08:04
1?? ?0?? ?0?? ?15?? ?SLG2?? ?47?? ?74?? ?祖瑪衛士1?? ?三眼手鐲?? ?6942123?? ?0?? ?0?? ?2018-02-02 00:08:49
1?? ?0?? ?0?? ?4?? ?SLG2?? ?46?? ?73?? ?刀鋒刺骨?? ?三眼手鐲?? ?6942123?? ?1?? ?0?? ?2018-02-02 00:08:52
1?? ?0?? ?0?? ?19?? ?SWCL?? ?54?? ?74?? ?寂寞哦寂寞?? ?FZ-0_F3-0?? ?0?? ?1?? ?#祖瑪弓箭手1?? ?2018-02-02 00:09:28
es:
es服務
bin/elasticsearch -d
9200
desk:健康狀況監控
切換_site
nohup python -m SimpleHTTPServer > /dev/null 2>&1 &
8000
head:基礎操作
nohup grunt server > /dev/null 2>&1 &
9100
kibana :圖表展示
nohup bin/kibana >logs/kibana.log 2>&1 &
5601
?
根據端口號查進程:
lsof -i:5601
根據進程的名稱查進程
ps -ef | grep bigdesk
?
啟動esSQL
cd site-server
node node-server.js
?
logstash的啟動:
bin/logstash -e 'input { stdin {} } output { stdout{} }'
?? ?
總結
以上是生活随笔為你收集整理的elasticSearch的安装与使用的全部內容,希望文章能夠幫你解決所遇到的問題。