Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)

110 views

Published on

Introduction to a Scalable, High-Performance Distributed Data Processing Platform (WorksApplications)
http://2016.techfesta.jp/

Published in: Data & Analytics
  • Be the first to comment

  • Be the first to like this

高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)

  1. 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 高性能データ処理プラットフォーム Spark と Cassandra に基づくバッチフレムワークのご紹介 劉 雨 HUE システムデザインチーム July 26, 2015 1 / 35
  2. 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 自己紹介   Yu Liu/劉 雨 2004 年 6 月: 大規模分散ジョウブ管理システムの開発に従事 2006 年後半: 日本移住、ソフトウェア開発に従事 2014 年 9 月: 国立情報学研究所にて博士号を取得(最優秀学生賞) 2014 年 9 月: ワークスアプリケーションズ入社 研究内容: 並列プログラミング方法論・アルゴリズム、関数型言語 2 / 35
  3. 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 内容 1 動機と目的 2 並列コンピューティング 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 3 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 3 / 35
  4. 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 内容 1 動機と目的 2 並列コンピューティング 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 3 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 4 / 35
  5. 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 課題 バッチ処理は企業の必要不可欠データー処理方法である 分散システムで、並列処理によって、大量、重いバッチを高速化になる 5 / 35
  6. 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 システム要件 大量データーを読み・書き・計算するバッチの 速度を改善 (Tasklet Performance Improving) 大量バッチを同時に実行する (Tasks Scheduling) システムの高信頼性、高可用性 (Reliability and Availability) 良い Cost Performance を実現する 6 / 35
  7. 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 解決方法 並列計算による、高性能バッチを開発する スケーラビリティを保証する分散システムで、大量バッチを対応する Task-packing アルゴリズムで効率的な実行プランを生成する 動的なクラスタ管理仕組みで、利用率 (Cluster Utilization) を向上 7 / 35
  8. 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 並列性と分割統治法 (Divide&Conquer) Figure: Merge Sort 1 大きな問題を複数の小さな問題 に分割 2 複数の小さな問題を解決するこ とで、最終的に大きな問題を解決 3 複数の小さな問題を並列処理す ることで、処理速度向上 8 / 35
  9. 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Parallelism とパフォーマンスの関係 1 逐次で実行時間がTsであれば 2 理想的に、Pプロセッサーでの実 行時間は Tp = Ts P 9 / 35
  10. 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Parallelism とパフォーマンスの関係 並列化部分の比例はkの場合、並 列の実行時間は Tp = ( k P + 1 − k) × Ts ある意味で、並列プログラムの処 理速度は逐次部分によって決定 9 / 35
  11. 11. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 並列・分散処理は難しい 特に、大規模な分散システムの並列コンピューティングにおいて多くの 課題がある。 計算の依存性あること (dependency) データ競合 (racing) データ局所性 (locality) タスク協調 (coordinating) 障害耐性 (fault tolerance) オーバーヘッド (overhead) ... 10 / 35
  12. 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 11 / 35
  13. 13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 前 MapReduce 時代 MapReduce 1の登場以前大規模コンピュータ・クラスターによる並列プ ログラムの開発・メンテナンスは困難、かつ高コスト 低水準 (Low-level) PThread, MPI, OpenMP, Intel TBBのような 低水準のフレームワークを利用: プログラミングモデルとインターフェースが複雑化 障害耐性サポートの欠如 手間がかかり、熟練した開発者が必要 1MapReduce: Simplified Data Processing on Large Clusters, J. Dean et al., OSDI’04. 11 / 35
  14. 14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Google の MapReduce フレムワーク MapReduce データー処理の流れは純粋な DC ハイレベル API、自動並列実行、障害耐性などを実現  12 / 35
  15. 15. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 研究背景 算法的なスケルトン (Algorithmic skeleton)a Algorithm level building blocks Well typed interface and deterministic behaver Automatic optimization is possible Portable, reusable, fault tolerable aM.Cole, Algorithmic skeletons: structured management of parallel computation, 1991 13 / 35
  16. 16. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング データ並列とタスク並列 Data-Parallelism データ並列は、並列 (parallel or nested) データー構造上に定義する同じ 計算(e.g, 並列ループ、再帰関数)。各プロセッサが同じ計算ロジック で、分配されたデータを処理する。 Task-Parallelism タスクの並列化とは、複数の独立したタスクを同時に実行することで ある。データーの構造には特に関係ない。 14 / 35
  17. 17. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング データ並列スケルトン (Skelton):map と reduce map と reduce は「データ並列スケルトン」である 高階関数 map と reduce   map :: (a → b) → [a] → [b] (1) reduce :: (b → b → b) → [b] → b (2) データ並列スケルトンは決定論的な (Deterministic) データ並列スケルトンは高水準 (High-level)、構造化的な 並列データー構造上に自動並列化できる map と reduce の表現力は高い 15 / 35
  18. 18. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング MapReduce Programming Interface MapReduce のプログラミング・インタフェースの中核部分は2つクラ ス:Map と Reduce である。ユーザーの責任は主に下記の2つメソード を実現すること。 MapReduce の API fmap :: (k1, v1) → [(k2, v2)] (3) freduce :: (k3, [v2]) → (k3, v3) (4) 参考文献 Ralf Lämmel, Google’s MapReduce programming model —Revisited, Science of Computer Programming, Volume 70, Issue 1, 1 January 2008, Pages 1–30. 16 / 35
  19. 19. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 良い Speedup が実現するのポイント 一般的な原則は、できる限り並列性を上げると通信コストを下げる Map フェーズ、Chunk サイズとデーターサイズ とのバランス Reduce フェーズ、Grouping キーの設計 ShuffleSort、大量データーをネットで転送の ケースを回避。出来れば Combiner を使用 17 / 35
  20. 20. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 18 / 35
  21. 21. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Apache Spark:超高速 MapReduce フレームワーク Spark は拡張されたインメモリ計算型 MapReduce2 2Spark GraphX is more powerful than MapReduce 18 / 35
  22. 22. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Apache Spark:超高速 MapReduce フレームワーク オーバーヘッドが低い(インメモリコンピューティング) 拡張プログラミングインターフェース (map と reduce 限りではない) 関数型言語とハイレベルドメイン固有言語 (DSL) 19 / 35
  23. 23. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 20 / 35
  24. 24. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Resilient Distributed Datasets (RDD) インメモリ並列計算のため、RDD という抽象化される分散メモリモデ ルを実現した Reads : Bulk or fine-grained Writes : Bulk transformations Consistency : Trivial (immutable) Work placement : Automatic based on data locality RDD によって、MapReduce と Bulk Synchronous Parallel(BSP)3計算モデル が実現できた 3L.Valiant and B. McColl, Bulk synchronous parallel 20 / 35
  25. 25. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Spark のプログラミングインタフェース Spark のプログラミングインタフェースと Scala Collection API は似てい る 21 / 35
  26. 26. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング Spark のプログラミングインタフェース Spark は MapReduce より豊富な API を提供する map (flatMap), reduce (reduceByKey), filter, join, union ... Broadcast variables and accumulators DSL (SQL and others) BSP model and graph data processing ...   21 / 35
  27. 27. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング MapReduce using RDDs Spark オブジェクト指向のスタイルの MapReduce API を提供する //myMap : T = List[(K_i , V_i )] //myReduce : (K_i , List[V_i ]) = List[R] data.flatMap(myMap) .groupByKey() .map((k, vs) = myReduce(k, vs)) 22 / 35
  28. 28. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング 23 / 35
  29. 29. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列性 (Parallelism) Low-Level 並列プログラミングフレムワークの問題 MapReduce を徹底に理解する Spark の特徴 データ並列スケルトンを使ってプログラミング BSP(GraphX) using RDDs Spark は Vertex Oriented (Pregel-like) API 4 を提供する5 val vertices = // RDD of (ID, State) pairs val messages = // RDD of (ID, Message) pairs val grouped = vertices.cogroup(messages) val newData = grouped.mapValues { (vert, msgs) = userFunc(vert, msgs) }.cache() val newVerts = newData.mapValues((v,ms) = v) val newMsgs = newData.flatMap((id,(v,ms)) = ms) 4Run in BSP Model, as Pregel 5M. Zaharia et al, Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing, 2011 23 / 35
  30. 30. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform システムアーキテクチャ: E-R 図   24 / 35
  31. 31. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 分散データーベースを使う Cassandra によって、高速並列データアクセスが実現できます    Spark(Spark Streaming)と Cassandra を使うことで、効率的なバッ チおよびストリーム処理をシンプルに実装可能 25 / 35
  32. 32. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform トポロジの概要 Spark Cassandra Connectoraを使う 各 Cassandra ノードで、Spark のワーカーを配置 する SparkSQL を使って、Cassandra をクエーリーする Server-side filtering によって、転送データー量を 減らす agithub.com/datastax/spark-cassandra-connector 26 / 35
  33. 33. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform バッチ計算の基本パターンと最適化 基本パターン Select (Extract) Transform Sort Group Aggregate 最適化 基本パターンの簡単組合は低効率的 効率的なアルゴリズムを作るのは難しい SQL のような自動最適化機能があれば最高 27 / 35
  34. 34. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 別スライドを参照 Spark 上の自動最適化フレムワーク Yu Liu, Kento Emoto, Zhenjiang Hu, A Generate-Test-Aggregate Parallel Programming Library for Systematic Parallel Programming, Parallel Computing, Volume 40, Issue 2, February 2014, Pages 116.-135, Elsevier. Kento Emoto, Sebastian Fischer, Zhenjiang Hu Generate, Test, and Aggregate—A Calculation-based Framework for Systematic Parallel Programming with MapReduce 21st European Symposium on Programming (ESOP 2012), Lecture Notes in Computer Science, Vol. 7211, pp. 254-273, Springer Verlag, 2012. 28 / 35
  35. 35. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 結果評価 より短時間で ERP 会計領域でのビジネスロジック処理を実現 Figure: ERP 速度向上のため Spark を利用 (AWS EC2 m3.large x 10) 29 / 35
  36. 36. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform HUE Enterprise Data Processing Platform (EDP2 ) 弊社独自の統合プラットフォーム EDP2 は、以下を独自に管理するため に設計 アプリケーション:バッチ処理、ストリーム、ウェブアプリケーショ ン、CI、スクリプト、... データ処理フレームワーク:Hadoop、Spark、Kafka、... データストア:Cassandra、ElasticSearch、Redis、PostgreSQL、... 30 / 35
  37. 37. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform EDP2 のアークテクチャ 3つのレイヤーを持つ: 機能的なアプリケーショ ンリポジトリ 高速的なコンピューティン グ・エンジン 効率的なリソースマネー ジャ 31 / 35
  38. 38. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 効果図 32 / 35
  39. 39. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 効果図 32 / 35
  40. 40. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform 効果図 32 / 35
  41. 41. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform EDP2 は低レイヤの管理ミドルウェアやクラスタの詳細を隠蔽するの で、以下を可能にする: Easy: 簡単に並列処理開発環境が使える Expendable: 自由に最新技術を採用・拡張 Elastic: 容易に様々なコンピュータクラスタを制御する 33 / 35
  42. 42. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform ハイユーザービリティー + EDP2 = 競争力 性能最適化 応答時間短くなる 処理能力高める 信頼性高める 総保有コストを削減 (TCO) より良いクラスターの利 用率 低維持費 数十倍高速なバッチ処理を実現 リアルタイム応答に近い高速ストリーミ ング処理 システムの障害によるサービス停止が発 生しない 34 / 35
  43. 43. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 動機と目的 並列コンピューティング 統合データー処理プラットフォーム EDP2 並列バッチ処理 事例紹介 Enterprise Data Processing Platform Thanks ご興味がある方はブースまで 弊社他の技術者の発表がある B20, 秋吉真衣:サーバー運用業務を汎用化・共通化し、AWS の各種 サービスや OSS を組み合わせた自動化事例 C50,  浅野航平:High Usability Application での 100 ミリ秒レスポンス を実現するクライアントサイドの開発技術 35 / 35

×