DockerでOSRM
クラウドでOSRMを動かすにはDockerの方が使いやすい,以前,dockerで準備しようと思ったらメモリが足りなくてだめだった.色々解決方法(dockerでスワップを設定するとか)があるらしいが,ことごとく失敗した.ほとんどの人たちは小規模な例(ベルリンとか関東とか)でやっているだけだし,開発者は250Gのメモリでまわしているので,無頓着なようだ.
考えたらローカルで前処理をして,dockerの立ち上げ時にデータを渡せば良いことに気づいた.この方が,クラウドで長時間計算をしなくて良いので楽だし安い.
最新版のorsm-backgroundをpullしてから,makeしなおす.
今回はちゃんとmapフォルダを作ってそこに地図を入れることにした.
../build/osrm-extract japan-latest.osm.pbf -p ../profiles/car.lua
../build/osrm-partition japan-latest.osrm
../build/osrm-customize japan-latest.osrm
../build/osrm-contract japan-latest.osrm
で前処理データを作り直す(最新版にしないとdockerのバージョンと合わないので).
ORSMのdocker imageはここにあるので,pullする.
前処理はローカルPCでするが,立ち上げはdockerでする.この際,上の前処理ファイルがおいてある場所をカレントディレクトリ ${PWD} と/dataとマップさせてあげることによって,ポート5000から呼び出しが可能になる.
docker run -t -i -p 5000:5000 -v "${PWD}:/data" osrm/osrm-backend osrm-routed /data/japan-latest.osrm
"http://127.0.0.1:5000/route or table /v1/driving/,..."にリクエストを出せば結果を返してくれる.
と思ったらメモリが足りないと立ち上がらないようだ.macの場合は以下のように設定を変える(linux用の -m オプションでは変更されない).
メモリ使用量を確認したら日本全部で10Gだった.クラウドも8Gでは足りないので,最低でも16Gメモリを確保する必要がある.
クラウドで動かしているアプリからOSRMを呼び出すためには,docker-compositeする必要がある.以下のyamlファイルを使う.(フォルダは地図の置いてあるmapの上で docker-compose up する.)
version: "3"
services:
osrm-service:
container_name: osrm-service
image: osrm/osrm-backend
restart: always
ports:
- "5000:5000"
volumes:
- ./map:/data
command: "osrm-routed --max-table-size 10000 /data/japan-latest.osrm"
networks:
tsp_network:
aliases:
- osrm-service
scmopt-pro:
container_name: scmopt-pro
image: scmopt
restart: always
ports:
- "8501:8501"
depends_on:
- osrm-service
networks:
tsp_network:
aliases:
- scmopt
networks:
tsp_network:
driver: bridge
Kubernetesにするには,以下のファイルを準備して,kubectl apply -f 以下のファイル.yamlとすれば良い.
apiVersion: v1
kind: Service
metadata:
name: osrm
labels:
app: osrm
spec:
ports:
- port: 5000
targetPort: 5000
name: http
selector:
app: osrm
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: osrm
spec:
replicas: 1
template:
metadata:
labels:
app: osrm
spec:
containers:
- name: osrm
image: osrm-backend:latest
command: ["/bin/sh", "-c"]
args: ["osrm-routed --algorithm ch /data/japan-latest.osm.pbf"]
ports:
- containerPort: 5000
name: osrm-port
volumeMounts:
- name: osrm
readOnly: true
mountPath: /data
volumes:
- name: osrm
hostPath:
path: /data/osrm/japan
resources:
requests:
memory: "512Mi"
cpu: "0.5"
limits:
memory: "512Mi"
cpu: "0.5"
この記事が気に入ったらサポートをしてみませんか?