2016-02-06 12 views
13

Azure ML実験は、ReaderWriterモジュールを使用して、AzureブロブストレージにCSVファイルを読み書きする方法を提供します。しかし、JSONファイルをBLOBストレージに書き込む必要があります。それを行うモジュールがないので、私はExecute Python Scriptモジュール内からそうしようとしています。Azure ML実験からAzureブログストレージにアクセスする

# Import the necessary items 
from azure.storage.blob import BlobService 

def azureml_main(dataframe1 = None, dataframe2 = None): 
    account_name = 'mystorageaccount' 
    account_key='mykeyhere==' 
    json_string='{jsonstring here}' 

    blob_service = BlobService(account_name, account_key) 

    blob_service.put_block_blob_from_text("upload","out.json",json_string) 

    # Return value must be of a sequence of pandas.DataFrame 
    return dataframe1, 

しかし、これはエラーになります:ImportError: No module named azure.storage.blob

これはazure-storage Pythonパッケージは、AzureのMLにインストールされていないことを意味します。

Azure ML Experimentの内部からAzureブロブストレージに書き込むにはどうすればよいですか?

Error 0085: The following error occurred during script evaluation, please view the output log for more information: 
---------- Start of error message from Python interpreter ---------- 
data:text/plain,Caught exception while executing function: Traceback (most recent call last): 
    File "C:\server\invokepy.py", line 162, in batch 
    mod = import_module(moduleName) 
    File "C:\pyhome\lib\importlib\__init__.py", line 37, in import_module 
    __import__(name) 
    File "C:\temp\azuremod.py", line 19, in <module> 
    from azure.storage.blob import BlobService 
ImportError: No module named azure.storage.blob 

