Microsoft Azure 全体価値訴求資料 v3.0

[更新 2018.08.02] 以前掲載していた内容 (1~5章) の一部に、最新の情報ではなく、正確性に欠ける部分がありましたので、公開は、Azure サービス内容の説明に限定致しました。

こんにちは、ドクです。
Microsoft Azure 全体価値訴求資料というのを4年くらい前から作っております。

最新バージョン v3.0 についても、一人でコツコツと作成してきましたが、かなり出来上がってきましたので、公開したいと思います。

月に1度くらいは、資料の Update をしておりますので、陳腐化しないのがウリです(笑)… と言っても、メイン業務が他にありますので、限界はあります…ご容赦ください。

Microsoft Azure 全体価値訴求資料 v3.0  –  6章 カテゴリー別のサービス説明
6章の01 Compute
6章の02 Networking
6章の03 Storage
6章の04 Web & Mobile
6章の05 Containers
6章の06 Databases
6章の07 Analytics
6章の08 AI & Machine Learning
6章の09 Internet of Things

Spark on HDInsight を使ってみる (5) – JDBC を利用した SQL Database / SQL Data Warehouse へのアクセス

Spark 1.6 (HDInsight 3.5) では、″/usr/hdp/2.5.4.0-121/hive/lib″ ディレクトリ以下に、SQL Server 用の JDBC Driver (sqljdbc41.jar) がインストール済みの為、IaaS の SQL Server、Azure SQL Database、Azure SQL Data Warehouse に対して、JDBC 接続文字列だけですぐにアクセスが可能です。

Azure SQL Database からの読み取り


事前に、SQL Server Management Studio などを利用して、Azure SQL Database に以下のテーブルとデータを作成しておいてください。SQL Server や SQL Database に馴染みのない方は、リテラル値の前の「N」が気になるかと思いますが、これは UNICODE のリテラル値であることを表します。


CREATE TABLE [test].[T1](
[mykey] [nvarchar](100) PRIMARY KEY CLUSTERED NOT NULL,
[myvalue] [nvarchar](1000) NULL
) WITH (DATA_COMPRESSION=PAGE)
GO

INSERT INTO [test].[T1] (mykey,myvalue) VALUES (N'1',N'パイナップル'),(N'2',N'アップル'),(N'3',N'ペン')
GO


次に、Azure ポータルにログインして、Spark を作成した「リソースグループ」、もしくは、「HDInsight」から辿って、自分で作成した Spark クラスター名 (ここでは、seijim-spark) を選択します。「Overview」⇒「クラスター ダッシュボード」 ⇒「Jupyter Notebook」を起動します。「New」⇒「PySpark3」で、Notebook ファイルを新規で立ち上げます。Notebook ファイルに名前を付けた後、以下のようにセルにコードを入力しながら、セル単位に実行してみてください。


from pyspark.sql import *


# Use SqlContext
sqlContext = SQLContext(sc)

# Load from RDB table using JDBC
jdbcUrl = "jdbc:sqlserver://********.database.windows.net:1433;database=********;user=********;password=********"
tableNameQuery = "(SELECT * FROM test.T1 WHERE mykey = '1') t1" # Sub query
df = sqlContext.read.format('jdbc').options(
url=jdbcUrl,
dbtable=tableNameQuery
).load()
df.show()


実行した結果は以下のようになります。

jdbc1

Azure SQL Database への書き出し (INSERT)


Notebook 上で、新しい DataFlame を作成し、それを追記型で Azure SQL Database に書き出し (INSERT) を行います。以下のようにセルにコードを入力しながら、セル単位に実行してみてください。


# Create a new DataFlame
data = [("101","Delaware"),("102","Virginia"),("103","Maryland"),("104", "South Carolina")]
rdd = sc.parallelize(data)
Entry = Row("mykey","myvalue")
t1_rdd = rdd.map(lambda p: Entry(str(p[0]), str(p[1])))
t1_df = sqlContext.createDataFrame(t1_rdd)
t1_df.show()


# Insert into RDB table using JDBC
# - mode
# append: Append contents of this :class:DataFrame to existing data.
# overwrite: Overwrite existing data.
# ignore: Silently ignore this operation if data already exists.
# error (default case): Throw an exception if data already exists.
tableName = "test.T1"
t1_df.write.jdbc(url=jdbcUrl, table=tableName, mode="append")


