python - pricing - cortana azure
Acceda al almacenamiento de blog de Azure desde un experimento de Azure ML (3)
Los experimentos Azure ML proporcionan formas de leer y escribir archivos CSV en el almacenamiento de blobs de Azure a través de los módulos Reader
y Writer
. Sin embargo, necesito escribir un archivo JSON para blob storage. Como no hay un módulo para hacerlo, intento hacerlo desde dentro de un módulo 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,
Sin embargo, esto da como resultado un error: ImportError: No module named azure.storage.blob
Esto implica que el paquete de Python de azure-storage
no está instalado en Azure ML.
¿Cómo puedo escribir en Azure blob storage desde dentro de 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 al usar esas recomendaciones. Creé un entorno virtual limpio de Python 2.7 (en VS 2005) y pip install azure-storage
una pip install azure-storage
para obtener las dependencias en mi directorio site-packages. Luego comprimí la carpeta de paquetes de sitio y la cargué como archivo Zip, como se indica en la nota de Dan a continuación. Luego incluí la referencia al directorio de paquetes de sitio e importé con éxito los elementos requeridos. Esto produjo un error de tiempo de espera al escribir en el almacenamiento de 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 mi exploración actual está liderando es que hay una dependencia en las requests
paquete Python en azure-storage
. requests
tiene un error conocido en Python 2.7 para llamar a nuevos protocolos SSL. No estoy seguro, pero estoy cavando en esa área ahora.
ACTUALIZACIÓN 2: Este código funciona perfectamente bien dentro de una portátil Python 3 Jupyter. Además, si hago que Blob Container se abra 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 blob. Sin embargo, no puedo usar el azure.storage.blob.BlobService
para leer desde el mismo archivo.
ACTUALIZACIÓN 3: Dan, en un comentario a continuación, sugirió que intenté con las libretas Jupyter alojadas en Azure ML . Lo había estado ejecutando desde un portátil Jupyter local (consulte la actualización 2 anterior). Sin embargo , falla cuando se ejecuta desde un Bloc de notas de Azure ML y los errores apuntan nuevamente al paquete de requires
. Tendré que encontrar los problemas conocidos con ese paquete, pero desde mi lectura, el problema conocido es con urllib3 y solo afecta a Python 2.7 y NO a las versiones de Python 3.x. Y esto se ejecutó en una computadora portátil Python 3.x. Grrr.
ACTUALIZACIÓN 4: Como dice Dan a continuación, esto puede ser un problema con las redes de Azure ML, ya que Execute Python Script
es relativamente nuevo y acaba de recibir soporte de red. Sin embargo, también probé esto en un webjob 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 es compatible tanto con Python 2.7 como con 3.4 / 5, pero solo a 32 bits, incluso en máquinas de 64 bits). El código también falla, con un mensaje de 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
Vas por el camino correcto. El módulo Execution Python Script
está diseñado para necesidades personalizadas como esta. Su verdadero problema es cómo importar los módulos de script de Python existentes. Las instrucciones completas se pueden encontrar aquí, pero resumiré para SO.
Deberá tomar el SDK de Azure Python y comprimirlo, cargarlo e importarlo en su módulo. Puedo ver por qué esto no está allí por defecto ...
https://azure.microsoft.com/en-us/documentation/articles/machine-learning-execute-python-scripts/
Importación de módulos de script de Python existentes
Un caso de uso común para muchos científicos de datos es incorporar scripts de Python existentes en los experimentos de aprendizaje automático de Azure. En lugar de concatenar y pegar todo el código en un solo cuadro de secuencia de comandos, el módulo Ejecutar secuencia de comandos de Python acepta un tercer puerto de entrada al que se puede conectar un archivo zip que contiene los módulos de Python. El marco de ejecución descomprime el archivo en tiempo de ejecución y los contenidos se agregan a la ruta de la biblioteca del intérprete de Python. La función de punto de entrada azureml_main puede importar estos módulos directamente.
Como ejemplo, considere el archivo Hello.py que contiene una función simple "Hello, World".
Figura 4. Función definida por el usuario.
A continuación, podemos crear un archivo Hello.zip que contenga Hello.py:
Figura 5. Archivo zip que contiene el código de Python definido por el usuario.
Luego, cárguelo como un conjunto de datos en Azure Machine Learning Studio. Si luego creamos y ejecutamos un experimento simple, a utiliza el módulo:
Figura 6. Ejemplo de experimento con código Python definido por el usuario y cargado como un archivo zip.
El resultado del módulo muestra que el archivo zip se ha desempaquetado y que se ha ejecutado la función print_hello. Figura 7. Función definida por el usuario en uso dentro del módulo Ejecutar Python Script.
Como sé, puede usar otros paquetes a través de un archivo comprimido que proporcione a la tercera entrada. Los comentarios en la secuencia de comandos de la plantilla de Python en Azure ML dicen:
Si un archivo zip está conectado al tercer puerto de entrada conectado, se descomprime en ". / Script Bundle". Este directorio se agrega a sys.path. Por lo tanto, si su archivo zip contiene un archivo Python mymodule.py, puede importarlo usando: import mymodule
De modo que puede empaquetar azure-storage-python
como un archivo zip haciendo clic en Nuevo , hacer clic en Dataset , y luego seleccionar Desde archivo local y la opción de archivo Zip para cargar un archivo ZIP en su área de trabajo.
Como referencia, puede ver más información en la sección How to Use Execute Python Script
del documento Execute Python Script
.
Línea inferior al frente: Use HTTP en lugar de HTTPS para acceder al almacenamiento de Azure.
Al declarar que BlobService pasa el protocol=''http''
para obligar al servicio a comunicarse a través de HTTP. Tenga en cuenta que debe tener su contenedor configurado para permitir solicitudes a través de HTTP (que lo hace de forma predeterminada).
client = BlobService(STORAGE_ACCOUNT, STORAGE_KEY, protocol="http")
Historia y crédito:
Envié una consulta sobre este tema a @AzureHelps y abrieron un ticket en los foros de 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 respondió con la magia. Estos son los pasos para facilitarles a todos duplicar mi solución:
- Descargue azure.zip, que proporciona las bibliotecas necesarias: https://azuremlpackagesupport.blob.core.windows.net/python/azure.zip
- Subirlos como un DataSet al Azure ML Studio
- Conéctelos a la entrada Zip en un módulo
Execute Python Script
- Escriba su secuencia de comandos como lo haría normalmente, asegurándose de crear su objeto
BlobService
conprotocol=''http''
- Ejecute el experimento: ahora debería poder escribir en el almacenamiento de blobs.
Algunos ejemplos de código se pueden encontrar aquí: https://gist.github.com/drdarshan/92fff2a12ad9946892df
El código que utilicé fue el siguiente, que no primero escribe el archivo CSV en el sistema de archivos, sino que lo envía como una secuencia de texto.
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,
Algunos pensamientos:
- Preferiría que las bibliotecas de Python azure se importen de forma predeterminada. Microsoft importa cientos de bibliotecas de terceros en Azure ML como parte de la distribución de Anaconda. También deben incluir los necesarios para trabajar con Azure. Estamos en Azure, nos hemos comprometido con Azure. Abrázalo.
- No me gusta que tenga que usar HTTP, en lugar de HTTPS. De acuerdo, esta es la comunicación interna de Azure, por lo que probablemente no sea gran cosa. Sin embargo, la mayoría de la documentación sugiere el uso de SSL / HTTPS cuando se trabaja con almacenamiento de blob, por lo que preferiría poder hacer eso.
- Todavía obtengo errores de tiempo de espera al azar en el experimento. A veces, el código de Python se ejecutará en milisegundos, otras veces se ejecutará durante varios 60 o segundos y luego se agotarán. Esto hace que correrlo en un experimento sea muy frustrante a veces. Sin embargo, cuando se publica como un servicio web, no parece tener este problema.
- Preferiría que la experiencia de mi código local coincida más estrechamente con Azure ML. Localmente, puedo usar HTTPS y nunca agotar el tiempo de espera. Es increíblemente rápido y fácil de escribir. Pero pasar a un experimento de Azure ML significa una depuración casi todas las veces.
Grandes apoyos para Dan, Peter y Sudarshan, todos de Microsoft, por su ayuda para resolver esto. ¡Lo aprecio mucho!