---------- End of error message from Python interpreter ---------- 
Start time: UTC 02/06/2016 17:59:47 
End time: UTC 02/06/2016 18:00:00` 

おかげで、誰も:

ここフィルエラーメッセージです!

更新:DanとPeterに感謝の意を表します。これは私がこれらの推奨事項を使って進歩したことです。私はきれいなPython 2.7仮想環境(VS 2005)を作成し、pip install azure-storageを実行して、自分のサイトパッケージディレクトリに依存関係を取得しました。私はその後、サイトパッケージのフォルダを圧縮し、Zipファイルとしてアップロードしました。その後、サイトパッケージディレクトリへの参照を含め、必要な項目を正常にインポートしました。これにより、ブログストレージに書き込むときにタイムアウトエラーが発生しました。ここで

Failure to write to Blob storage

私のコードです:

# Get access to the uploaded Python packages  
import sys 
packages = ".\Script Bundle\site-packages" 
sys.path.append(packages) 

# Import the necessary items from packages referenced above 
from azure.storage.blob import BlobService 
from azure.storage.queue import QueueService 

def azureml_main(dataframe1 = None, dataframe2 = None): 
    account_name = 'mystorageaccount' 
    account_key='p8kSy3F...elided...3plQ==' 

    blob_service = BlobService(account_name, account_key) 
    blob_service.put_block_blob_from_text("upload","out.txt","Test to write") 

    # All of the following also fail 
    #blob_service.create_container('images') 
    #blob_service.put_blob("upload","testme.txt","foo","BlockBlob") 

    #queue_service = QueueService(account_name, account_key) 
    #queue_service.create_queue('taskqueue') 

    # Return value must be of a sequence of pandas.DataFrame 
    return dataframe1, 

そして、ここでは、新しいエラーログです:私の現在の探査をリードして

Error 0085: The following error occurred during script evaluation, please view the output log for more information: 
---------- Start of error message from Python interpreter ---------- 
data:text/plain,C:\pyhome\lib\site-packages\requests\packages\urllib3\util\ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 
    InsecurePlatformWarning 
Caught exception while executing function: Traceback (most recent call last): 
    File "C:\server\invokepy.py", line 169, in batch 
    odfs = mod.azureml_main(*idfs) 
    File "C:\temp\azuremod.py", line 44, in azureml_main 
    blob_service.put_blob("upload","testme.txt","foo","BlockBlob") 
    File ".\Script Bundle\site-packages\azure\storage\blob\blobservice.py", line 883, in put_blob 
    self._perform_request(request) 
    File ".\Script Bundle\site-packages\azure\storage\storageclient.py", line 171, in _perform_request 
    resp = self._filter(request) 
    File ".\Script Bundle\site-packages\azure\storage\storageclient.py", line 160, in _perform_request_worker 
    return self._httpclient.perform_request(request) 
    File ".\Script Bundle\site-packages\azure\storage\_http\httpclient.py", line 181, in perform_request 
    self.send_request_body(connection, request.body) 
    File ".\Script Bundle\site-packages\azure\storage\_http\httpclient.py", line 143, in send_request_body 
    connection.send(request_body) 
    File ".\Script Bundle\site-packages\azure\storage\_http\requestsclient.py", line 81, in send 
    self.response = self.session.request(self.method, self.uri, data=request_body, headers=self.headers, timeout=self.timeout) 
    File "C:\pyhome\lib\site-packages\requests\sessions.py", line 464, in request 
    resp = self.send(prep, **send_kwargs) 
    File "C:\pyhome\lib\site-packages\requests\sessions.py", line 576, in send 
    r = adapter.send(request, **kwargs) 
    File "C:\pyhome\lib\site-packages\requests\adapters.py", line 431, in send 
    raise SSLError(e, request=request) 
SSLError: The write operation timed out 

---------- End of error message from Python interpreter ---------- 
Start time: UTC 02/10/2016 15:33:00 
End time: UTC 02/10/2016 15:34:18 

は依存性があるということですrequestsazure-storageのPythonパッケージ。 requestsには、より新しいSSLプロトコルを呼び出すPython 2.7の既知のバグがあります。わかりませんが、私は今その地域を掘り起こしています。

更新2:このコードは、Python 3 Jupyterノートブックの内部で完璧に動作します。さらに、Blobコンテナを公開アクセスにすると、コンテナからURLを直接読み取ることができます。たとえば、df = pd.read_csv("https://mystorageaccount.blob.core.windows.net/upload/test.csv")は、ブロブストレージからファイルを簡単に読み込みます。しかし、私はazure.storage.blob.BlobServiceを使って同じファイルから読むことはできません。

enter image description here

UPDATE 3:ダン、以下のコメントで、私はアズールML上でホストされているJupyterノートからしてみてください示唆しました。私は地元のJupyterノートブックから実行していました(上記のアップデート2を参照)。 ただし、Azure MLノートブックから実行するとエラーが発生し、エラーはrequiresパッケージを再度指します。そのパッケージに関する既知の問題を見つける必要がありますが、私の読んだところでは、既知の問題はurllib3であり、Python 2.7にのみ影響し、Python 3.xでは影響しません。これはPython 3.xノートブックで実行されました。 Grrr。

enter image description here

UPDATE 4:ダンは、以下の注意事項としてExecute Python Scriptは比較的新しく、ちょうどネットワークのサポートを得て、これは、AzureのMLネットワーキングの問題かもしれません。しかし、私はAzureアプリケーションサービスwebjobでこれをテストしました。これはまったく異なるAzureプラットフォームにあります。 (全く異なるPythonディストリビューションにもあり、Python 2.7と3.4/5の両方をサポートしていますが、64ビットマシンでも32ビットでしかサポートされていません。)また、コードはInsecurePlatformWarningというメッセージで失敗します。

[02/08/2016 15:53:54 > b40783: SYS INFO] Run script 'ListenToQueue.py' with script host - 'PythonScriptHost' 
[02/08/2016 15:53:54 > b40783: SYS INFO] Status changed to Running 
[02/08/2016 15:54:09 > b40783: INFO] test.csv 
[02/08/2016 15:54:09 > b40783: ERR ] D:\home\site\wwwroot\env\Lib\site-packages\requests\packages\urllib3\util\ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning. 
[02/08/2016 15:54:09 > b40783: ERR ] SNIMissingWarning 
[02/08/2016 15:54:09 > b40783: ERR ] D:\home\site\wwwroot\env\Lib\site-packages\requests\packages\urllib3\util\ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 
[02/08/2016 15:54:09 > b40783: ERR ] InsecurePlatformWarning 
[02/08/2016 15:54:09 > b40783: ERR ] D:\home\site\wwwroot\env\Lib\site-packages\requests\packages\urllib3\util\ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 
[02/08/2016 15:54:09 > b40783: ERR ] InsecurePlatformWarning 

答えて

5

ボトムラインアップ前面: AzureストレージにアクセスするためにHTTPSの代わりにHTTPを使用します。

BlobServiceを宣言すると、protocol='http'が渡され、サービスはHTTP経由で通信します。 HTTP経由でのリクエストを許可するようにコンテナを設定する必要があります(これはデフォルトで行われます)。

client = BlobService(STORAGE_ACCOUNT, STORAGE_KEY, protocol="http")

歴史とクレジット:

私は@AzureHelpsに、このトピックに関する問い合わせを掲示し、彼らはMSDNフォーラムでチケットをオープンしました:https://social.msdn.microsoft.com/Forums/azure/en-US/46166b22-47ae-4808-ab87-402388dd7a5c/trouble-writing-blob-storage-file-in-azure-ml-experiment?forum=MachineLearning&prof=required

Sudarshan Raghunathanは魔法で答えました。必要なライブラリ提供するazure.zip

  1. ダウンロード:https://azuremlpackagesupport.blob.core.windows.net/python/azure.zip
  2. は、AzureのMLメーカー
  3. へのデータセットとして、それらをアップロードし、それらを接続するここでの手順は、誰もが私の修正を複製することが簡単になっていますあなたは今BLに書き込みをすることができるはず - Execute Python Scriptモジュール
  4. 通常どおりprotocol='http'
  5. 実行して実験をごBlobServiceオブジェクトを作成することを確認され、スクリプトを書く上ジップ入力へobストレージ。

いくつかのサンプルコードはここで見つけることができます:私が使用https://gist.github.com/drdarshan/92fff2a12ad9946892df

コードは、最初のファイルシステムにCSVを書きますが、テキストストリームとして送信されません以下でした。

from azure.storage.blob import BlobService 

def azureml_main(dataframe1 = None, dataframe2 = None): 
    account_name = 'mystorageaccount' 
    account_key='p8kSy3FACx...redacted...ebz3plQ==' 
    container_name = "upload" 
    json_output_file_name = 'testfromml.json' 
    json_orient = 'records' # Can be index, records, split, columns, values 
    json_force_ascii=False; 

    blob_service = BlobService(account_name, account_key, protocol='http') 

    blob_service.put_block_blob_from_text(container_name,json_output_file_name,dataframe1.to_json(orient=json_orient, force_ascii=json_force_ascii)) 

    # Return value must be of a sequence of pandas.DataFrame 
    return dataframe1, 

いくつかの考え:

  1. 紺碧のPythonライブラリがデフォルトでインポートされた場合、私は好むだろう。 Microsoftは、数百のサードパーティライブラリをAzure MLにAnacondaディストリビューションの一部としてインポートします。 Azureで作業するために必要なものも含める必要があります。私たちはAzureにいる、我々はAzureに約束した。それを抱きしめてください。
  2. 私はHTTPSの代わりにHTTPを使用しなければならないと嫌いです。確かに、これはAzure内部の通信なので、大したことではないでしょう。しかし、ドキュメントのほとんどは、BLOBストレージを扱う際にSSL/HTTPSを使用することを示唆しているので、そうすることができます。
  3. 実験でランダムなタイムアウトエラーが発生します。時々、Pythonコードはミリ秒単位で実行され、数回または数秒間実行された後にタイムアウトします。これは、時には非常にイライラする実験でそれを実行します。しかし、Webサービスとして公開された場合、私はこの問題を抱えていないようです。
  4. 地元のコードからの経験がAzure MLと密接にマッチしたものを好むでしょう。ローカルでは、HTTPSを使用してタイムアウトすることはできません。それは速くて速く、書くのは簡単です。しかし、Azure ML実験に移行することは、ほぼ毎回デバッグを意味します。

マイクロソフト社のDan、Peter、Sudarshan氏の巨大な小道具が、この問題を解決するのに役立っています。私はとても感謝しています!

1

正しいパスを使用しています。 Execution Python Scriptモジュールは、このようなカスタムニーズに対応しています。実際の問題は、既存のPythonスクリプトモジュールをインポートする方法です。完全な指示がここにありますが、私はSOについて要約します。

Azure Python SDKを入手して、それを圧縮してアップロードしてから、モジュールにインポートしたいと思うでしょう。私は多くのデータ科学者のための一般的なユースケースは、に既存のPythonスクリプトを組み込むことである...これはデフォルトでは存在しない理由に

https://azure.microsoft.com/en-us/documentation/articles/machine-learning-execute-python-scripts/

既存のPythonスクリプトモジュールをインポート

を見ることができますAzure機械学習の実験。 Execute Python Scriptモジュールは、すべてのコードを連結して1つのスクリプトボックスに貼り付ける代わりに、Pythonモジュールを含むzipファイルを接続できる3番目の入力ポートを受け入れます。ファイルは実行時に実行フレームワークによって解凍され、内容はPythonインタプリタのライブラリパスに追加されます。 azureml_mainエントリー・ポイント関数は、これらのモジュールを直接インポートできます。

例として、単純な「Hello、World」関数を含むHello.pyファイルを考えてみましょう。

image6

図4.ユーザ定義関数。ユーザ定義のPythonコードを含む

image7

図5 Zipファイル:

次に、我々はHello.pyを含むファイルHello.zipを作成することができます。

次に、これをデータセットとしてAzure Machine Learning Studioにアップロードします。私たちは、その後、簡単な実験aはモジュールを使用して作成して実行した場合:zipファイルとしてアップロードしたユーザー定義のPythonコードと

image8

image9

図6.サンプル実験を。

モジュール出力は、zipファイルがパッケージ化されておらず、関数print_helloが実際に実行されたことを示します。 image10 図7. Execute Python Scriptモジュール内で使用されるユーザー定義関数。

+0

ダン、私は応答を感謝します。 zipファイルで設定するのは素晴らしいイントロですが、azure.storage.blobを効果的にインポートすることができないという中心的な問題に対処する方法についてのヒントしかありません。 Githubから実際のコードを取り込み、参照できるようにしました。これにより、azure.storage.blobを参照することができましたが、すべての要求がタイムアウトしているため、これでは不十分です。私は元の投稿へのコメントでそれをさらに扱っていきます。でも本当にありがとう、ダン。これは非常に役に立ちます。 –

+0

質問の更新は表示されません...しかし、BLOBをアップロードしようとしているコンテナは存在していますか?コンテナがまだ作成されていない場合は、コンテナが作成されません。 'blob_service.create_container( 'mycontainer')'を追加する必要がありますか?これが役に立ちそうですか? –

+0

もう一度、ダンに感謝します。私は今質問を更新し、より明快な問題を指摘しました。コンテナが存在し、Azure MLからコンテナを作成することさえできません。私の更新がより明確になることを願っています。あなたの仕事にもう一度感謝します。私はAzureが大好きで、Pythonが大好きです。私はAzure PaaSとSaaSサービスでPythonを本当に手に入れたいと思っています! –

1

私が知っているように、3番目の入力に提供するzipファイルで他のパッケージを使用することができます。AzureのMLでのPythonのテンプレートスクリプト内のコメントは言う:

If a zip file is connected to the third input port is connected, it is unzipped under ".\Script Bundle". This directory is added to sys.path. Therefore, if your zip file contains a Python file mymodule.py you can import it using: import mymodule

ですから、クリックスルーzipファイルの新しいとしてazure-storage-pythonをパッケージデータセットをクリックし、[ローカルファイルとからを選択することができますZIPファイルオプションを使用して、ZIPファイルをワークスペースにアップロードします。

詳細は、Execute Python ScriptHow to Use Execute Python Scriptセクションを参照してください。

+0

ありがとう、ピーター。この機能を使用して任意のPythonコードをインポートするときに問題が発生するように投稿を更新しました。それがより明確になることを願っています。しかし、私が疑問に思うのは、MicrosoftがAzure Pythonパッケージを既定のディストリビューションの一部として単に組み込むだけではないということです。奇妙に思える。多少の皮肉なことは、Microsoftによって構築されたazureml PythonパッケージがAzure ML実験に含まれていないことです... :-D Azure MLは、azuremlパッケージをサードパーティパッケージとして扱います! –

+0

Pythonモジュールからのネットワークアクセスが新しいです。これは以前は含まれていなかった理由です。私はそれを入れようとしています:-) –

+0

ダン、私は簡単にネットワークを介して手を差し伸べることができます。実際、私は '要求'を使って他のURLに手を差し伸べることができます。これは、ブロックされているように見えるAzureストレージアカウント(と他の紺碧のリソース)へのアクセスです。しかし、私はそれがネットワーク問題のように強く見えることに同意します。しかし、実際には、「azure-storage」とその他のAzure固有のパッケージはデフォルトでMicrosoftによってロードされるべきだと私は思っています。使いやすさのために何百もの他社製パッケージをロードしていますが、なぜ自分のものではないのですか? –

関連する問題