# Show result
df = sqlContext.read.format('jdbc').options(
url=jdbcUrl,
dbtable=tableName
).load()
df.show()


結果は以下のようになります。

jdbc2

書き出しのモード (mode) に、”overwrite” を指定すると、既存のテーブルが DROP されるので、注意が必要です。

Next ⇒ Spark on HDInsight を使ってみる (6) – Hive を活用する

[参考]

Spark Programming Guide (v2.1)

Cloud Robotics FX V2 – based on Azure Service Fabric

Cloud Robotics FX は、クラウドサービスをベースとした IoT Hub に対応したアプリケーションサーバーです。Pepper とデバイス間の連携や AI の組み込みを容易にする為の基盤アプリとして開発し、OSS 化しています。

https://github.com/seijim/cloud-robotics-azure-platform-v1-sdk/tree/master/CloudRoboticsFX

クラウドサービスは、とても安定しており、分かり易いものでしたが、いかんせん、Azure 最古の PaaS で、ARM にも対応せず、、、で、そろそろ新版を開発せねばと思っていました。

移行先としての Service Fabric を真剣に調査し始めると、いやぁ、ミドルウェアの開発になんて最適なんだ!と。さすがに、SQL Database や DocumentDB の基盤になっているだけあるなと思いました。

しかしながら、一般のアプリを開発するには概念の理解や開発してディプロイできるようになるまでには、結構な勉強時間が掛かるので、App Services や Functions を利用することをお勧めします。

さて、本題の Cloud Robotics FX V2 ですが、開発を一先ず終えました。GitHubに、現段階のソースコードを公開しております。まだ、修正が入るかもしれませんが、ちゃんと動きます! セットアップガイドを用意しましたので、事前準備にある Service Fabric SDK とツールを導入して頂ければ、Service Fabric ローカルクラスター上にディプロイして、動作確認をすることが可能です。

https://github.com/seijim/cloud-robotics-fx-v2

従来の V1 では、1つのクラウドサービスがダウンすると、他のクラウドサービスが IoT Hub のパーティション範囲を変えることで、高可用性を担保していました。Service Fabric (Stateful Service) ベースの V2 では、IoT Hub のパーティション単位に一致する Service Fabric のパーティションを動かしており、そのパーティションが現在の設定では3つのサービスレプリカを持ちます。

1つがプライマリで、残り2つがセカンダリとなり、プライマリがダウンすると数秒でセカンダリに切り替わります。コードベースで言うと、RunAsync というメイン処理をプライマリでは動かして、セカンダリでは動かさないようにしてくれているので、ステートフルなサービスでも高可用性構成=レプリカ構成が可能です。更に、インメモリのデータ (Reliable Collection) は、トランザクションをサポートし、トランザクションログを書き込みながらセカンダリレプリカに伝搬させます。すごい!

以下は、IoT Hub のパーティション数が2なので、Service Fabric のパーティション数も2で動作させています。

CloudRoboticsFX2_1

1つのパーティションを指定してみると、3つのサービスレプリカが動作しているのが分かります。Node の表示がありますが、これは  Service Fabric クラスターの動作する仮想マシン相当です。Service Fabric は、Windows Server コンテナーを利用し、その中にサービスを配置しているので、非常に高密度なサービスとなります。6つもサービスレプリカがあっても、リソース利用量は少なく、そのオーバーヘッドは非常に小さいのです。

CloudRoboticsFX2_2

Node 4 を指定して (先程のパーティションのプライマリ=Node 4)、以下の Action からNode の Deactivate をすることで、Node をダウンさせることが可能なのです。フェールオーバーのテストがしっかり出来ます。

CloudRoboticsFX2_3

以下は、プライマリが Node 0 に移った結果を示しています。この間、3~4 秒くらいでしょうか。

CloudRoboticsFX2_4

いやぁ、素晴らしい!

Spark on HDInsight を使ってみる (4) – 分散メモリ データセット RDD & DataFrames

