前往
大廳
主題

AI跨領域數據科學 課程紀錄 d33 Azure雲端平台實務 (3) 儲存服務

傳說中的巴哈魔法師~ | 2022-04-27 09:42:24 | 巴幣 0 | 人氣 200

今天
1.使用 MQTTBox虛擬設備 Device Explorer虛擬橋接器(閘道器) 與Azure IoT hub功能 擬作雲端物聯網
2.使用Azure Blob存取非結構化資料 Python讀取實作
3.使用SQL Server 將 Azure SQL Database 納入管理 Python讀取實作



1.擬作雲端物聯網

事前安裝:
MQTTBox虛擬設備
Device Explorer虛擬橋接器(閘道器)

開啟Azure網站 > 建立資源
這部分會使用
資源群組 IoT中樞 儲存體帳戶 串流分析作業

-
資源群組>建立

IoT中樞>建立
選擇剛建立的資源群組
選擇一個所在地區 (避免出問題 這邊地區皆選美中)
想當個免費仔所以選免費層
IoT中樞>共用存取原則
iothubowner(全部權限)
取得 "共同存取金鑰" 與 "連接字串Connection String"
這邊看一下複製下來的"連接字串Connection String"
HostName=chiahsin-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=F2VyVOYo+wzA5RE2wuzpBKodOUMGsYEli3fk1WLBFRM=
可以看到分成主機名稱跟金鑰兩部分

-
開啟軟體: Device Explorer Twin虛擬橋接器(閘道器)

Configuration>Connection Information IoT Hub Connection String
將剛剛的 "連接字串Connection String" 放入
Update
Management>Actions
Create 新增設備
Configuration>Shared Access Signature
Generate SAS 生成SAS權杖
可以看到Azure上
IoT中樞>裝置
已經連接了設備"chiahsin-device"

-
開啟軟體: MQTTBox虛擬設備

Create MQTT Client
MQTT Client Name、MQTT Client Id : 剛剛的設備名稱
Protocol : mqtts/tls
Username  : 剛剛連接字串中的網址(主機名稱)+設備名稱
Host : 剛剛連接字串中的網址+8883 (Azure使用的埠號)
Password : 剛剛的SAS權杖
Append timestamp to MQTT client id -> no 不更改id
可以看到彼此已經成功連接

-
回到軟體: Device Explorer Twin虛擬橋接器(閘道器)

Data>Monitoring
開啟Monitor 啟用監控IoT中樞

-
回到軟體: MQTTBox虛擬設備

Topic to publish : devices/ chiahsin-device(設備名稱) /messages/events/info
Qos : 0(只送一次) 1(至少送一次) 2(送到他回) 這邊填1
Payload : 輸入JSON格式測試
{
"temperture":"30",
"humidity":"60"
}

Publish後 可以看到 Device Explorer Twin虛擬橋接器(閘道器) 上顯示收到的訊息
也可以看到Azure上
IoT中樞>概觀
IoT 中樞使用量有了變化

-
但是雲這邊收到訊息 僅只是收到 並沒有額外去做甚麼事情
-> 實作 將收到的資料保存

因為是 非結構化資料
使用Azure Blob存取 (類似AWS的S3)

儲存體帳戶>建立
儲存體帳戶>容器>建立
因為我之後要使用Python存取網址資料 這邊設定容器公開
這邊直接在容器中存放一張圖片
可以看到圖片已經存放在網址上

有了儲存空間 接下來就是要把資料導進來了

串流分析作業>建立
串流分析作業>輸入 新增IoT中樞
串流分析作業>輸出 新增Blob 選擇容器 路徑模式自行設定語法 log/{date}/{time}

串流分析作業>概觀
查詢 編輯查詢
串流分析作業>概觀
開始執行串流作業

串流成功後 直接使用MQTTBox虛擬設備 模擬發送多個訊息
可以看到容器中 依照指定的路徑格式 存放了該訊息
公開網址下載下來 可使用Python做後續處理



2.Python存取Azure Blob非結構化資料
環境使用Jupyter Notebook或Sypder 你爽就好

使用網址顯示剛剛上傳的圖片:

import requests as req
from PIL import Image
from io import BytesIO

img_src = "https://chiahsinblob.blob.core.windows.net/storage/unnamed.jpg"
response = req.get(img_src)
image = Image.open(BytesIO(response.content))
image.show()

使用儲存體金鑰存取blob內容:

儲存體帳戶>存取金鑰
取得 "機碼" 與 "連接字串"

pip install azure-storage-blob  

檢查azure-storage-blob版本  

import os, uuid
from azure.storage.blob import BlobServiceClient, BlobClient,ContainerClient, __version__
print(__version__ )

12.11.0

cmd打setx AZURE_STORAGE_CONNECTION_STRING "複製的連接字串"  
設定環境變數AZURE_STORAGE_CONNECTION_STRING  

新建blob

#載入連接字串
connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
#利用連接字串建立Blob Client物件
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
#用唯一識別碼當container名稱避免重複
container_name = str(uuid.uuid4())
#建立Container
container_client = blob_service_client.create_container(container_name)


建立一個內容為Hello, World!的txt檔  
上傳檔案到指定blob  
Container填入新建出來的blob名稱

#載入連接字串
connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
#利用連接字串建立Blob Client物件
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
#列出雲端上面的Container清單
containers_list = blob_service_client.list_containers()
for containers in containers_list:
    print("\t" + containers.name)

#指定Container
container_name = '1fbd3474-fa38-4b6b-821d-89b4e52c9edd'
#設定檔案存放位置
local_path = "./data"

