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"

この記事が気に入ったらサポートをしてみませんか?