PySpark で利用可能な分散メモリ データセット (非永続ストレージ) としては、従来の RDD (Resilient Distributed Datasets) の他に、Spark から提供される (pandas.DataFrame ではない) DataFrames があります。DataFrames は、RDD より高速で、かつ、テーブル型で SQL ライクなメソッドを持つなど、高機能であり、今後は、DataFrames が主流になって行きます。

Spark では、Machine Learning ライブラリとして、spark.mllibspark.ml の2つがありますが、前者が RDD、後者が DataFrames に対応しています。RDD と DataFrames の関係同様、今後は、spark.ml が主流になって行く予定です。

DataFrames は、名前付きのテーブル型分散メモリ データセットになりますので、名前がない状態でデータ処理を行うシーン、例えば、ヘッダー無しの CSV データなどをそのまま読み込んで処理する場合は、RDD を使う方が便利な場合もあります。

RDD を使ってみる


Azure ポータルにログインして、Spark を作成した「リソースグループ」、もしくは、「HDInsight」から辿って、自分で作成した Spark クラスター名 (ここでは、seijim-spark) を選択します。「Overview」⇒「クラスター ダッシュボード」 ⇒「Jupyter Notebook」を起動します。「New」⇒「PySpark3」で、Notebook ファイルを新規で立ち上げます。

Spark クラスターをディプロイした BLOB Storage にはサンプルデータが配置されていますので、その CSV データを利用してみます。Notebook ファイルに名前を付けた後、以下のようにセルにコードを入力しながら、セル単位に実行してみてください。


from pyspark.sql import *


# Use Hive Context
sqlContext = HiveContext(sc)
# Create an RDD from sample data
rdd_data = sc.textFile("wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")


# Show top 10 of rows
rdd_data.take(10)


# Create a schema for our data
hvacHeader = Row('Date', 'Time', 'TargetTemp', 'ActualTemp', 'BuildingID')
# Parse the data and create a schema
hvacData = rdd_data.map(lambda s: s.split(',')).filter(lambda s: s[0] != 'Date')
hvac = hvacData.map(lambda p: hvacHeader(str(p[0]), str(p[1]), int(p[2]), int(p[3]), int(p[6])))


hvac.first()


 

実行した結果は、以下のようになります。

spark_dataset01

2番目のセルで、CSV から RDD を生成しています。

3番目のセルは、上位 10 行を取得しています。

4番目のセルでは、ヘッダーとデータ部をマップして、名前付きの RDD を生成しています。

5番目のセルでは、先頭行を取得しています。

 

DataFrames を使ってみる


DataFrames は、テーブル型の分散メモリ データセットです。つまり、SQL (Like な) 操作と非常に相性が良いということになります。

今度は、Hive のサンプルテーブルから DataFrame を生成します。新しい Notebook を起動して、以下のようにセルに入力し、セル単位に実行してみてください。


from pyspark.sql import *


# Use Hive Context
sqlContext = HiveContext(sc)
# Create DataFrame from Hive table data
df = sqlContext.sql("SELECT * FROM hivesampletable")


# Show schema
df.printSchema()


# Count
df.count()


 

実行した結果は、以下のようになります。

spark_dataset02

 

続いて、以下のようにセルに入力しながら、セル単位に実行します。


# Filter
df.filter(df["country"] == "Japan").count()


# Filter
df.filter(df["country"] == "Japan").show()


 

実行した結果は以下のようになります。

spark_dataset03

 

続いて、以下のようにセルに入力し、セル単位に実行します。


# Group By
df.groupBy("country").count().show()


 

実行した結果は、以下のようになります。

spark_dataset04

 

RDD と DataFrames の基本的な使い方をご紹介しましたが、API の詳細は以下の「参考」をご覧ください。

 

NextSpark on HDInsight を使ってみる (5) – JDBC を利用した SQL Database / SQL Data Warehouse へのアクセス

 

[参考]

Spark Programming Guide (v2.1)

Spark SQL, DataFrames and Datasets Guide (v2.1)

日本語での RDD API 説明 (Scala 用ですが、PySpark でも同様です)

 

 

Spark on HDInsight を使ってみる (3) – Python は Jupyter Notebook で始めよう

