13

Azure ML Experiments предоставляет способы чтения и записи CSV-файлов в хранилище Azure blob через модули Reader и Writer. Однако мне нужно написать файл JSON для хранения блоков. Поскольку для этого нет модуля, я пытаюсь сделать это из модуля Execute Python Script.Доступ к хранилищу блогов Azure из эксперимента Azure ML

# 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 не установлен на Лазурном ML.

Как я могу записать на хранение Azure blob внутри эксперимента Azure ML?

Вот сообщение об ошибке заполнения:

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 

Где моя текущая разведка интерлиньяжа, что существует зависимость от requests Пакет Python в azure-storage. requests имеет известную ошибку в Python 2.7 для вызова более новых протоколов SSL. Не уверен, но сейчас я копаю в этой области.

ОБНОВЛЕНИЕ 2: Этот код прекрасно работает внутри ноутбука Python 3 Jupyter. Кроме того, если я создаю контейнер Blob для открытого доступа, я могу напрямую ПРОЧИТАТЬ из Контейнера через URL-адрес. Например: df = pd.read_csv("https://mystorageaccount.blob.core.windows.net/upload/test.csv") легко загружает файл из хранилища blob. Однако я не могу использовать azure.storage.blob.BlobService для чтения из того же файла.

enter image description here

UPDATE 3: Dan, в комментарии ниже, предложил мне попробовать из записных книжек Jupyter размещенных на Лазурном ML. Я запускал его из локального ноутбука Jupyter (см. Обновление 2 выше). Однако, он не работает при запуске от ноутбука Azure ML, а ошибки указывают на пакет requires. Мне нужно найти известные проблемы с этим пакетом, но из моего чтения известная проблема связана с urllib3 и влияет только на Python 2.7 и не на любые версии Python 3.x. И это было запущено в ноутбуке Python 3.x. Хмм.

enter image description here

