Reader
Azure 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-storage
Python パッケージが 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 ディレクトリへの参照を含め、必要なアイテムを正常にインポートしました。これにより、ブログ ストレージへの書き込み時にタイムアウト エラーが発生しました。
これが私のコードです:
# 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
私の現在の調査は、 のrequests
Python パッケージに依存しているということですazure-storage
。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
て同じファイルから読み取ることはできません。
更新 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