#建立一個文字檔案
local_file_name = str(uuid.uuid4()) + ".txt"
upload_file_path = os.path.join(local_path, local_file_name)
#編輯文字檔案內文
file = open(upload_file_path, 'w')
file.write("Hello, World!")
file.close()
#將data資料夾中的檔案全部上傳Container
blob_client = blob_service_client.get_blob_client(container=container_name,
blob=local_file_name)
print("\n正將檔案上傳到容器:\n\t" + local_file_name)
with open(upload_file_path, "rb") as data:
    blob_client.upload_blob(data)

下載下來可以看到確實上傳了一個內容為Hello, World!的txt檔

下載指定blob中的指定檔案  
更名以避免同名問題  
file_name填入剛剛檔案的檔名

#載入連接字串
connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
#利用連接字串建立Blob Client物件
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
#列出雲端上面的Container清單
containers_list = blob_service_client.list_containers()
for containers in containers_list:
    print("\t" + containers.name)
#指定Container

container_name = '1fbd3474-fa38-4b6b-821d-89b4e52c9edd'

#設定檔案存放位置
local_path = './data'
#將指定檔案下載至data資料夾中,並重新命名
file_name = '73a247af-d79e-4fea-a239-128765136941.txt'
blob_client = blob_service_client.get_blob_client(container=container_name, blob=file_name)
download_file_path = os.path.join(local_path,
str.replace(file_name ,'.txt' , '_DOWNLOAD.txt'))
print("\nDownloading blob to \n\t" + download_file_path)
with open(download_file_path, "wb") as download_file:
    download_file.write(blob_client.download_blob().readall())

成功下載 (我已經事先把上一步創建的檔案刪除 不然其實這邊要有兩個檔案)

刪除指定blob

#載入連接字串
connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
#利用連接字串建立Blob Client物件
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
#指定Container
container_name = '1fbd3474-fa38-4b6b-821d-89b4e52c9edd'
container_client = blob_service_client.get_container_client(container_name)
#刪除Container
print("正在刪除容器")
container_client.delete_container()

已刪除

沒有要繼續付錢就一樣把資料群組給刪了
MQTTBox虛擬設備
Device Explorer虛擬橋接器(閘道器)
也可以關了



3.使用SQL Server 將 Azure SQL Database 納入管理
Python存取Azure SQL Database結構化資料 (雲端資料庫)

事前安裝:
SQL 2019 Server 資料庫
SSMS 2019 資料庫管理系統

開啟Azure網站 > 建立資源
這部分會使用
資源群組 SQL資料庫

資源群組>建立

SQL資料庫>建立
選擇剛建立的資源群組
選擇一個所在地區 (避免出問題 這邊地區皆選美中)
新建伺服器
設定資料庫
使用基本
建立雲端資料庫

-
開啟 SSMS 2019 資料庫管理系統

開啟本機資料庫

如果你 SQL Server 2019 使用基本安裝 會沒有sa帳號
那登入時就先選用Windows驗證
驗證後
右鍵伺服器>屬性
安全性>伺服器驗證
使用 SQL Server 及 Windows驗證模式
點選新增查詢
加入sa帳號以及密碼
執行
可以看到成功新增sa帳號
右鍵伺服器>重新啟動
重新使用sa帳號登入

同樣也可以使用SQL Server 將 剛剛建立的Azure SQL Database 納入管理

先到SQL Database>概觀 查看伺服器名稱
開啟連線
輸入雲端資料庫的伺服器名稱 以及帳號密碼
登入Azure帳號 設定防火牆

-
開啟北風資料庫SQL檔案
選擇sql (剛剛建立的雲端資料庫名稱)
cf. master是本機端
執行 在雲端伺服器中建立北風資料庫
可以在資料表中看到建立成功 (部分資料新增錯誤)
SQL Database>查詢編輯器
登入後可以看到資料已經建立成功
可以直接輸入指令查詢資料

-
本機建立空白資料庫
本機伺服器>資料庫>右鍵新增資料庫

-
匯出資料

雲端伺服器>之前建立的sql資料庫>右鍵 工作 匯出資料
設定來源資料
設定目的地
選擇一個或多個要複製的資料表和檢視
立刻執行

可以看到剛剛在本機新增的資料表已經導入了雲端資料庫中的北風資料

-
剛剛使用SQL Server讀取雲端資料庫
也可以使用Python讀取雲端資料庫

server填入伺服器名稱
database填入SQL Database名稱
username password

import pyodbc
server = 'chiahsin-server.database.windows.net'
database = 'sql'
username = 'chiahsin'
password = '{你的密碼}'
driver= '{ODBC Driver 17 for SQL Server}'
with pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+password) as conn:
    with conn.cursor() as cursor:
        cursor.execute("select top 50 * from [Order Details]")
        row = cursor.fetchone()
        while row:
            print (str(row[0]) + " " + str(row[1]))
            row = cursor.fetchone()

10248 11
10248 42
10248 72
10249 14
10249 51
10250 41
10250 51
10250 65
10251 22
10251 57
10251 65
10252 20
10252 33
10252 60
10253 31
10253 39
10253 49
10254 24
10254 55
10254 74
10255 2
10255 16
10255 36
10255 59
10256 53
10256 77
10257 27
10257 39
10257 77
10258 2
10258 5
10258 32
10259 21
10259 37
10260 41
10260 57
10260 62
10260 70
10261 21
10261 35
10262 5
10262 7
10262 56
10263 16
10263 24
10263 30
10263 74
10264 2
10264 41
10265 17

老樣子
沒有要繼續付錢就一樣把資料群組給刪了

創作回應

傳說中的巴哈魔法師~
SQL的東西還沒打完 下一篇是雲端機器學習與雲端電腦視覺
2022-04-27 12:03:54

更多創作