UPDATE 4: Как Дэн отмечает, ниже, это может быть проблема с Azure ML сети, поскольку Execute Python Script является относительно новым и только что получил поддержку сетей. Тем не менее, я также тестировал это на веб-сайте Azure App Service, который находится на совершенно другой платформе Azure. (Он также находится на совершенно другом дистрибутиве 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 

ответ

5

В начало страницы: Используйте HTTP вместо HTTPS для доступа к хранилищу Azure.

При объявлении 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 Рагунатан ответил с магией. Вот шаги, чтобы сделать его легким для всех, чтобы дублировать мое исправление:

  1. Скачать azure.zip, который обеспечивает необходимые библиотеки: https://azuremlpackagesupport.blob.core.windows.net/python/azure.zip
  2. Загрузить их в качестве объекта DataSet к Azure ML студии
  3. Подключите их к входу Zip на качестве Execute Python Script модуля
  4. Написать свой сценарий, как обычно, будучи уверенным, чтобы создать свой BlobService объект с protocol='http'
  5. Run эксперимент - Теперь вы должны быть в состоянии написать бл 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. Мы в Лазуре, мы посвятили себя Лазури. Прими это.
  2. Мне не нравится, что я должен использовать HTTP, а не HTTPS. Конечно, это внутреннее общение с Azure, поэтому, скорее всего, это не так уж сложно. Однако большая часть документации предлагает использовать SSL/HTTPS при работе с хранилищем blob, поэтому я предпочел бы иметь возможность сделать это.
  3. Я все еще получаю случайные ошибки таймаута в эксперименте.Иногда код Python будет выполняться в миллисекундах, в других случаях он запускается в течение 60 или секунд, а затем истекает время. Это делает запуск в эксперименте очень расстраивающим время от времени. Однако при публикации в качестве веб-службы у меня, похоже, нет этой проблемы.
  4. Я бы предпочел, чтобы опыт из моего локального кода соответствовал более близкому Azure ML. Локально я могу использовать HTTPS и никогда не выходить из игры. Он быстро вспыхивает и легко записывается. Но переход к эксперименту Azure ML означает некоторую отладку почти каждый раз.

Огромные реквизиты Dan, Peter и Sudarshan, все из Microsoft, за их помощь в разрешении этого вопроса. Я очень ценю это!

1

Вы идете по верному пути. Модуль Execution Python Script предназначен для пользовательских нужд так же, как это. Ваша настоящая проблема заключается в том, как импортировать существующие модули скриптов Python. Здесь можно найти полные маршруты, но я опишу для SO.

Вы захотите взять SDK Azure Python и закрепить его, загрузить, а затем импортировать в свой модуль. Я могу посмотреть в то, почему это не было по умолчанию ...

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

Импорт существующих модулей Python скрипт

Распространенным потребительной случай для ученых много данных будет включать существующие сценарии Python в Эксперименты по изучению лазурной машины. Вместо того, чтобы объединять и вставлять весь код в один сценарий, модуль сценария Execute Python принимает третий входной порт, к которому может быть подключен zip-файл, содержащий модули Python. Затем файл распаковывается каркасом выполнения во время выполнения, а содержимое добавляется в путь библиотеки интерпретатора Python. Функция точки входа azureml_main может напрямую импортировать эти модули.

В качестве примера рассмотрим файл Hello.py, содержащий простую функцию «Hello, World».

image6

Рисунок 4. Определяемые пользователем функции.

Далее мы можем создать файл, содержащий Hello.zip hello.py:

image7

Рисунок 5. Zip-файл, содержащий определенный пользователем код Python.

Затем загрузите это как набор данных в Azure Machine Learning Studio. Если мы затем создать и запустить простой эксперимент использует модуль:

image8

image9

Рисунок 6. Пример эксперимента с заданной пользователем кода Python закачанный в виде архива.

Выход модуля показывает, что zip-файл был распакован и функция print_hello действительно запущена. image10 Рисунок 7. Пользовательская функция, используемая внутри модуля Execute Python Script.

+0

Дэн, я ценю ответ. Это отличное введение в настройку файла zip, но только намекает на то, как решить основную проблему неспособности эффективно импортировать файл azure.storage.blob. Я взял фактический код от Github и привел его, чтобы я мог ссылаться на него. Это успешно позволило мне ссылаться на azure.storage.blob, однако этого недостаточно, потому что все запросы выходят из строя. Я расскажу об этом больше в комментарии к моему оригинальному сообщению. Но я действительно хочу сказать спасибо, Дэн. Это очень полезно, особенно для тех, у кого есть похожие вопросы. –

+0

Я не вижу обновления на вопрос ... Но контейнер, который вы пытаетесь загрузить, должен существовать? Ваш код не будет создавать контейнер, если он еще не существует. Может потребоваться добавить 'blob_service.create_container ('mycontainer')'? Надеюсь, это поможет. –

+0

Еще раз спасибо, Дэн. Теперь я обновил этот вопрос и более четко отметил проблемы. Контейнер существует, и я даже не могу создать контейнер от Azure ML. Надеюсь, мое обновление прояснится. Еще раз спасибо за вашу работу. Я люблю Azure, и я люблю Python. Я действительно хочу, чтобы у нас был Python на Azure PaaS и SaaS-сервисах! –

1

Как я знаю, вы можете использовать другие пакеты через zip-файл, который вы предоставляете на третий вход.Комментарии в шаблоне сценарии Python в Azure ML сказать:

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

Таким образом, вы можете упаковать azure-storage-python как почтовый файл через клик Нового, нажмите Dataset, а затем выберите Из локального файла и Zip-файл вариант для загрузки ZIP-файла в рабочее пространство.

В качестве ссылки вы можете найти более подробную информацию в разделе How to Use Execute Python Script документа Execute Python Script.

+0

Спасибо, Питер. Я обновил сообщение, чтобы включить проблемы, которые получаю, когда использую эту функцию для импорта произвольного кода Python. Надеюсь, что это станет более ясным. Однако одна вещь, о которой я сомневаюсь, заключается в том, почему Microsoft не просто включает пакеты Azure Python как часть дистрибутива по умолчанию? Кажется странным. Несколько ироничным является то, что пакет Azureml Python, созданный Microsoft, не включен в эксперименты Azure ML ...: -D Azure ML рассматривает пакет azureml как сторонний пакет! –

+0

доступ к сети с модуля python новее, поэтому он ранее не был включен ... Я пытаюсь его вставить, хотя :-) –

+0

Dan, я могу легко связаться с сетью. Фактически, я могу использовать 'запросы', чтобы обращаться к другим URL-адресам. Это просто доступ к учетным записям Azure (и, возможно, другим лазурным ресурсам), которые, как представляется, блокируются. Но я согласен с тем, что он сильно напоминает сетевую проблему. Однако, как и в практике, я думаю, что «azure-storage» и другие пакеты, зависящие от azure, должны быть загружены Microsoft по умолчанию. Вы загружаете сотни других сторонних пакетов для удобства использования, почему бы и нет? –

Смежные вопросы