Доступ к хранилищу блогов Azure из эксперимента Azure ML
Эксперименты Azure ML предоставляют способы чтения и записи файлов CSV в хранилище BLOB-объектов Azure с помощью Reader
а также Writer
модули. Однако мне нужно записать файл 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.
Как записать в хранилище BLOB-объектов 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
чтобы получить зависимости в мой каталог site-packages. Затем я заархивировал папку 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
имеет известную ошибку в 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, которое работает на совершенно другой платформе 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
3 ответа
Итог: используйте 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/ Проблема, пишущего-блоб-хранения-файл-в-лазурь-мл-эксперимент? форум = & машинное обучение проф = требуемая
Сударшан Рагхунатхан ответил магией. Вот шаги, чтобы каждый мог легко скопировать мое исправление:
- Загрузите azure.zip, который предоставляет необходимые библиотеки: https://azuremlpackagesupport.blob.core.windows.net/python/azure.zip
- Загрузите их как набор данных в Azure ML Studio.
- Подключите их к входу Zip на
Execute Python 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,
Некоторые мысли:
- Я бы предпочел, чтобы библиотеки Azure Python были импортированы по умолчанию. Microsoft импортирует сотни сторонних библиотек в Azure ML как часть дистрибутива Anaconda. Они также должны включать те, которые необходимы для работы с Azure. Мы в Azure, мы посвятили себя Azure. Прими это.
- Мне не нравится, что я должен использовать HTTP вместо HTTPS. Конечно, это внутренняя связь Azure, так что, скорее всего, ничего страшного. Однако большая часть документации предлагает использовать SSL / HTTPS при работе с хранилищем больших двоичных объектов, поэтому я предпочел бы сделать это.
- Я все еще получаю случайные ошибки тайм-аута в эксперименте. Иногда код Python выполняется за миллисекунды, в других случаях он выполняется в течение нескольких 60 или секунд, а затем истекает. Это делает запуск этого в эксперименте очень расстраивающим время от времени. Тем не менее, при публикации в виде веб-службы у меня, похоже, нет этой проблемы.
- Я бы предпочел, чтобы опыт из моего локального кода соответствовал Azure ML. Локально я могу использовать HTTPS и никогда не превышать время ожидания. Это быстро, и легко написать. Но переход к эксперименту Azure ML означает некоторую отладку, почти каждый раз.
Огромные реквизиты Дэну, Питеру и Сударшану, все из Microsoft, за их помощь в решении этой проблемы. Я очень ценю это!
Как я знаю, вы можете использовать другие пакеты через zip-файл, который вы предоставляете для третьего ввода. Комментарии в шаблонном скрипте Python в Azure ML гласят:
Если zip-файл подключен к третьему входному порту, он распаковывается в ".\Script Bundle". Этот каталог добавлен в sys.path. Поэтому, если ваш zip-файл содержит Python-файл mymodule.py, вы можете импортировать его, используя: import mymodule
Так что вы можете упаковать azure-storage-python
в качестве zip-файла нажмите " Создать", нажмите " Набор данных", затем выберите " Из локального файла" и выберите опцию "Zip-файл", чтобы загрузить ZIP-файл в рабочую область.
В качестве ссылки, вы можете увидеть больше информации в разделеHow to Use Execute Python Script
из документаExecute Python Script
,
Вы идете по правильному пути. Execution Python Script
Модуль предназначен для пользовательских нужд, как это. Ваша реальная проблема заключается в том, как импортировать существующие скриптовые модули Python. Полные указания можно найти здесь, но я подведу итоги для SO.
Вы захотите взять Azure Python SDK и сжать его, загрузить, затем импортировать в свой модуль. Я могу посмотреть, почему это не там по умолчанию...
https://azure.microsoft.com/en-us/documentation/articles/machine-learning-execute-python-scripts/
Импорт существующих модулей скриптов Python
Распространенным вариантом использования для многих исследователей данных является включение существующих сценариев Python в эксперименты машинного обучения Azure. Вместо того, чтобы объединять и вставлять весь код в один блок сценариев, модуль "Выполнение сценариев Python" принимает третий входной порт, к которому можно подключить zip-файл, содержащий модули Python. Затем файл разархивируется средой выполнения во время выполнения, и содержимое добавляется в путь к библиотеке интерпретатора Python. Затем функция точки входа azureml_main может импортировать эти модули напрямую.
В качестве примера рассмотрим файл Hello.py, содержащий простую функцию "Hello, World".
Рисунок 4. Определяемая пользователем функция.
Далее мы можем создать файл Hello.zip, содержащий Hello.py:
Рисунок 5. Zip-файл, содержащий определенный пользователем код Python.
Затем загрузите его как набор данных в Студию машинного обучения Azure. Если мы затем создадим и проведем простой эксперимент, то используем модуль:
Рисунок 6. Пример эксперимента с пользовательским кодом Python, загруженным в виде zip-файла.
Вывод модуля показывает, что zip-файл был распакован и функция print_hello действительно была запущена. Рисунок 7. Пользовательская функция, используемая внутри модуля Execute Python Script.