2016-02-06 12 views
13

एज़ूर एमएल प्रयोगों से एज़ूर ब्लॉब स्टोरेज को 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 अजगर पैकेज Azure एमएल पर स्थापित नहीं है।

मैं एज़ूर एमएल प्रयोग के अंदर से एज़ूर ब्लॉब स्टोरेज को कैसे लिख सकता हूं?

यहाँ भरने त्रुटि संदेश है:

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` 

धन्यवाद, हर कोई!

अद्यतन: नीचे दिए गए विचारों के लिए दान और पीटर के लिए धन्यवाद। यह प्रगति का उपयोग करके मैंने प्रगति की है। मैंने अपनी साइट-पैकेज निर्देशिका में निर्भरता प्राप्त करने के लिए एक स्वच्छ पायथन 2.7 वर्चुअल वातावरण (वीएस 2005 में) बनाया, और pip install azure-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, 

और नई त्रुटि लॉग है:

Failure to write to Blob storage

यहाँ मेरी कोड है

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 

मेरे वर्तमान अन्वेषण प्रमुख है वहाँ एक निर्भरता पर है कि requestsazure-storage में पायथन पैकेज। requests में नए एसएसएल प्रोटोकॉल को कॉल करने के लिए पायथन 2.7 में एक ज्ञात बग है। यकीन नहीं है, लेकिन मैं अब उस क्षेत्र में चारों ओर खोद रहा हूँ।

अद्यतन 2: यह कोड पाइथन 3 जुपीटर नोटबुक के अंदर पूरी तरह ठीक है। इसके अतिरिक्त, यदि मैं ब्लॉब कंटेनर को सार्वजनिक पहुंच के लिए खोलता हूं, तो मैं सीधे एक यूआरएल के माध्यम से कंटेनर से पढ़ सकता हूं। उदाहरण के लिए: df = pd.read_csv("https://mystorageaccount.blob.core.windows.net/upload/test.csv") आसानी से ब्लॉब स्टोरेज से फ़ाइल लोड करता है। हालांकि, मैं उसी फ़ाइल से पढ़ने के लिए azure.storage.blob.BlobService का उपयोग नहीं कर सकता।

enter image description here

अद्यतन 3: दान, नीचे एक टिप्पणी में, मैं Jupyter पुस्तिकाओं Azure एमएल पर होस्ट से कोशिश का सुझाव दिया। मैं इसे स्थानीय जुपीटर नोटबुक से चला रहा था (ऊपर अपडेट 2 देखें)। हालांकि, यह एज़ूर एमएल नोटबुक से चलने पर विफल रहता है, और त्रुटियां requires पैकेज को फिर से इंगित करती हैं। मुझे उस पैकेज के साथ ज्ञात समस्याएं ढूंढनी होंगी, लेकिन मेरे पढ़ने से, ज्ञात समस्या urllib3 के साथ है और केवल Python 2.7 को प्रभावित करती है और कोई पायथन 3.x संस्करण नहीं है। और यह एक पायथन 3.x नोटबुक में चलाया गया था। गरर।

enter image description here

अद्यतन 4: दान नीचे नोटों के रूप में, यह, Azure एमएल नेटवर्किंग के साथ एक मुद्दा हो सकता के रूप में Execute Python Script अपेक्षाकृत नई है और सिर्फ नेटवर्किंग का समर्थन मिला है। हालांकि, मैंने यह भी एक Azure ऐप सेवा वेबबॉज पर परीक्षण किया है, जो पूरी तरह से अलग Azure मंच पर है। (यह एक पूरी तरह से अलग पायथन वितरण पर भी है और पाइथन 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

नीचे रेखा ऊपर फ्रंट: एज़ूर स्टोरेज तक पहुंचने के लिए HTTPS के बजाय HTTP का उपयोग करें।

HTTP पर संचार करने के लिए सेवा को मजबूर करने के लिए protocol='http' में BlobService पास घोषित करते समय। ध्यान दें कि आपके पास 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

सुदर्शन रघुनाथन जादू के साथ उत्तर दिया।

  1. डाउनलोड azure.zip जो आवश्यक पुस्तकालयों प्रदान करता है:: https://azuremlpackagesupport.blob.core.windows.net/python/azure.zip
  2. उन्हें Azure एमएल स्टूडियो
  3. करने के लिए एक डेटासेट के रूप में अपलोड करें, उन्हें कनेक्ट ये कदम उठाएँ हर कोई मेरी ठीक नकल करने के लिए यह आसान बनाने के लिए कर रहे हैं एक Execute Python Script मॉड्यूल पर पिन इनपुट करने के लिए
  4. अपनी स्क्रिप्ट आप सामान्य रूप से होता है, प्रयोग protocol='http'
  5. रन के साथ अपने BlobService वस्तु बनाने के लिए यकीन है कि होने के रूप में लिखें - अब आप बीएल को लिखने में सक्षम होना चाहिए ओब भंडारण

कुछ उदाहरण कोड यहां पाया जा सकता: https://gist.github.com/drdarshan/92fff2a12ad9946892df

कोड मैं इस्तेमाल किया निम्नलिखित है, जो पहली फाइल सिस्टम के लिए सीएसवी बारे में नहीं है, लेकिन एक पाठ धारा के रूप में भेजता है।

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. मैं अगर नीला पायथन पुस्तकालयों डिफ़ॉल्ट रूप से आयात किया गया पसंद करेंगे। माइक्रोसॉफ्ट एनाकोंडा वितरण के हिस्से के रूप में Azure एमएल में सैकड़ों तृतीय पक्ष पुस्तकालयों का आयात करता है। उन्हें अज़ूर के साथ काम करने के लिए आवश्यक भी शामिल करना चाहिए। हम Azure में हैं, हम Azure के लिए प्रतिबद्ध है। इसे गले लगाने।
  2. मुझे यह पसंद नहीं है कि मुझे HTTPS की बजाय HTTP का उपयोग करना होगा। अनुमोदित, यह आंतरिक Azure संचार है, इसलिए यह कोई बड़ा सौदा नहीं है। हालांकि, ब्लॉब स्टोरेज के साथ काम करते समय अधिकांश दस्तावेज एसएसएल/एचटीटीपीएस के उपयोग से सुझाव देते हैं, इसलिए मैं ऐसा करने में सक्षम होना पसंद करूंगा।
  3. मुझे अभी भी प्रयोग में यादृच्छिक टाइमआउट त्रुटियां मिलती हैं।कभी-कभी पाइथन कोड मिलीसेकंड में निष्पादित होगा, अन्य बार यह कई 60 या सेकंड के लिए चलता है और फिर समय समाप्त होता है। यह एक प्रयोग में इसे कई बार निराशाजनक बनाता है। हालांकि, जब वेब सेवा के रूप में प्रकाशित किया गया तो मुझे यह समस्या प्रतीत नहीं होती है।
  4. मैं यह पसंद करूंगा कि मेरे स्थानीय कोड का अनुभव अधिक निकटता से Azure एमएल से मेल खाता है। स्थानीय रूप से, मैं HTTPS का उपयोग कर सकता हूं और कभी भी समय नहीं निकाल सकता। यह तेजी से चमक रहा है, और लिखने में आसान है। लेकिन एक एज़ूर एमएल प्रयोग में जाने का मतलब है कि लगभग हर बार कुछ डीबगिंग।

माइक्रोसॉफ्ट से दान, पीटर और सुदर्शन के सभी बड़े पैमाने पर इस प्रस्ताव को हल करने में उनकी मदद के लिए। मैं इसकी बहुत सराहना करता हूं!

1

आप सही रास्ते पर जा रहे हैं। Execution Python Script मॉड्यूल इस तरह की कस्टम जरूरतों के लिए है। आपका असली मुद्दा यह है कि मौजूदा पायथन स्क्रिप्ट मॉड्यूल कैसे आयात करें। पूरी दिशा यहां मिल सकती है, लेकिन मैं एसओ के लिए सारांशित करूँगा।

आप एज़ूर पायथन एसडीके लेना चाहते हैं और इसे ज़िप, अपलोड, फिर अपने मॉड्यूल में आयात करना चाहते हैं। मैं क्यों इस वहाँ नहीं डिफ़ॉल्ट रूप से है इस पर गौर कर सकते हैं ...

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

कई डेटा वैज्ञानिकों के लिए मौजूदा अजगर स्क्रिप्ट मॉड्यूल

का उपयोग आम तौर-मामला है में मौजूदा पाइथन स्क्रिप्ट शामिल करने के लिए आयात कर रहा है Azure मशीन लर्निंग प्रयोग। एक ही स्क्रिप्ट बॉक्स में सभी कोड को संयोजित करने और चिपकाने के बजाय, निष्पादन पायथन स्क्रिप्ट मॉड्यूल एक तीसरा इनपुट पोर्ट स्वीकार करता है जिसमें पाइथन मॉड्यूल वाले ज़िप फ़ाइल को जोड़ा जा सकता है। फ़ाइल को रनटाइम पर निष्पादन ढांचे द्वारा अनजिप किया जाता है और सामग्री पाइथन दुभाषिया के लाइब्रेरी पथ में जोड़ दी जाती है। Azureml_main एंट्री पॉइंट फ़ंक्शन फिर इन मॉड्यूल को सीधे आयात कर सकता है।

उदाहरण के तौर पर, फ़ाइल हैलो.py को सरल "हैलो, वर्ल्ड" फ़ंक्शन वाला फ़ाइल पर विचार करें।

image6

चित्रा 4. उपयोगकर्ता-परिभाषित कार्य करते हैं।

image7

चित्रा 5. पिन उपयोगकर्ता परिभाषित अजगर कोड युक्त फ़ाइल:

इसके बाद, हम Hello.py वाली फ़ाइल Hello.zip बना सकते हैं।

फिर, इसे एज़ूर मशीन लर्निंग स्टूडियो में डेटासेट के रूप में अपलोड करें। हम तो बना सकते हैं और चलाते हैं एक सरल प्रयोग एक मॉड्यूल का उपयोग करता है:

image8

image9

चित्रा 6. उपयोगकर्ता परिभाषित अजगर एक ज़िप फ़ाइल के रूप में अपलोड कोड के साथ नमूना प्रयोग।

मॉड्यूल आउटपुट से पता चलता है कि ज़िप फ़ाइल को अनपॅक किया गया है और फ़ंक्शन print_hello वास्तव में चलाया गया है। image10 चित्रा 7. निष्पादन पायथन स्क्रिप्ट मॉड्यूल के अंदर उपयोग में उपयोगकर्ता परिभाषित फ़ंक्शन।

+0

दान, मैं प्रतिक्रिया की सराहना करता हूं। यह एक ज़िप फ़ाइल के साथ चीजों को स्थापित करने में एक महान परिचय है, लेकिन यह केवल संकेत देता है कि मूल समस्या को कैसे हल किया जाए, यह प्रभावी रूप से azure.storage.blob आयात करने में सक्षम नहीं है। मैंने जिथब से वास्तविक कोड लिया और इसे लाया ताकि मैं इसका संदर्भ दे सकूं। इसने मुझे सफलतापूर्वक azure.storage.blob का संदर्भ देने की अनुमति दी, हालांकि, यह पर्याप्त नहीं है क्योंकि सभी अनुरोध समय समाप्त हो रहे हैं। मैं इसे अपनी मूल पोस्ट पर एक टिप्पणी में अधिक संबोधित करूंगा। लेकिन मैं वास्तव में धन्यवाद कहना चाहता हूं, दान। यह बहुत उपयोगी है, खासतौर पर बाद वाले प्रश्नों वाले लोगों के लिए। –

+0

मुझे प्रश्न के लिए कोई अपडेट नहीं दिख रहा है ... लेकिन क्या कंटेनर आप ब्लॉब को अपलोड करने की कोशिश कर रहे हैं? आपका कोड कंटेनर नहीं बनाएगा यदि यह पहले से मौजूद नहीं है। 'Blob_service.create_container (' mycontainer ') जोड़ने की आवश्यकता हो सकती है? उम्मीद है कि यह मदद कर सकता है। –

+0

फिर से धन्यवाद, दान। मैंने अब सवाल को अद्यतन किया है, और अधिक स्पष्टता के साथ मुद्दों पर ध्यान दिया है। कंटेनर मौजूद है, और मैं Azure एमएल से कंटेनर भी नहीं बना सकता। मुझे उम्मीद है कि मेरा अपडेट इसे स्पष्ट बनाता है। आपके काम के लिए फिर से धन्यवाद। मुझे एज़ूर पसंद है और मुझे पाइथन पसंद है। मैं वास्तव में अज़ूर पास और सास सेवाओं पर हमें पाइथन में सक्षम होना चाहता हूं! –

1

जैसा कि मुझे पता है, आप एक ज़िप फ़ाइल के माध्यम से अन्य संकुल का उपयोग कर सकते हैं जो आप तीसरे इनपुट को प्रदान करते हैं।Azure एमएल में अजगर टेम्पलेट लिपि में टिप्पणी कहते हैं:

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 पैकेज, डेटासेट क्लिक कर सकते हैं, और उसके बाद स्थानीय फाइल और से चयन ज़िप फ़ाइल अपने कार्यक्षेत्र में ज़िप फ़ाइल अपलोड करने का विकल्प।

संदर्भ के रूप में, आप दस्तावेज़ पर दस्तावेज़ Execute Python Script पर अधिक जानकारी देख सकते हैं।

+0

धन्यवाद, पीटर। मैंने अपनी पोस्ट को उन समस्याओं को शामिल करने के लिए अपडेट किया जब मैं उस सुविधा का उपयोग मनमाने ढंग से पायथन कोड आयात करने के लिए करता हूं। उम्मीद है कि यह स्पष्ट बनाता है। एक बात जो मैं सवाल करता हूं, यही कारण है कि माइक्रोसॉफ्ट में डिफ़ॉल्ट वितरण के हिस्से के रूप में केवल Azure Python संकुल शामिल नहीं हैं? अजीब लगता है। कुछ हद तक विडंबना यह है कि माइक्रोसॉफ्ट द्वारा निर्मित एज़ुरेल पायथन पैकेज को एज़ूर एमएल प्रयोगों में शामिल नहीं किया गया है ... :- डी अज़ूर एमएल एज़ुरेल पैकेज को तीसरे पक्ष के पैकेज के रूप में मानता है! –

+0

पायथन मॉड्यूल से नेटवर्क का उपयोग नया है, यही कारण है कि इसे पहले शामिल नहीं किया गया था ... मैं इसे अंदर लाने की कोशिश कर रहा हूं :-) –

+0

दान, मैं आसानी से नेटवर्क से बाहर पहुंच सकता हूं। वास्तव में, मैं अन्य यूआरएल तक पहुंचने के लिए 'अनुरोध' का उपयोग कर सकता हूं। यह केवल एज़ूर स्टोरेज खातों (और शायद अन्य एज़ूर संसाधन) तक पहुंच है जो अवरुद्ध प्रतीत होता है। लेकिन मैं मानता हूं कि यह दृढ़ता से नेटवर्क मुद्दे की तरह दिखता है। एक अभ्यास के रूप में, मुझे लगता है कि 'एज़ूर-स्टोरेज', और अन्य एज़ूर-विशिष्ट पैकेज, डिफ़ॉल्ट रूप से माइक्रोसॉफ्ट द्वारा लोड किए जाने चाहिए। आप आसानी से उपयोग के लिए सैकड़ों अन्य तृतीय पक्ष पैकेज लोड करते हैं, क्यों नहीं अपना? –

संबंधित मुद्दे