1IBM Spark 1
Beyond Shuffling
Apache Spark のスケールアップのためのヒントとコツ
自己紹介
名前は Holden Karau です
女性
IBM のソフトウェア・エンジニア
Alpine、Databricks、Google、Foursquare、および Amazon での勤務経験があります
「Learning Spark & Fast Data processing with Spark」の共著者
来年出版される Spark のパフォーマンスに関する最新の書籍*の共著者
@holdenkarau
Slideshare http://www.slideshare.net/hkarau
Linkedin https://www.linkedin.com/in/holdenkarau
3
3IBM Spark 3
本日のアジェンダ
皆さんについて
RDD の再利用 (キャッシング、永続化レベル、およびチェックポイント機能)
キー・バリュー・データの処理
group キーの使用が危険な理由と対処方法
Spark アキュムレーターに関するベスト・プラクティス*
Spark SQL がすばらしい理由
Spark MLLib のパフォーマンスを高めるための将来の機能強化に関する説明
4
4IBM Spark 4
本日参加されたすばらしい皆さんについて
すばらしい人々
Apache Spark に関する知識がある
Apache Spak のジョブをスケールアップしたい
Lori Erickson
5
5IBM Spark 5
猫の写真は以下から取ったものです。 http://galato901.deviantart.com/art/Cat-on-Work-Break-173043455
Cocoa Dream による写真
6
6IBM Spark 6
RDD の再利用について (標準機能として利用
できるようになりました)
RDD を再利用する予定がある場合は、どうすべきでしょうか?
メモリーにうまく収まる場合は、メモリー上にキャッシングする
別のレベルで永続化する
「MEMORY」、「MEMORY_ONLY_SER」、「MEMORY_AND_DISK」、「
MEMORY_AND_DISK_SER」
チェックポイント機能を使用
ノイズを多く含むデータのクラスター
_2 & checkpointing」が役立つ場合があります
Richard Gillin
7
7IBM Spark 7
キー・バリュー・データに関する考慮ポイント
キーはどのように分散しているのか?
どのような集計機能を使用する必要があるのか?
データを特定の順序で並べる必要があるのか?
他の RDD を結合を行うのか?
どのようなパーティショナーを使用するのか?
eleda 1
8
8IBM Spark 8
キーの不均衡とその問題点
キーが均等に分散していない
郵便番号ごとの売上データや都市ごとのレコードなど
groupByKey によって大量の処理が発生する (簡単に処理が中断する)
非常にアンバランスなパーティションが発生することがある
かなりのキーの不均衡が発生すると、sortByKey であっても障害が発生することがある
遅延ノード (不均衡なシャーディングによって一部のタスクの処理時間が他に比べてずっと長くなる場合がある)
Mitchell
Joyce
9
9IBM Spark 9
groupByKey によって発生する問題
非常に大きな問題を引き起こします
同じキーを持つすべてのレコードを単一のレコードにグループ化
すぐに reduce 演算 (集計処理など) を行った場合でも、上記が発生
データのサイズが大きすぎてメモリーに収まらないため、ジョブで障害が発生する
SQL 環境を使用すればこの問題を解決できる
PROgeckoam
10
10IBM Spark 10
groupByKey を使用した単語数計算のプログラムの再確認
val words = rdd.flatMap(_.split(" "))
val wordPairs = words.map((_, 1))
val grouped = wordPairs.groupByKey()
grouped.mapValues(_.sum)
11
11IBM Spark 11
その後、「通常」版のプログラムを確認
val words = rdd.flatMap(_.split(" "))
val wordPairs = words.map((_, 1))
val wordCounts = wordPairs.reduceByKey(_ + _)
wordCounts
12
12IBM Spark 12
どのような変更を行ったのでしょうか?
reduceByKey
データ型が同じ場合にうまく機能する (この集計を行うプログラムの場合など)
aggregateByKey
データ型が同じである必要がない (統計情報のモデルを計算する場合など)
Spark が reduce 演算を実施し、リストの作成をスキップすることができる
13
13IBM Spark 13
問題を引き起こすのはシャッフルだけでしょうか?
キー順にソートすると、すべてのレコードが同じパーティションに配置される場合がある
パーティション・サイズの制限 (2 GB 程度) の問題が発生することがある
または、パフォーマンスが悪化する
そのため、上記のとおりデータを処理し、キーに無意味な値を追加することが可能
(94110, A, B)
(94110, A, C)
(10003, D, E)
(94110, E, F)
(94110, A, R)
(10003, A, R)
(94110, D, R)
(94110, E, R)
(94110, E, R)
(67843, T, R)
(94110, T, R)
(94110, T, R)
PROTodd
Klassy
14
14IBM Spark 14
Spark のアキュムレーター
障害が発生したレコードをトラッキングするための卓越した方法を提供
ダブルカウントによって、正確な結果が得られなくなる
小さな変更が発生すると、これまでうまく機能して機能がうまく機能しなくなる
特定の条件において、相対ルールで問題を解決できる場合がある*
Found Animals Foundation Follow
15
15IBM Spark 15
アキュムレーターを使用して検証を行う
val (ok, bad) = (sc.accumulator(0), sc.accumulator(0))
val records = input.map{ x => if (isValid(x)) ok +=1 else bad += 1
// Actual parse logic here
}
// An action (e.g. count, save, etc.)
if (bad.value > 0.1* ok.value) {
throw Exception("bad data - do not use results")
// Optional cleanup
}
// Mark as safe
P.S: If you are interested in this check out spark-validator (still early stages).
Found Animals Foundation Follow
16
16IBM Spark 16
Spark SQL によってパフォーマンスが改善するケースとは?
構造化データまたは半構造化データを処理する場合
それほど複雑でない*処理が利用できれば、それでも構わない場合
データのサブセットに対してのみ処理を行う必要がある場合
処理対象の最も高速なデータでさえ読み取りが行われない
この手法については標準の手法であると説明しましたが、一部卓越した手法**が利用できる
ようになりました。
内部機能を活用することで実現
** この卓越した手法を活用すると、スタックのオーバーフローが発生することがあります。すべての状態でこの手法が有効と
は限りません。この手法を試す前には、最寄りの Spark の担当部門までご相談ください。
Matti Mattila
17
17IBM Spark 17
このようなケースで Spark SQL を活用するメリット
スペースを効率的に使用するカラムナー処理とキャッシングによってデータの表示が可能
処理をデータ・ストアにプッシュダウン可能
オプティマイザーが処理の内部を検証することが可能
通常の Spark では、処理の内部を検証することで (min(_, _)) と (append(_, _)) の違いを検出することは
できない
Matti Mattila
18
18IBM Spark 18
レビュー: Spark の機械学習に codegen を組み込む
Spark SQL のコード生成に基づく
最初のドラフトには Quasiquote を使用
Janino に切り替えることで Java でのコンパイルに対応
最初のドラフトは Gradient Boosted Tree を使用
データベースの処理に基づく
最初のドラフトは Quasiquote を使用
スピーディーな処理のために Java を採用
詳細については、SPARK-10387 を参照
Jon
19
19IBM Spark 19
すべての人*にとって reduce 処理は必須であるため、さら
に処理を迅速化するには
reduce と aggregate にはツリー構造のバージョンがある
無償の map サイドの reduce 機能は既に提供済み
しかし、さらに処理を迅速化するこが可能**
** さらに先進的なバージョンを作成することも可能
20
20IBM Spark 20
@Override
public double call(Vector input) throws
Exception {
if (input.apply(1) <= 1.0) {
return 0.1;
} else {
if (input.apply(0) <= 0.5) {
return 0.0;
} else {
return 2.0;
}
}
}
(1, 1.0)
0.1 (0, 0.5)
0.0 2.0
生成されたコードの例 Glenn Simmons
21IBM Spark 21
追加のリソース
プログラミング・ガイド (Java、Python、Scala に関する資料もあります)
http://spark.apache.org/docs/latest/
書籍
ビデオ
次のイベントに参加ください
Spark に関するお問い合わせへの対応
今後のイベントを確認するには、Twitter で私をフォローしてください
https://twitter.com/holdenkarau
このアンケートに回答して、次の日付を選択してください http://bit.ly/spOffice1
raider of gin
22IBM Spark 22
Learning Spark
Fast Data
Processing with
Spark
(内容は多少古い)
Fast Data
Processing with
Spark
(第 2 版)
Advanced
Analytics with
Spark
近日中に発売:
Spark in Action
23IBM Spark 23
Spark のビデオ
Apache Spark の Youtube チャンネル
YouTube 上の Spark のビデオ -
http://bit.ly/holdenSparkVideos
Spark Summit 2014 のトレーニング
Paco の Introduction to Apache Spark
24
24IBM Spark 24
Quinn Dombrowski による猫の写真
ありがとうございました!
Spark のテストを現在実施中です。
以下からぜひアンケートにご協力ください。
http://bit.ly/holdenTestingSpark
最終的な結果は、@holdenkarau からツイートします。