前回 (2) は、ローカル開発していた Jupyter Notebook の資産移行の説明もしましたので、じゃ、ローカルで開発したら良いじゃんとなるかもしれませんが、やはり Spark 上の Python (PySpark) では、並列環境特有のお作法がありますので、先ずは、Spark on HDInsight から提供されている Jupyter Notebook を使ってみましょう。

Jupyter Notebook の起動


Azure ポータルにログインして、Spark を作成した「リソースグループ」、もしくは、「HDInsight」から辿って、自分で作成した Spark クラスター名 (ここでは、seijim-spark) を選択します。「Overview」⇒「クラスター ダッシュボード」 をクリックします。

spark_jupyter01

クラスター ダッシュボードから Jupyter Notebook を起動します。

spark_jupyter02

新規で作成された方は、PySpark フォルダーと Scala フォルダーのみがある状態ですが、前回 (2) のように BLOB Storage を使って、Notebook ファイルを移行された方は、以下のように Notebook ファイルが見えるはずです。

spark_jupyter03

ここから新規の Notebook ファイルを作成してみます。「New」をクリックして、「PySpark」(Python 2.7 系) 、もしくは、「PySpark3」(Python 3.x 系) のどちらかを選択します。ここでは、「PySpark3」を選択します。

spark_jupyter04

タイトルを編集 (ここでは Test1) し、以下のように pyspark.sql パッケージのインポート コマンドだけを最初のセルに入力して、セルの実行ボタンをクリックしてみます。


from pyspark.sql import *


spark_jupyter05

実行が完了すると、上記のように YARN Application ID などのジョブ実行情報が表示され、SparkContext は “sc” として、HiveContext は “sqlContext” として利用できる旨が表示されます。ここが、ローカル環境とは大きく違うところで、HDInsight (Hadoop) が後ろにいるなぁというところを実感できる部分でもあります。

Hive は、Map-Reduce を SQL 言語で操作できる分散型データプラットフォームで、sqlContext を利用して、すぐに利用することが可能です。

 

Notebook ファイルの終了方法


先程開いていた Notebook ファイル「Test1」をブラウザで終了 (タブを閉じるなど) してみます。Jupyter Notebook のホームを見ると、「Test1.ipynb」のステイタスが「Running」であるのが分かります。これは、Spark 上のセッションが維持され、メモリリソースなどが確保されたままの状態なのです。

spark_jupyter06

これでは、共有環境となる Spark では他への影響が出る為、利用が終了していて、誤ってブラウザで終了していたとしたら、以下のように対象の Notebook ファイルを選択して、 Shutdown ボタンをクリックしてください。

spark_jupyter07

本来の Notebook ファイルの終了方法は、以下のように「File」メニューから「Close and Halt」を選択してください。これで、セッションが開放されます。

spark_jupyter08

 

Next Spark on HDInsight を使ってみる (4) – 分散メモリ データセット RDD & DataFrames

 

 

 

Spark on HDInsight を使ってみる (2) – Python を使い始める前に知っておくこと

Spark クラスターが出来上がったので、早速、使ってみたいと思います。Spark は、Spark SQL というデータ分析用途として利用することも出来ますし、MLLIB や ML などの機械学習 (Machine Learning) 用の並列処理ライブラリも整備されていますので、機械学習プラットフォームとしても利用できます。

さて、Spark と言っても、HDInsight という PaaS 上に存在していますので、はて、どうやって、Python のパッケージをインストールしたり、どこに自製したライブラリーファイルを置けば良いのだろうという部分が気になります。そういう前提知識から先ずはご紹介します。

外部パッケージのインストール方法


スクリプト アクション (スクリプト操作) を使用して、HDInsight 上の Spark クラスターを、そのクラスターの標準では搭載されていない外部のコミュニティから提供されている Python パッケージを使用するよう構成することが可能です。

[参照]:スクリプト アクションを使用して HDInsight の Apache Spark クラスターの Jupyter Notebook で外部の Python パッケージをインストールする

  • Anaconda がヘッドノード、ワーカーノードにインストールされている為、scikit-learn などの標準的なパッケージはこのインストール手順を利用しなくても、利用可能です
  • スクリプト アクションに、/usr/bin/anaconda/bin/pip  または、/usr/bin/anaconda/bin/conda のインストーラを利用して、パッケージをインストールするよう記述したスクリプトファイル (BLOB ストレージ上などに配置)を指定してください

 

