AWSでtilemill
EC2インスタンス作成
とりあえず、タイル作成用のEC2インスタンスを作成
ubuntu12.10でマイクロを指定。(設定完了したら、ハイパフォーマンスに変更予定)
security groupには、22,20008,20009を追加
データ格納EBSの作成
EBSを20G作成して、アタッチする。作成時に/dev/sdfに指定しても/dev/xvdfになるので注意
フォーマット&マウント
sudo mkfs -t ext3 /dev/xvdf sudo mkdir /ebs sudo mount /dev/xvdf /ebs
tilemillのインストール
こちらを参考にubuntuにtilemillをインストール
http://mapbox.com/tilemill/docs/linux-install/
このコマンドを打つだけ。
sudo apt-get install python-software-properties sudo add-apt-repository ppa:developmentseed/mapbox sudo apt-get update sudo apt-get install tilemill
tilemillの設定
こちらを参考に設定
http://mapbox.com/tilemill/docs/guides/ubuntu-service/
tilemillのUIはsshで接続したPCのみからブラウザで起動できるように。
また、タイルサーバーは公開するのでip(ドメイン)で指定。
mapboxファイルを/ebsに移動して/usr/share/mapboxにシンボリックリンクを張る。
tilemill.configを編集
sudo emacs /etc/tilemill/tilemill.config { "files": "/usr/share/mapbox", "server": true, "listenHost":"0.0.0.0", "coreUrl":"localhost:20009", "tileUrl":"54.249.hoge.hoge:20008" } sudo mv /usr/share/mapbox /ebs sudo ln -s /ebs/mapbox /usr/share/mapbox chown -R mapbox:mapbox /usr/share/mapbox/
tilemill サーバーの起動
sudo start tilemill
projectデータの転送
あらかじめ作成しておいたtilemillのprojectファイルを/ebs/mapboxの中に転送しておく
AMIの作成
create AMIでtilemillをセットアップしたAMIを作成する
インスタンスタイプの変更
t3.microから作成したAMIでは、m3.2xlargeなどが指定できなかったので、AWSコンソールから
インスタンスをstopしてからインスタンスタイプを変更。これならm3.2xlargeを指定できる。
elastic ip で再指定して、データを格納したebsをattach
タイルの作成
cd /usr/share/tilemill/ sudo node index.js export vegetation /usr/share/mapbox/export/vegetation.mbtiles --format=mbtiles --bbox=122.9,20.4,154,45.6 --minzoom=1 --maxzoom=15 --metatile=2 --scale=1 --scheme=pyramid --log --files=/usr/share/mapbox/
タイルの確認
sqlite3 vegetation.mbtiles
>.tables
>select count(*) from map;
>10493721
sqlite3 vegetation_gird.mbtiles
> select count(*) from grid_data;
タイル作成にまつわるあれこれ
サイズとスピード比較
m3.2xlarge
utfgridのみ png8:t=0:c=64:z=5 :[1h 31m 28s]:zoom 1-15 : size 2.4G (画像を1色にする) --> できていない部分あったので×
imageのみ png8:t=0:c=64:z=5 :[1h 38m 12s] :zoom=1-15:size 4.5G
utfgrid_image_postgis png8:t=0:c=64:z=5 :[3h 47m 46s] :zoom=11-15:size 7.5G
image zoom=1-15をタイルに展開
4.5G --->おそいので途中でやめ2時間で0.5%ぐらい
全部で10493721タイル
海は103byte 2割
陸は2〜3KB? 8割
合計で7Gぐらいかな。
postgisのインストール
http://trac.osgeo.org/postgis/wiki/UsersWikiPostGIS20Ubuntu1210
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update
sudo apt-get install postgis
sudo -u postgres createdb template_postgis
sudo -u postgres psql -d template_postgis -c "CREATE EXTENSION postgis;"
sudo -u postgres psql -d template_postgis -c "CREATE EXTENSION postgis_topology;"
postgisのチューニング
http://workshops.opengeo.org/postgis-intro-jp/tuning.html
shared_buffersは3GBにしてみる。
sudo emacs /etc/postgresql/9.1/main/postgresql.conf
http://support.mapbox.com/discussions/tilemill/5301-tilemill-running-on-aws-error-message-sigkill
shmmaxが少ないとrestartでエラーになるので。
sudo sysctl -w kernel.shmmax=5368709120
sudo /etc/init.d/postgresql restart
sudo restart tilemill
sudo sysctl -w vm.overcommit_memory=2
gdalのインストール
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update
sudo apt-get install gdal-bin
sqliteからpostgisへ
postGISにvegetationデータベースを作成してsqliteからコピー
sudo -u postgres createdb -T template_postgis vegetation
sudo -u postgres ogr2ogr -f PostgreSQL PG:dbname=vegetation vegetation.sqlite
postgisのユーザー設定&データ確認
sudo passwd postgres
sudo -u postgres psql
>alter user postgres with password 'postgres';
sudo -u postgres psql -l
sudo -u postgres vegetation
> \d vegetation
> select count(ogc_fid) from vegetation;
>3163106 ならOK
tilemillでのpostgis設定
host=localhost user=postgres password=postgres dbname=vegetation
ogc_fid
wkb_geometry
tilestreamのインストール
tilemillのtileサーバーは、画像もutfgridもTMS。tilejsonは未対応。OpenlayersのutfgrridはXYZなので困る。
tilestreamはXYZ配信で、tilejsonもサポートしている。
sudo apt-get install curl build-essential libssl-dev libsqlite3-0 libsqlite3-dev git-core #sudo apt-add-repository ppa:chris-lea/node.js これはいまはだめ。nodejsとnodejs-devがconflict sudo apt-get update sudo apt-get install nodejs nodejs-dev npm git clone git@github.com:mapbox/tilestream.git パーミッションでおこられてできないので https://でとってくる。 cd tilestream npm install sudo ./index.js --host 54.249.233.106 --tilePort=80 --uiPort=80 --tiles=/ebs/mapbox/export
git cloneできるようにするにはこちら。
https://help.github.com/articles/generating-ssh-keys
postgisのチューニング(結局)
postgresの値とkernel.shmmaxをこれに
http://wiki.openstreetmap.org/wiki/Mapnik/PostGIS
tilemillのcursor_sizeは指定しない。
-
-
- >一応エラーなしで、データはできたみたい。
-
まだ、まだshmmax,shmall検討の余地あり。
sudo node index.js export vegetation_postgis /usr/share/mapbox/export/vegetation_postgis1-15.mbtiles --format=mbtiles --bbox=122.9,20.4,154,45.6 --minzoom=1 --maxzoom=15 --metatile=2 --scale=1 --scheme=pyramid --log --files=/usr/share/mapbox/
mb-util
本家のmbutilからforkしたものみたい。高機能。gridの出力には対応していない。
sudo apt-get install python-psycopg2
git clone git://github.com/Alpstein/mbutil.git
cd mbutil
./mb-util -h
sqliteでmbfilesを操作
海を消したい。今回の海(画像が水色1色)はtile_id==-2583691263
※ただし、琵琶湖などの真ん中も消えるので、そこはあとからフォロー。
tilesはviewなので、それを一旦dumpして、変更して戻す。
sqlite3 vegetation.mbtiles
>.output dump.txt
>.dump tiles
>.quit
dump.txtを編集
PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE VIEW tiles AS SELECT map.zoom_level AS zoom_level, map.tile_column AS tile_column, map.tile_row AS tile_row, images.tile_data AS tile_data FROM map JOIN images ON map.tile_id !=-2583691263 AND images.tile_id = map.tile_id; COMMIT;
dump.txtを読み込み
sqlite3 vegetation.mbtiles
>drop view tiles;
>.read dump.txt
おなじくgridデータ
sqlite3 vegetation_grid.mbtiles
>.output dum_grid.txt
>.dump grids
>.quit
dump_grid.txtを編集
map.tile_id >= 0 AND を加える
dump_grid.txtを読み込み
sqlite3 vegetation_grid.mbtiles
>drop view grids;
>.read dump_grid.txt
gridの展開
ebsをxfsフォーマットして、mout
そこに本家mb-utilのタイル出力部分をコメントアウトしてgridだけを出力できるように
jsonpできるように"grid()"が加わって出力されるようになっているので、そこを消す。
※gridディレクトリが存在しているとダメなので消しておく。
>mb-util vegetation_grid.mbtiles /ebs2/grid
ebsからs3へデータ以降
s3fs-cへ直接mb-utilでデータを転送すると、とても遅い上に、途中で切れるのでやめ。
ebsをxfsでフォーマットして(ファイル数の制限がない、動的inode)、s3syncで転送
sudo apt-get install xfsprogs sudo mkfs.xfs /dev/xvdg sudo mkdir /ebs2 sudo mount /dev/xvdg /ebs2 sudo /home/ubuntu/mbutil/mb-util --export --flip-y --progress --min-zoom=1 --max-zoom=15 vegetation.mbtiles /ebs2/ wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz apt-get install ruby1.8 export AWS_ACCESS_KEY_ID='XXXXXXXXXXXXXXXXXXXX' export AWS_SECRET_ACCESS_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXX' export AWS_CALLING_FORMAT="SUBDOMAIN" ruby s3sync.rb -r /ebs2/ vegetation-tiles:
上だとファイルにアクセスできないので×
ここのプログラムを利用
http://dqn.sakusakutto.jp/2011/11/amazon_s3_perl.html
sudo apt-get install libexpat1-dev sudo cpan install YAML <--いらないかも? sudo cpan install XML::Parser sudo cpan Amazon::S3 sudo apt-get install libparallel-forkmanager-perl* perl upload.pl /ebs2 s3://vegetation-tiles/ -p 10
publicにする方法がわからないから× -p 10だとメモリが足りなくなってしまう。microだから
s3cmdのパラレル対応
git clone https://github.com/pcorliss/s3cmd-modification.git ./s3cmd put -P --parallel --workers=10 --recursive /ebs2/ s3://v egetation-tiles
macからだとsshの接続が切れるので、
http://d.hatena.ne.jp/oxon/20120310/1331386468
s3-parallel-put
結局、並列処理できてタイルをs3に高速に転送するのには以下を利用
https://github.com/twpayne/s3-parallel-put
mbutilで展開した場所/ebs2に移動して
/home/ubuntu/s3-parallel-put/s3-parallel-put --bucket=ecoris --grant=public-read --processes=5 . --prefix="vegetation" --content-type="guess" --log-filename=/home/ubuntu/log.txt
s3のCORS設定
http://memocra.blogspot.jp/2012/09/s3cors.html
gridsはCORSに引っかかるのでCORS configurationを設定。
制限したければ、AllowOriginにドメインを設定
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>
client zoom で レベル16〜を表示
AWS
料金レポートの見方
https://forums.aws.amazon.com/thread.jspa?threadID=26865
料金通知
http://aws.typepad.com/aws_japan/2012/05/monitor-estimated-charges-using-billing-alerts.html
http://aws.typepad.com/aws_japan/2012/06/new-programmatic-access-to-aws-billing-data.html
利用者支払い
http://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html