JP version - Beyond Shuffling - Apache Spark のスケールアップのためのヒントとコツ

  • 1.
    1IBM Spark 1 BeyondShuffling Apache Spark のスケールアップのためのヒントとコツ
  • 2.
    自己紹介 名前は Holden Karauです 女性 IBM のソフトウェア・エンジニア Alpine、Databricks、Google、Foursquare、および Amazon での勤務経験があります 「Learning Spark & Fast Data processing with Spark」の共著者 来年出版される Spark のパフォーマンスに関する最新の書籍*の共著者 @holdenkarau Slideshare http://www.slideshare.net/hkarau Linkedin https://www.linkedin.com/in/holdenkarau
  • 3.
    3 3IBM Spark 3 本日のアジェンダ 皆さんについて RDDの再利用 (キャッシング、永続化レベル、およびチェックポイント機能) キー・バリュー・データの処理 group キーの使用が危険な理由と対処方法 Spark アキュムレーターに関するベスト・プラクティス* Spark SQL がすばらしい理由 Spark MLLib のパフォーマンスを高めるための将来の機能強化に関する説明
  • 4.
    4 4IBM Spark 4 本日参加されたすばらしい皆さんについて すばらしい人々 ApacheSpark に関する知識がある Apache Spak のジョブをスケールアップしたい Lori Erickson
  • 5.
    5 5IBM Spark 5 猫の写真は以下から取ったものです。http://galato901.deviantart.com/art/Cat-on-Work-Break-173043455 Cocoa Dream による写真
  • 6.
    6 6IBM Spark 6 RDDの再利用について (標準機能として利用 できるようになりました) RDD を再利用する予定がある場合は、どうすべきでしょうか? メモリーにうまく収まる場合は、メモリー上にキャッシングする 別のレベルで永続化する 「MEMORY」、「MEMORY_ONLY_SER」、「MEMORY_AND_DISK」、「 MEMORY_AND_DISK_SER」 チェックポイント機能を使用 ノイズを多く含むデータのクラスター _2 & checkpointing」が役立つ場合があります Richard Gillin
  • 7.
  • 8.
    8 8IBM Spark 8 キーの不均衡とその問題点 キーが均等に分散していない 郵便番号ごとの売上データや都市ごとのレコードなど groupByKeyによって大量の処理が発生する (簡単に処理が中断する) 非常にアンバランスなパーティションが発生することがある かなりのキーの不均衡が発生すると、sortByKey であっても障害が発生することがある 遅延ノード (不均衡なシャーディングによって一部のタスクの処理時間が他に比べてずっと長くなる場合がある) Mitchell Joyce
  • 9.
    9 9IBM Spark 9 groupByKeyによって発生する問題 非常に大きな問題を引き起こします 同じキーを持つすべてのレコードを単一のレコードにグループ化 すぐに reduce 演算 (集計処理など) を行った場合でも、上記が発生 データのサイズが大きすぎてメモリーに収まらないため、ジョブで障害が発生する SQL 環境を使用すればこの問題を解決できる PROgeckoam
  • 10.
    10 10IBM Spark 10 groupByKeyを使用した単語数計算のプログラムの再確認 val words = rdd.flatMap(_.split(" ")) val wordPairs = words.map((_, 1)) val grouped = wordPairs.groupByKey() grouped.mapValues(_.sum)
  • 11.
    11 11IBM Spark 11 その後、「通常」版のプログラムを確認 valwords = rdd.flatMap(_.split(" ")) val wordPairs = words.map((_, 1)) val wordCounts = wordPairs.reduceByKey(_ + _) wordCounts
  • 12.
    12 12IBM Spark 12 どのような変更を行ったのでしょうか? reduceByKey データ型が同じ場合にうまく機能する(この集計を行うプログラムの場合など) aggregateByKey データ型が同じである必要がない (統計情報のモデルを計算する場合など) Spark が reduce 演算を実施し、リストの作成をスキップすることができる
  • 13.
    13 13IBM Spark 13 問題を引き起こすのはシャッフルだけでしょうか? キー順にソートすると、すべてのレコードが同じパーティションに配置される場合がある パーティション・サイズの制限(2 GB 程度) の問題が発生することがある または、パフォーマンスが悪化する そのため、上記のとおりデータを処理し、キーに無意味な値を追加することが可能 (94110, A, B) (94110, A, C) (10003, D, E) (94110, E, F) (94110, A, R) (10003, A, R) (94110, D, R) (94110, E, R) (94110, E, R) (67843, T, R) (94110, T, R) (94110, T, R) PROTodd Klassy
  • 14.
    14 14IBM Spark 14 Sparkのアキュムレーター 障害が発生したレコードをトラッキングするための卓越した方法を提供 ダブルカウントによって、正確な結果が得られなくなる 小さな変更が発生すると、これまでうまく機能して機能がうまく機能しなくなる 特定の条件において、相対ルールで問題を解決できる場合がある* Found Animals Foundation Follow
  • 15.
    15 15IBM Spark 15 アキュムレーターを使用して検証を行う val(ok, bad) = (sc.accumulator(0), sc.accumulator(0)) val records = input.map{ x => if (isValid(x)) ok +=1 else bad += 1 // Actual parse logic here } // An action (e.g. count, save, etc.) if (bad.value > 0.1* ok.value) { throw Exception("bad data - do not use results") // Optional cleanup } // Mark as safe P.S: If you are interested in this check out spark-validator (still early stages). Found Animals Foundation Follow
  • 16.
    16 16IBM Spark 16 SparkSQL によってパフォーマンスが改善するケースとは? 構造化データまたは半構造化データを処理する場合 それほど複雑でない*処理が利用できれば、それでも構わない場合 データのサブセットに対してのみ処理を行う必要がある場合 処理対象の最も高速なデータでさえ読み取りが行われない この手法については標準の手法であると説明しましたが、一部卓越した手法**が利用できる ようになりました。 内部機能を活用することで実現 ** この卓越した手法を活用すると、スタックのオーバーフローが発生することがあります。すべての状態でこの手法が有効と は限りません。この手法を試す前には、最寄りの Spark の担当部門までご相談ください。 Matti Mattila
  • 17.
    17 17IBM Spark 17 このようなケースでSpark SQL を活用するメリット スペースを効率的に使用するカラムナー処理とキャッシングによってデータの表示が可能 処理をデータ・ストアにプッシュダウン可能 オプティマイザーが処理の内部を検証することが可能 通常の Spark では、処理の内部を検証することで (min(_, _)) と (append(_, _)) の違いを検出することは できない Matti Mattila
  • 18.
    18 18IBM Spark 18 レビュー:Spark の機械学習に codegen を組み込む Spark SQL のコード生成に基づく 最初のドラフトには Quasiquote を使用 Janino に切り替えることで Java でのコンパイルに対応 最初のドラフトは Gradient Boosted Tree を使用 データベースの処理に基づく 最初のドラフトは Quasiquote を使用 スピーディーな処理のために Java を採用 詳細については、SPARK-10387 を参照 Jon
  • 19.
    19 19IBM Spark 19 すべての人*にとってreduce 処理は必須であるため、さら に処理を迅速化するには reduce と aggregate にはツリー構造のバージョンがある 無償の map サイドの reduce 機能は既に提供済み しかし、さらに処理を迅速化するこが可能** ** さらに先進的なバージョンを作成することも可能
  • 20.
    20 20IBM Spark 20 @Override publicdouble call(Vector input) throws Exception { if (input.apply(1) <= 1.0) { return 0.1; } else { if (input.apply(0) <= 0.5) { return 0.0; } else { return 2.0; } } } (1, 1.0) 0.1 (0, 0.5) 0.0 2.0 生成されたコードの例 Glenn Simmons
  • 21.
    21IBM Spark 21 追加のリソース プログラミング・ガイド(Java、Python、Scala に関する資料もあります) http://spark.apache.org/docs/latest/ 書籍 ビデオ 次のイベントに参加ください Spark に関するお問い合わせへの対応 今後のイベントを確認するには、Twitter で私をフォローしてください https://twitter.com/holdenkarau このアンケートに回答して、次の日付を選択してください http://bit.ly/spOffice1 raider of gin
  • 22.
    22IBM Spark 22 LearningSpark Fast Data Processing with Spark (内容は多少古い) Fast Data Processing with Spark (第 2 版) Advanced Analytics with Spark 近日中に発売: Spark in Action
  • 23.
    23IBM Spark 23 Sparkのビデオ Apache Spark の Youtube チャンネル YouTube 上の Spark のビデオ - http://bit.ly/holdenSparkVideos Spark Summit 2014 のトレーニング Paco の Introduction to Apache Spark
  • 24.
    24 24IBM Spark 24 QuinnDombrowski による猫の写真 ありがとうございました! Spark のテストを現在実施中です。 以下からぜひアンケートにご協力ください。 http://bit.ly/holdenTestingSpark 最終的な結果は、@holdenkarau からツイートします。

Editor's Notes

  • #5 https://www.flickr.com/photos/lorika/4148361363/in/photolist-7jzriM-9h3my2-9Qn7iD-bp55TS-7YCJ4G-4pVTXa-7AFKbm-bkBfKJ-9Qn6FH-aniTRF-9LmYvZ-HD6w6-4mBo3t-8sekvz-mgpFzD-5z6BRK-de513-8dVhBu-bBZ22n-4Vi2vS-3g13dh-e7aPKj-b6iHHi-4ThGzv-7NcFNK-aniTU6-Kzqxd-7LPmYs-4ok2qy-dLY9La-Nvhey-Kte6U-74B7Ma-6VfnBK-6VjrY7-58kAY9-7qUeDK-4eoSxM-6Vjs5A-9v5Pvb-26mja-4scwq3-GHzAL-672eVr-nFUomD-4s8u8F-5eiQmQ-bxXXCc-5P9cCT-5GX8no から取った写真
  • #6 https://www.flickr.com/photos/haoli/6349372032/in/photolist-aF5c6A-beRSyF-cnUjBm-dxujoM-cukarf-5osZv-7LrwZb-8hzdGg-dWAXVw-7j8eCn-mU1GDC-du6Njj-9fNeUF-9fNf2c-jeQw2Z-pCQxin-pCPx1S-oYtpxt-pCSwKY-oYtpz2-5nAgBd-4kR3Xg-2CLt3B-mU1HuL-pCPx4h-54W9r-mTYJGa-pVkTdo-2CLrVX-9qkxeT-9s2gwi-9qkx1X-oYqiWL-pCSwD5-2xFigB-72vWUH-dWoBAi-opf1Pw-7jc8Bu-6QfmGS-pVcDuv-4FDmvY-dWufM9-9rFwy5-RAsAG-csnYJu-7QF7sx-83wqki-6faJ2B-7NJT8E
  • #7 https://www.flickr.com/photos/photoverulam/22626301622/in/photolist-AtpHbE-2biJ8i-cbDxLj-5SbTJs-bvJ6pR-4cKd6r-c5io3W-x7fuW-8GEnYV-7ngpwq-7ncv4F-7ncv36-6UPdLM-cS2j3s-6zXf6D-pps5P-6UPdZc-qbhws-egQRmW-61si6q-N864-65o5nN-4D4R6z-wavuvy-zzzrqc-6RG2Wn-zhbLnM-zhbLPP-coidfb-6d9XaA-cfPRY7-coidn7-coidLC-6hDKxj-se5vfT-t8y1tQ-5pRoHx-N854-8UuUYz-msyfx-9DqPba-49vTz-4c4F5-5QL2qk-v7G7z9-w4GYdP-irqiN-6Dc9WZ-2h4pkp-uKaPa から取った写真
  • #8 https://www.flickr.com/photos/eleda/531867386/in/photolist-NZXDm-4H2JU2-chHH61-aDPTFx-5SYV6V-cgjJVm-bmsnCt-bWgJiD-eiwHzX-dQgyhR-3bN33R-eXWaq2-7Cr1HJ-5TxxkF-9prgZh-2Fehf-9xVUGJ-guZfLW-bWgJk2-93HkH6-9prh4Q-9poftp-eL99JM-9prerC-93LqUf-eLkz5L-6gsr2T-4ofma3-4obj4M-bV2a3u-7ygQQr-gS4GzY-GTrX9-7cLyNh-6yFvoe-fv6smP-4GRE5r-5kLaJv-5BE2Eg-4GVR4f-5Qnzri-6N33MP-4XfVC8-56HJVB-s5HTfd-4GVPwW-27SD6T-dGk3Vj-4ofqNC-9e2NoY
  • #9 https://www.flickr.com/photos/hckyso/2055866250/in/photolist-48ERpQ-c3rR-7DyiPo-4wAZRn-hzYJD4-9KvP1D-81rV7R-7F1fnm-dTQkdt-AdUJ-95BJsR-4hy1LG-891ckh-orpiij-7sDjhG-qdro34-s1x8Sm-7X3N8R-9JXXZC-aSJdR-ampKtE-6aTcDC-4P6QUv-9Zry8g-4d54Qi-ZMHEJ-g16RaZ-j95eU-9pp82n-7Efa4Y-apJqbb-6kYmJ8-t4N6G5-DCbLQ-7Smuw8-eir9us-ek6wdx-eiGMj1-5iMBeE-9bh3qr-8MpZPp-9kRy1L-ekLggu-du4gyZ-7bmbow-eir9vo-9kunTs-a2Wru-cQGXy5-DCcaR
  • #10 https://www.flickr.com/photos/geckoam/2956778600/ から取った写真
  • #14 https://www.flickr.com/photos/latitudes/66424863/in/photolist-6SrNg-4FS7h3-n3aG-675Ggf-2mvpnV-4EPRi-agTjTx-3fuHL-7xHxwK-2RnrK-9hNfoi-2RnV1-2RnV3-6y5i2D-4EPSo-rgtUq-6amUo9-2RnV4-dxZEgS-HS6QM-dzGYC-cWsXC5-2RnV6-aDHNC-2RnV2-bqQu1Q-5kwTda-n35c-tvq1-rgu6G-NdcJr-6ahMeZ-oUnQSw-4kPxbs-xGmP-63cN61-6ahKok-rgtZY-zE7Wf-dghvFQ-sQaV1s-aLr6Tn-aWCMd4-whPuJ-jhaCqH-wM72t-Z5TfQ-a8Tqys-Nopr3-gz9b7W/
  • #15 https://www.flickr.com/photos/foundanimalsfoundation/8055190879/in/photolist-dgNXBn-4L53ub-ajWE6R-ovhrAn-buEU2i-6TM1kv-6F62SX-dv1zwm-6JiU12-e3GnSr-877jwm-nkEHyT-5q27Jq-6Yngd4-4xcRaU-4x8Mgn-6g3oAX-8Hcwvh-6bdxVW-4xcUnq-idRQ5-4x93fz-9ix9t5-4x8QSt-4x9dhT-ovW6RV-ou7PoH-aukUjT-dbHTpJ-aPCdta-4xdaNG-4x8ViZ-4xd8kh-4x97ge-4xd1WS-4xduUs-4x8LaV-4x8Nig-4x8JEM-4x8Dxe-4x8U7n-4xdhs1-4xdfi9-4x8Gsg-4x9fL2-4xcSfW-4xcPmq-4x9akx-4x95e2-4x99n8 から取った写真
  • #17 https://www.flickr.com/photos/mattimattila/8190148857/in/photolist-dtJDV4-9tFyUo-9tBqdY-9tymzv-9tBFDf-9tBf1Y-9tyhGp-9tBerj-9tBe4u-9tygGt-9tBc1L-9tB7aJ-9tBeC5-9tzzx6-9tzzq2-9tCw4u-9tzyAv-9tCsHo-9tzvf8-9tyS8X-9tCx5Y-c1JFsu-9tBD8s-9tyt9Z-9tymqa-9tykmD-9tyi3D-9tBPo1-9tyvJt-9tBofj-9tBB9E-9tyBVx-9tBanw-9ty7KM-9ty662-9tCwwY-9tCrVq-4YqUM-9ty2Fv-9tCry1-9tzu72-9tCrbo-9tyReT-c1PhzY-9tyR5r-9tywiK-9tyw9B-9tBt3b-9tBsFs-9tBswf
  • #19 https://www.flickr.com/photos/jb-london/6659711647/in/photolist-b9uLfB-oMFLKY-psumAe-PvmTe-9vatNK-qektu-8g3jSA-349iv-6GtGmj-oK9cEY-991iGG-cPJ8QU-8dxxkB-mF2Hpc-jKLC8r-o6k2UB-eqbByC-6RGY2L-56P4E3-75QJPn-meLnko-athMJ5-dshXvy-9Ddf4h-dWcYXQ-8cxGxH-4EaXuw-nSfe14-eeXM3G-6w6p2X-dz1VFC-cirujw-nRjjjG-nRon7D-BBRxV-b8Y4UZ-4ang32-8N4tS6-aqNUJJ-3daDSd-bdnv4Z-9jJxG8-otHbqV-CsKnA-4rLoBN-pczP4-niPcP4-f9xNuq-fpDcRL-7khdoc
  • #21 https://www.flickr.com/photos/simmogl/4055700308/in/photolist-7bowpo-zvyWaQ-3EhtfM-zM3uwo-zM3Ba3-pG7vSq-oMmzPG-oMpCrt-5uSRnw-4HXxs-bwiGtb-9u29aC-oMmLtY-kop9e-4HXwH-oMoqa7-5zd1U6-9pB2jn-hCMrd5-bGyH6i-4Kj7q-dDaF1-prNtLn-zM3yR5-yRhpTn-yR8sRL-yR8oMd-yRhsqB-gTH7qx-zvz4sW-92waWk-yR8wph-yRhrJB-3EmRpS-7eqcqM-4Kj3p-njURVR-2aHanh-iFykZQ-9x97CL-9NfNL-k9N6fm-5RSaZ-4BxAv5-a51APZ-dqhjnr-dqhqZ9-eb9V7X-3EmR3d-6sCnb7
  • #22 https://www.flickr.com/photos/fairerdingo/2320356657/in/photolist-4x3rcg-AvWp-9apz9a-jJhpoQ-2ov2gu-7Rr2qr-3P2KH-5YFdAJ-gACrN-HTUWP-6j9ooG-dXpN3Q-9kccaV-aFuUfB-8ZN65i-6pQSAv-btZvjV-9ddxwE-4Lq8UH-dXaZ7j-73Xojt-mUZSq-fTy1P-e4n9B-hYwP4-89QrWo-67bSSJ-aThabK-bTctDK-94iUu2-asHJSr-bBnVA8-5MbBJM-g2Vrky-efhYzw-8NxAKw-e3baUF-grvK9-48GJ6n-bAV4eh-btJDEK-4zJtyV-8naFTb-dgJfT-5H88ML-vRFsiA-bHt6pc-7eVJa6-bm2YzR-63sSC5