Acceda al almacenamiento de blogs de Azure desde un experimento de Azure ML

Los experimentos de Azure ML proporcionan formas de leer y escribir archivos CSV en Azure Blob Storage a través deReader yWriter módulos Sin embargo, necesito escribir un archivo JSON en el almacenamiento de blobs. Como no hay un módulo para hacerlo, estoy tratando de hacerlo desde dentro de unExecute Python Script módulo.

# 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,

Sin embargo, esto da como resultado un error:ImportError: No module named azure.storage.blob

Esto implica que elazure-storage El paquete Python no está instalado en Azure ML.

¿Cómo puedo escribir en Azure Blob Storage desde dentro de un Azure ML Experiment?

Aquí está el mensaje de error de relleno:

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`

¡Gracias a todos!

ACTUALIZACIÓN: Gracias a Dan y Peter por las ideas a continuación. Este es el progreso que he logrado usando esas recomendaciones. Creé un entorno virtual limpio de Python 2.7 (en VS 2005) e hice unpip install azure-storage para obtener las dependencias en mi directorio de paquetes de sitio. Luego comprimí la carpeta de paquetes del sitio y la cargué como el archivo Zip, según la nota de Dan a continuación. Luego incluí la referencia al directorio de paquetes del sitio e importé con éxito los elementos requeridos. Esto resultó en un error de tiempo de espera al escribir en el almacenamiento del blog.

Aquí está mi código:

# 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,

Y aquí está el nuevo registro de errores:

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

Donde está conduciendo mi exploración actual es que hay una dependencia en elrequests Paquete Python enazure-storage. requests tiene un error conocido en Python 2.7 para llamar a protocolos SSL más nuevos. No estoy seguro, pero ahora estoy cavando en esa área.

ACTUALIZACIÓN 2: este código funciona perfectamente bien dentro de una computadora portátil Python 3 Jupyter. Además, si hago que el Blob Container esté abierto al acceso público, puedo LEER directamente desde el Contenedor a través de una URL. Por ejemplo:df = pd.read_csv("https://mystorageaccount.blob.core.windows.net/upload/test.csv") Carga fácilmente el archivo desde el almacenamiento de blobs. Sin embargo, no puedo usar elazure.storage.blob.BlobService para leer desde el mismo archivo.

ACTUALIZACIÓN 3: Dan, en un comentario a continuación, sugirió que probara con los cuadernos Jupyteralojado en Azure ML. Lo había estado ejecutando desde un cuaderno Jupyter local (ver la actualización 2 más arriba).sin embargo, falla cuando se ejecuta desde un cuaderno de Azure ML, y los errores apuntan arequires paquete de nuevo. Necesitaré encontrar los problemas conocidos con ese paquete, pero según mi lectura, el problema conocido es con urllib3 y solo afecta a Python 2.7 y NO a ninguna versión de Python 3.x. Y esto se ejecutó en una computadora portátil Python 3.x. Grrr.

ACTUALIZACIÓN 4: como Dan señala a continuación, esto puede ser un problema con la red Azure ML, comoExecute Python Script es relativamente nuevo y acaba de recibir soporte de redes. Sin embargo, también lo probé en un trabajo web de Azure App Service, que se encuentra en una plataforma Azure completamente diferente. (También está en una distribución de Python completamente diferente y admite Python 2.7 y 3.4 / 5, pero solo a 32 bits, incluso en máquinas de 64 bits). El código también falla, con unInsecurePlatformWarning mensaje.

[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

Respuestas a la pregunta(3)

Su respuesta a la pregunta