mongoDB 데이터 약 1,000만건을 Monstache를 이용하여 Elasticsearch로 옮기기!
1. git clone https://github.com/rwynn/monstache.git
2. cd monstache
3. go install
4. make
* 뭔가 잘 되었는데 마지막에 이런 에러가 났다. 근데 그냥 무시하고 진행해도 되었다!
5. cd build/darwin-amd64
6. monstache -v
=> 만약 zsh: commant not found: monstach 에러가 나온다면
./monstache -v
으로 "./"을 추가해서 해보니 되었다.
7. build/darwin-amd64 위치에서 vi config.toml 환경설정 파일 작성
# connection settings
mongo-url = "mongodb://localhost:27017"
elasticsearch-urls = ["http://localhost:9200"]
direct-read-namespaces = ["[db명].whole_address"]
change-stream-namespaces = ["[db명].whole_address"]
file-namespaces = ["whole_address"]
# namespace-regex = '^tabling\.whole_address_$'
# namespace-exclude-regex = '^mydb\.ignorecollection$'
gzip = true
stats = true
index-stats = true
replay = false
resume-strategy = 1
elasticsearch-max-conns = 4
elasticsearch-max-seconds = 5
elasticsearch-max-bytes = 8000000
dropped-collections = false
dropped-databases = false
resume = true
resume-write-unsafe = true
resume-name = "default"
index-files = false
file-highlighting = false
verbose = true
exit-after-direct-reads = false
index-as-update=true
index-oplog-time=true
[logs]
info = "/Users/build/monstache/build/darwin-amd64/logs/info.log"
warn = "/Users/build/monstache/build/darwin-amd64/logs/warn.log"
error = "/Users/build/monstache/build/darwin-amd64/logs/error.log"
trace = "/Users/build/monstache/build/darwin-amd64/logs/trace.log"
[[mapping]]
namespace = "[db명].whole_address"
index = "whole_address"
* Elasticsearch _id값을 MongoDB inserting data 중 특정 값으로 넣고 싶은 경우 👇👇
https://blckchainetc.tistory.com/417
logs 의 경로는 현재 위치를 입력
* logs 폴더 직접 만들기
mkdir logs
* 아래에 [[mapping]] 중
index = "whole_address"는 elasticsearch index명이다. 설정해주지 않으면 읽어오는 mongoDB의 "db명.collecion명"으로 기본 세팅된다.
https://rwynn.github.io/monstache-site/advanced/?spm=a2c63.p38356.0.0.17358eeeWWVX3d#index-mapping
8. 실행
./monstache -f ./config.toml
-> 약 1074만 건의 데이터가 30분? 정도 걸린 후 elasticsearch에 입력되었다 !! 하지만 2200건이 덜 들어갔다. 왜지 (?)
ERROR===> mongoDB에 NaN value 가 있다면 해당 도큐먼트는 들어가지 않는 것 같다. -> Mongodb에서 NaN의 value를 모두 0으로 바꿔주었다.
ERROR===> 만약 ES 해당 index의 Mappings의 Type = geo_point 인데 "1000"과 같이 존재하지 않는 수가 들어가 있으면 아래와 같은 에러가 난다.
{"_index":"whole_address","_type":"_doc","_id":"6292d00029bc0be4e90d2ca7","status":400,"error":{"type":"mapper_parsing_exception","reason":"failed to parse","caused_by":{"reason":"illegal latitude value [1000.0] for coordinates","type":"illegal_argument_exception"}}}
mongodb UpdateMany()로 longitude, latitude 1000인 경우를 -> 0 으로 바꿔주었다. 좌표값을 구할 수 없는 도큐먼트들에게 임의로 1000을 주었지만 에러가 나서 0으로 바꿨다. 근데 0,0이면 영국 좌표가 되는데 이 도큐먼트가 검색되면 조건을 넣는다던지 나중에 따로 처리를 해야할 것 같다.
* 만약 nori, ngram과 같은 analyzer를 각 필드 특성에 맞춰 사용한다면, 위 명령어 실행 전에 index mappings를 해주어야 한다.
진행되는 동안 방금 만들은 logs 폴더 안에 error, trace, info 들이 생겨서 확인하거나 또는 kibana 연결하여 확인할 수 있다. kibana로 들어가 실시간으로 insert된 도큐먼트를 볼 수 있다.
kibana를 on할 때
"License is not available" 에러가 나왔다.
아래 답변을 참고하여 elasticsearch-setup-passwords 를 auto로 입력해주었는데 이 덕분에 되었는지 아니면 다른 이유인지는 모르겠다.
https://discuss.elastic.co/t/unable-to-access-kibana-with-license-is-not-available/274323/5
9. 백그라운드로 monstache 를 돌려서 mongoDB에 추가생성/업데이트/삭제 등이 생기면 elasticsearch와 동일하게 씽크 맞추도록 만들기
nohup monstache -f ./config.toml 2>&1&
nohup monstache -f /Users/build/monstache/build/darwin-amd64/config.toml 2>&1&
nohup = no hang up 이라고 한다.
아래 명령어를 계속해서 (멈추지 않고) 실행하게 하는 거 같다!
아까 안들어갔던 2200건의 value 중 "NaN" 를 0으로 수정했더니 자동으로 올라갔다. 그런게 시간이 조금 걸렸다. 한 몇 분~ 10분 정도! 천천히 업데이트가 되나보다.
Monstache 백그라운드 끄는 방법
ps -ef | grep monstache
위의 명령어로 돌아가는 monstache의 pid (?) Number 를 찾기
kill [number]
kill하기
Reference : https://kogun82.tistory.com/m/210
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] nori, ngram tokenizer, shingle filter 사용하기 실습 (0) | 2022.05.27 |
---|---|
[Elasticsearch] NGram, edge ngram, shingle에 대해 (0) | 2022.05.27 |
[Elsticsearch] health check & version 버전 확인하기 (0) | 2022.05.24 |
[Elasticsearch] 엘라스틱서치 관련도 score가 결정되는 방법 (0) | 2022.05.23 |
[Elasticsearch] node.js search 검색 사용법 / parameters / options (0) | 2022.04.21 |