Azure ポータルにログインして、Spark を作成した「リソースグループ」、もしくは、「HDInsight」から辿って、自分で作成した Spark クラスター名 (ここでは、seijim-spark) を選択します。「Overview」⇒「スクリプト操作」(スクリプトアクション) をクリックします。

spark_use01

「新規で送信」をクリックし、「名前」「スクリプト URI」(シェル スクリプト ファイルの URI) を入力します。BLOB Storage などにファイルを作成して置いておくと良いと思います。スクリプトの実行先=パッケージのインストール先として、ヘッドとワーカーを指定し、ワーカーノードを増やした時なども自動的にこのインストーラが動作するように、最後のチェックボックスにもチェックを入れておきます。

spark_use02

シェル スクリプト ファイルの例は、以下となります。


#!/usr/bin/env bash
/usr/bin/anaconda/bin/conda install -c conda-forge tensorflow


https://hdiconfigactions.blob.core.windows.net/linuxtensorflow/tensorflowinstall.sh

 

「作成」をクリックして、5~6分待っていると以下の状態になります。ヘッドノード、ワーカーノードとも、パッケージがインストールされ、利用可能な状態になったことを意味します。

spark_use03

 

カスタム Python ライブラリの利用方法


Spark が利用している BLOB Storage (Spark クラスター作成時に指定した Storage アカウント名とコンテナー名) に、Azure ポータルや Microsoft Azure Storage Explorer などを利用して、Python ライブラリ (.py ファイル) をアップロードすれば、Jupyter Notebook などから以下のコードを記述することで利用可能になります。

コード例


sc.addPyFile ('wasbs:///userlib/xxxxx.py')


 

Azure ポータルからファイルをアップロードする際は、対象の Storage アカウント、コンテナーをたどり、「アップロード」を選択してファイル単位でアップロードして頂くことが出来ます。

spark_use04

一方、Microsoft Azure Storage Explorer を使うと、フォルダー単位でアップロードすることが出来、その際、コンテナー配下に論理フォルダーも作ることが出来る為、こちらの方がお勧めです。今回は、「userlib」という論理フォルダーを作っています。

spark_use05

spark_use06

spark_use07

これで、カスタムライブラリが利用可能になります。BLOB Storage が使えるので、とても簡単なのです。

 

Jupyter Notebook ファイルの移行


Spark on HDInsight における Python コード開発の標準的手法は、Jupyter Notebook です。ということは。。。ローカルで Jupyter Notebook で開発していたら、そのまま持って行けるのでは?

はい、その通りです。PySpark における分散処理にはお作法 (特有の記述方法) があるので、ローカル環境や単一サーバー環境で動作させている Python では、1ノードや 1CPUコアにリソース利用が偏って、遅いという問題はあるものの、先ずは、そのまま資産を利用することも出来るのです。

カスタムライブラリ同様、BLOB Storage の所定の位置にアップロードするだけです!

Spark が利用している BLOB Storage のコンテナー配下にある「HdiNotebooks」論理フォルダーに、Notebook ファイルをアップロードすると、即時利用可能になります。

spark_use08

アップロードした Notebook ファイルがそのまま表示されているのが分かります。

spark_use09

 

Next Spark on HDInsight を使ってみる (3) – Python は Jupyter Notebook で始めよう

 

 

 

 

 

Spark on HDInsight を使ってみる (1) – 導入

HDInsight は、マイクロソフトが提供する Hadoop の PaaS (Platform as a Service) であり、ハードウェア、OS、ミドルレイヤまでマイクロソフトが管理・運用をしてくれますので、Spark クラスターを展開した後は、Python (PySpark) や Scala といった言語に集中することが可能になります。

当初は、Windows ベースしかありませんでしたが、現在は、Linux の方がむしろメインストリームとなっており、特に分析クラスターである Spark を使う場合、Linux 以外の選択肢はないのです。内容的には、Hortonworks の HDP (Hortonworks Data Platform) をベースとしていますので、馴染み易いかと思います。

導入


非常に簡易な手順で、Azure ポータルからディプロイが出来ます。約 10 分程で Spark クラスターを展開できると思います。

先ず、「+」ボタン ⇒「Intelligence+analytics」⇒「HDInsight」を選択します。

