Подтвердить что ты не робот

Доступ к хранилищу блога Azure из эксперимента Azure ML

Azure ML Experiments предоставляет способы чтения и записи CSV файлов в хранилище Azure blob через модули Reader и Writer. Однако мне нужно написать файл JSON для хранения блоков. Поскольку для этого нет модуля, я пытаюсь сделать это из модуля 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.

Как я могу писать в хранилище Blade Azure из эксперимента 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`

Спасибо, всем!

ОБНОВЛЕНИЕ: Спасибо Дэну и Питеру за приведенные ниже идеи. Это прогресс, который я сделал с помощью этих рекомендаций. Я создал чистую виртуальную среду Python 2.7 (в VS 2005) и сделал pip install azure-storage, чтобы получить зависимости в моем каталоге пакетов сайтов. Затем я закрепил папку сайта-пакетов и загрузил ее как Zip файл, как указано в примечании Дэн. Затем я включил ссылку на каталог сайтов-пакетов и успешно импортировал необходимые элементы. Это привело к ошибке времени при записи в хранилище блога.

Невозможность записи в хранилище 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

Где мое текущее исследование ведет к тому, что существует зависимость от пакета 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 для чтения из того же файла.

введите описание изображения здесь

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

введите описание изображения здесь

ОБНОВЛЕНИЕ 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
4b9b3361

Ответ 1

Bottom Line Up Front: Используйте 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

Сударшан Рагхунатхан ответил магией. Вот шаги, которые облегчают для каждого дублирование моего исправления:

  • Загрузите azure.zip, который предоставляет необходимые библиотеки: https://azuremlpackagesupport.blob.core.windows.net/python/azure.zip
  • Загрузите их в DataSet в Azure ML Studio
  • Подключите их к входу Zip в модуле Execute Python Script
  • Напишите свой script, как обычно, создав BlobService объект protocol='http'
  • Запустите эксперимент - теперь вы сможете писать в хранилище 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,

Некоторые мысли:

  • Я бы предпочел, чтобы по умолчанию были импортированы лазурные библиотеки Python. Microsoft импортирует сотни сторонних библиотек в Azure ML как часть дистрибутива Anaconda. Они также должны включать те, которые необходимы для работы с Azure. Мы в Лазуре, мы посвятили себя Лазури. Обнимите его.
  • Мне не нравится, что я должен использовать HTTP, а не HTTPS. Конечно, это внутренняя связь с Azure, поэтому, скорее всего, это не имеет большого значения. Однако большая часть документации предлагает использовать SSL/HTTPS при работе с хранилищем blob, поэтому я предпочел бы иметь возможность сделать это.
  • Я все еще получаю случайные ошибки таймаута в эксперименте. Иногда код Python будет выполняться в миллисекундах, в других случаях он запускается в течение 60 или секунд, а затем истекает время. Это делает запуск в эксперименте очень расстраивающим время от времени. Однако при публикации в качестве веб-службы у меня, похоже, нет этой проблемы.
  • Я бы предпочел, чтобы опыт моего локального кода соответствовал более близкому Azure ML. Локально я могу использовать HTTPS и никогда не выходить из игры. Он быстро вспыхивает и легко читается. Но переход к эксперименту Azure ML означает некоторую отладку почти каждый раз.

Огромные реквизиты Дэну, Питеру и Сударшану, все от Microsoft, за их помощь в разрешении этого. Я очень ценю это!

Ответ 2

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

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

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

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

Общим примером использования многих ученых в области данных является включение существующих сценариев Python в эксперименты по изучению Azure Machine Learning. Вместо конкатенации и вставки всего кода в один блок script модуль Execute Python script принимает третий входной порт, к которому может быть подключен 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 файла.

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

Ответ 3

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

Если подключен zip файл к третьему входному порту, он распаковывается в папку ".\ Script Bundle". Этот каталог добавляется в sys.path. Поэтому, если ваш zip файл содержит файл mymodule.py на Python, вы можете импортировать его, используя: import mymodule

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

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