最近本身練個項目須要將HDFS中的數據檢索出來,並作成對應的報表,從效率上說,直接考慮上Elasticsearch(下文直接用ES代替)node
全文檢索linux
數據庫查詢select * from xxx where xxx like '%xxx' 速度慢,結果不是很準確,而全文檢索能夠快速,準確的找到你想要的數據git
快:先從索引庫中查找github
準:對查詢條件進行分詞,而後對查詢的結果進行相關排序,得分越高,排的越靠前sql
ES簡介
數據庫
是大數據生態系統的後起之秀,有本身的生態系統(ELK E:Elasticserch(全文檢索) L: Logstash(數據採集), K: Kibana(報表)等)Elasticserch 是基於Lucene的分佈式全文檢索系統,能夠認爲是一個分佈式的NoSQL(not only SQL,不只僅有SQL)數據庫,並且支持全文檢索。Lucene是Apache的頂級項目,是一個全文檢索框架,遺憾的是Lucene是個單機版程序,ES底層用就是Lucene,操做API比Lucene方便不少。json
ES集羣搭建 (我用的三臺linux: haoop01,hadoop02,hadoop03)瀏覽器
第一步:ES爲了數據安全,是不容許root身份直接啓動,以root身份啓動會報權限錯誤。
安全
es啓動時須要使用非root用戶,因此我這裏建立一個dog用戶bash
useradd dog複製代碼
爲dog用戶添加密碼:
echo 123456a | passwd --stdin dog複製代碼
用戶權限
1: echo "dog ALL = (root) NOPASSWD:ALL" | tee /etc/sudoers.d/dog
2: chmod 0440 /etc/sudoers.d/dog
複製代碼
建立一個用來存放ES以及數據,日誌的目錄
mkdir /{bigdata,data}複製代碼
給相應的目錄添加用戶和用戶組權限
chown -R dog:dog /{bigdata,data}複製代碼
第二步:安裝和配置,注意這一步最好切換到dog身份來操做,省的後面修改文件權限,記得sudo
解壓
tar -zxvf elasticsearch-6.6.0.tar.gz -C /bigdata/複製代碼
修改配置
vi /bigdata/elasticsearch-6.6.0/config/elasticsearch.yml複製代碼
#集羣名稱,經過組播的方式通訊,經過名稱判斷屬於哪一個集羣
cluster.name: bigdata複製代碼
#節點名稱,要惟一
node.name: hadoop01複製代碼
#數據存放位置
path.data: /data/es/data複製代碼
#日誌存放位置(可選)
path.logs: /data/es/logs複製代碼
#es綁定的ip地址
network.host: 192.168.2.4複製代碼
#初始化時可進行選舉的節點(在這幾臺機器中選舉老大,好比有50臺機器就從這三臺中選舉,選舉的節點數量給3臺就行了)
discovery.zen.ping.unicast.hosts:["hadoop01", "hadoop02", "hadoop03"]複製代碼
第三步:啓動
使用scp拷貝到其餘節點
scp -r elasticsearch-6.6.0/ hadoop02:$PWD
scp -r elasticsearch-6.6.0/ hadoop03:$PWD
複製代碼
在其餘節點上修改es配置,須要修改的有node.name和network.host
啓動ES (三臺都啓動)
/bigdata/elasticsearch-6.6.0/bin/elasticsearch -d複製代碼
注意:啓動可能會報錯(用戶最大可建立文件數過小和最大虛擬內存過小)
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決方法:
#用戶最大可建立文件數過小
sudo vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
複製代碼
#查看可打開文件數量
ulimit -Hn複製代碼
#最大虛擬內存過小
sudo vi /etc/sysctl.conf
vm.max_map_count=262144複製代碼
#查看虛擬內存的大小
sudo sysctl -p
到此位置 集羣安裝就搞定收工,是否是很easy
來,檢查如下看看是否安裝成功,瀏覽器敲 http://192.168.2.4:9200/
{
"name" : "es-1",
"cluster_name" : "bigdata",
"cluster_uuid" : "DoB3Oc1hR_aX0HoTeNedSg",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}複製代碼
看到以上信息說明成功了
#在瀏覽器中查看集羣狀態
http://192.168.2.4:9200/_cluster/health?pretty複製代碼
#在linux終端中查看集羣狀態
curl -XGET 'http://192.168.2.4:9200/_cluster/health?pretty'複製代碼
{
"cluster_name" : "bigdata",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 5,
"active_shards" : 10,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}複製代碼
三個節點正常運行沒毛病
操做他的API,增刪改查搞起來老弟
ES是RESTful接口URL的格式,數據是以json形式存放
http://192.168.2.4:9200/<index>/<type>/[<id>]
其中index、type是必須提供的。
id是可選的,不提供es會自動生成。
index、type將信息進行分層,利於管理。
index能夠理解爲數據庫;type理解爲數據表;id至關於數據庫表中記錄的主鍵,是惟一的。
1: 向home索引(庫)中添加dog(表) (ES6.0+ 增長安全機制 添加請求頭便可正常查詢 -H "Content-Type: application/json" )
[dog@hadoop01 bigdata]$ curl -H "Content-Type: application/json" -XPUT 'http://192.168.2.4:9200/home/dog/1' -d '{ > "title": "Elasticsearch: The dogs home", > "name" : { > "first" : "二", > "last" : "狗" > }, > "publish_date":"2019-02-16", > "price":"1314" > }'複製代碼
2: 在linux中經過curl的方式查詢
curl -XGET 'http://192.168.2.4:9200/home/dog/1'複製代碼
3: 經過瀏覽器查詢
http://192.168.2.4:9200/home/dog/1複製代碼
4: 經過_source獲取指定的字段
curl -XGET 'http://192.168.2.4:9200/home/dog/1?_source=title'curl -XGET 'http://192.168.2.4:9200/home/dog/1?_source=title,price'curl -XGET 'http://192.168.2.4:9200/home/dog/1?_source'複製代碼
5: 能夠經過覆蓋的方式更新
[dog@hadoop01 bigdata]$ curl -H "Content-Type: application/json" -XPUT 'http://192.168.2.4:9200/home/dog/1' -d '{ > "title": "Elasticsearch: The xxxxxx", > "name" : { > "first" : "三", > "last" : "狗" > }, > "publish_date":"2019-02-16", > "price":"1199.99" > }'複製代碼
6:或者經過 _update API的方式單獨更新你想要更新的字段等
curl -H "Content-Type: application/json" -XPOST 'http://192.168.2.4:9200/home/dog/1/_update' -d '{ "doc": { "price" : 111111111 } }'複製代碼
7: 刪除一個文檔
curl -XDELETE 'http://192.168.2.4:9200/home/dog/1'複製代碼
8: filter查詢
# SELECT * FROM dog WHERE price = 35.99
# filtered 查詢價格是35.99的
# 返回的的分是1.0
curl -H "Content-Type: application/json" -XGET 'http://192.168.2.4:9200/home/dog/_search' -d '{ "query": { "bool": { "must": { "match_all": {} }, "filter": { "term": { "price": 35.99 } } } } }'複製代碼
9: bool過濾查詢,能夠作組合過濾查詢
# SELECT * FROM dog WHERE (price = 35.99 OR price = 99.99) AND publish_date != "2019-02-16"
# 相似的,Elasticsearch也有 and, or, not這樣的組合條件的查詢方式
# 格式以下:
# {
# "bool" : {
# "must" : [],
# "should" : [],
# "must_not" : [],
# }
# }
#
# must: 條件必須知足,至關於 and
# should: 條件能夠知足也能夠不知足,至關於 or
# must_not: 條件不須要知足,至關於 not
curl -H "Content-Type: application/json" -XGET 'http://192.168.2.4:9200/home/dog/_search' -d '{ "query" : { "bool" : { "should" : [ { "term" : {"price" : 35.99}}, { "term" : {"price" : 99.99}} ], "must_not" : { "term" : {"publish_date" : "2019-02-16"} } } } }'
複製代碼
10: range範圍過濾
# SELECT * FROM dogWHERE price >= 10 AND price < 99
# gt : > 大於
# lt : < 小於
# gte : >= 大於等於
# lte : <= 小於等於
curl -H "Content-Type: application/json" -XGET 'http://192.168.2.4:9200/home/dog/_search' -d '{ "query": { "range" : { "price" : { "gte" : 10, "lt" : 99 } } } }'
複製代碼
有沒發現這DSL風格寫的要死啊,我靠還要拼接json串,確定寫sql舒服多了啊,下期介紹
歡迎關注個人微信公衆號(玩玩大數據),剛開的,文章會第一時間更新在公衆號上,哈哈