16

ReaderAzure ML Experiments は、およびWriterモジュールを介して Azure Blob Storage に対して CSV ファイルを読み書きする方法を提供します。ただし、JSON ファイルを BLOB ストレージに書き込む必要があります。そうするモジュールがないので、Execute Python Scriptモジュール内からそうしようとしています。

# 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-storagePython パッケージが Azure ML にインストールされていないことを意味します。

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

フィル エラー メッセージは次のとおりです。

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、依存関係を自分の site-packages ディレクトリに取得しました。次に、以下の Dan のメモに従って、site-packages フォルダーを圧縮し、Zip ファイルとしてアップロードしました。次に、site-packages ディレクトリへの参照を含め、必要なアイテムを正常にインポートしました。これにより、ブログ ストレージへの書き込み時にタイムアウト エラーが発生しました。

BLOB ストレージへの書き込みの失敗

これが私のコードです:

# 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

私の現在の調査は、 のrequestsPython パッケージに依存しているということですazure-storagerequestsには、新しい 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て同じファイルから読み取ることはできません。

ここに画像の説明を入力

更新 3: 以下のコメントで、Dan は、 Azure ML でホストされている Jupyter ノートブックから試すことを提案しました。ローカルの Jupyter ノートブックから実行していました (上記の更新 2 を参照)。 ただし、Azure ML Notebook から実行すると失敗し、エラーはrequires再びパッケージを指します。そのパッケージの既知の問題を見つける必要がありますが、私の読書によると、既知の問題は urllib3 にあり、Python 2.7 にのみ影響し、Python 3.x バージョンには影響しません。これは Python 3.x ノートブックで実行されました。うーん。

ここに画像の説明を入力

更新 4: Dan が以下に記しているように、これは Azure ML ネットワークの問題である可能性があります。これExecute Python Scriptは比較的新しく、ネットワーク サポートを取得したばかりです。ただし、まったく異なる Azure プラットフォーム上にある Azure App Service Web ジョブでもこれをテストしました。(また、まったく異なる Python ディストリビューション上にあり、Python 2.7 と 3.4/5 の両方をサポートしますが、32 ビットのみで、64 ビット マシンでもサポートします。) そこのコードも失敗し、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
4

3 に答える 3

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/トラブルシューティング-blob-storage-file-in-azure-ml-experiment?forum=MachineLearning&prof=必須

スダルシャン・ラグナサンは魔法で答えた。誰もが私の修正を簡単に複製できるようにするための手順は次のとおりです。

  1. 必要なライブラリを提供する azure.zip をダウンロードします: https://azuremlpackagesupport.blob.core.windows.net/python/azure.zip
  2. それらを DataSet として Azure ML Studio にアップロードします。
  3. Execute Python Scriptそれらをモジュールの Zip 入力に接続します
  4. BlobService通常どおりにスクリプトを記述し、必ず次のオブジェクトを作成してください。protocol='http'
  5. 実験を実行します。これで、BLOB ストレージに書き込めるようになります。

いくつかのサンプル コードはここにあります: 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 は、Anaconda ディストリビューションの一部として、数百のサード パーティ ライブラリを Azure ML にインポートします。また、Azure を使用するために必要なものも含まれている必要があります。私たちは Azure にいます。Azure にコミットしています。抱きしめて。
  2. HTTPS の代わりに HTTP を使用する必要があるのは好きではありません。確かに、これは Azure の内部通信であるため、大したことではない可能性があります。ただし、ほとんどのドキュメントでは、ブロブ ストレージを使用する場合に SSL/HTTPS を使用することが推奨されているため、それができるようにしたいと考えています。
  3. 実験でまだランダムなタイムアウト エラーが発生します。Python コードはミリ秒単位で実行される場合もあれば、60 秒または数秒実行されてからタイムアウトする場合もあります。これにより、実験で実行するのが非常にイライラすることがあります。ただし、Web サービスとして公開すると、この問題は発生しないようです。
  4. 私のローカル コードのエクスペリエンスが、Azure ML とより密接に一致することを望みます。ローカルでは、HTTPS を使用でき、タイムアウトすることはありません。めちゃくちゃ速くて、書きやすいです。ただし、Azure ML の実験に移行するということは、ほぼ毎回、何らかのデバッグが必要になるということです。

この問題の解決に協力してくれた Microsoft の Dan、Peter、および Sudarshan に多大な感謝を捧げます。とても感謝しています!

于 2016-02-10T22:31:24.177 に答える
1

あなたは正しい道を進んでいます。このExecution Python Scriptモジュールは、このようなカスタム ニーズ向けです。実際の問題は、既存の Python スクリプト モジュールをインポートする方法です。完全な手順はここにありますが、SO について要約します。

Azure Python SDK を取得して圧縮し、アップロードしてから、モジュールにインポートします。これがデフォルトで存在しない理由を調べることができます...

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

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

多くのデータ サイエンティストの一般的なユース ケースは、既存の Python スクリプトを Azure Machine Learning 実験に組み込むことです。すべてのコードを連結して 1 つのスクリプト ボックスに貼り付ける代わりに、Python スクリプトの実行モジュールは、Python モジュールを含む zip ファイルを接続できる 3 番目の入力ポートを受け入れます。ファイルは実行時に実行フレームワークによって解凍され、コンテンツが Python インタープリターのライブラリ パスに追加されます。azureml_main エントリ ポイント関数は、これらのモジュールを直接インポートできます。

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

画像6

図 4. ユーザー定義関数。

次に、Hello.py を含むファイル Hello.zip を作成できます。

画像7

図 5. ユーザー定義の Python コードを含む zip ファイル。

次に、これをデータセットとして Azure Machine Learning Studio にアップロードします。次に、簡単な実験を作成して実行すると、次のモジュールが使用されます。

画像8

画像9

図 6. ユーザー定義の Python コードを zip ファイルとしてアップロードしたサンプル実験。

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

于 2016-02-07T16:57:31.717 に答える
1

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

3つ目の入力ポートにzipファイルが接続されている場合は、「.\Script Bundle」配下に解凍されます。このディレクトリは sys.path に追加されます。したがって、zip ファイルに Python ファイル mymodule.py が含まれている場合は、次を使用してインポートできます。

そのため、[新規] をクリックし、[データセットazure-storage-python] をクリックして zip ファイルとしてパッケージ化できます。次に、[ローカル ファイルから]と[ Zip ファイル] オプションを選択して、ZIP ファイルをワークスペースにアップロードします。

How to Use Execute Python Script参考として、ドキュメントのセクションで詳細を確認できますExecute Python Script

于 2016-02-08T13:42:23.700 に答える