spark_install01

「カスタム」⇒「基本」を選択し、「クラスター名」を入力してください。「クラスターの種類」では Spark を「バージョン」はデフォルトの Spark 1.6.3 (HDInsight 3.5) を選択します。もちろん、より新しいバージョンを選択しても構いませんが、ここで解説する動きと多少異なることがありますので、その点はご理解ください。

spark_install02

Spark (HDInsight) クラスターのログインユーザー名とパスワード、リソースグループを設定します。

spark_install03

次にストレージですが、HDInsight では、HDFS ではなく、通常の Azure BLOB Storage を利用します。Hadoop (HDInsight) から見ると、HDFS API を通してアクセスしますので、HDFS として見えているのですが、私達からは普通の BLOB Storage として扱うことが出来、これはこれで非常に融通が利きます。一方、完全な HDFS ストレージでデータ無制限のスケーラビリティを持つ Data Lake Store も選択可能です。残念ながら、2017/05/01 時点では、日本リージョンには来ておりませんので、ここでは、Azure Storage を選択します。

Storage アカウントは事前に作成しておいても、この段階で作成しても構いません。Storage のコンテナー名も指定しておきます。

spark_install04

「アプリケーション(オプション)」では特に何も指定せず、「クラスターサイズ」の方を指定します。ヘッドノード × 2、ワーカーノード × N という構成になります。ヘッドノードはジョブ管理、ワーカーノードでデータや処理が並列化されると考えてください。Spark では分散型のインメモリ処理を行いますので、ワーカーノード合計のメモリサイズは特に重要です。ここでは、一先ず、デフォルトのサイズとノード数を利用します。

spark_install05

「詳細設定」はここでは飛ばして、「概要」で「作成」を行います。10 分程待って、出来上がりです。Hadoop 上の Spark クラスターがこんなに簡単にディプロイできるなんて!!とても、素晴らしいです。

spark_install06

 

Next ⇒ Spark on HDInsight を使ってみる (2) – Python を使い始める前に知っておくこと

 

[参照]

HDInsight:エンタープライズ向けの Spark および Hadoop クラウド サービス

概要: HDInsight での Apache Spark

 

 

 

 

Cloud Robotics Azure Platform V1 SDK

2017年2月8日-9日で、Pepper World 2017 が開催されましたが、その中で、Cloud Robotics Azure Platform V1 SDK の無償提供、並びに、Cloud Robotics API (SaaS方式) の無償利用の発表が行われました。

cloudroboticssdk

上記図の Azure 枠の中で、Spark on HDInsight を除く部分を Cloud Robotics Azure Platform V1 基本セットと呼んでおり、赤紫部分の App Framework (Cloud Service ベースの Application Server) を含め、各種ツール群を Cloud Robotics Azure Platform V1 SDK と呼んでいます。

Pepper との連携を主眼に置いておりますが、あらゆる IoT のニーズに対応する包括的なプラットフォームになっています。Cloud Robotics Azure Platform V1 構築の為のハンズオンテキスト、Platform SDK のソースコード群は以下の GitHub から無償でご利用可能です。OSSとしては、MIT ライセンスとしましたので、もっとも融通の利くものになっていると思います。

https://github.com/seijim/cloud-robotics-azure-platform-v1-sdk

 

また、SaaS 方式で6月まで無償提供される Cloud Robotics API は、上記図の中の緑の DLL に相当しており、以下図のように、翻訳 API、顔認識 API、写真説明 API、会話理解 API を提供します。こちらも、以下サイトからソースコードや、Cloud Robotics Azure Platform V1 上でのセットアップ手順、Choregraphe プロジェクトテンプレートなども無償で利用可能です。

https://github.com/seijim/cloud-robotics-azure-platform-v1-sdk/tree/master/CloudRoboticsApi

cloudroboticsapi

IoT 共創ラボの勉強会として、Pepper の Choregraphe を使って、Cloud Robotics API を利用するハンズオントレーニングを 2/27 に JBS様に実施して頂きました。3/8 にもヘッドウォータース様に実施して頂く予定です。

Platform SDK や API のコードは、大半を開発してきましたが、中身については、今後、設計思想含めてご紹介して行きたいと思います。