Willkommen im nächsten Beitrag aus der Azure PowerShell Serie!

Wenn man mit HDInsight oder Hadoop arbeitet, eignet sich gerade für SQL-Datenbankler die Sprache HiveQL sehr gut. Mit HiveQL muss man sich nicht extra den Kopf wegen MapReduce-Jobs zerbrechen, sondern kann stattdessen mit einer SQL-ähnlichen Sprache Skripte erstellen, die automatisch in MapReduce-Jobs übersetzt werden.

Bei diesem PowerShell-Skript wird vorausgesetzt, dass man HiveQL-Skripte bereits lokal erstellt hat – dafür eignet sich Notepad++ immer ganz gut. Diese muss man dann zuerst im Azure Blob Storage hochladen, um diese von einem HDInsight-Cluster aus auszuführen. Hierbei sind wohl die wichtigsten PowerShell-Commands die folgenden:

001
002

Use-AzureHDInsightCluster $clusterName
Invoke-Hive -File $hqlScriptFile

Im PowerShell-Skript ist auch zu sehen, dass nur kurz vor der Ausführung der HiveQL-Skripte ein HDInsight-Cluster erstellt wird. Stand heute kann ich nur empfehlen, euren HDInsight-Cluster sofort zu löschen, sobald ihr keine Rechnungen darauf ausführt, um Kosten zu sparen. Die Daten werden dabei nicht gelöscht, was super ist, da sie ja sowieso auf dem Blob Storage weiter währen.

Wie immer sollte man die Parameter Abschnitten “0. Azure Account Details” und “1. Input Information” selber mit den entsprechenden Information füllen.

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101

#############################################
# Run HiveQL Scripts in HDInsight-Cluster


#############################################
# 0. Azure Account Details

Add-AzureAccount
$subName = "Internal Consumption"
Select-AzureSubscription -SubscriptionName $subName

# Azure account details automatically set
$subID = Get-AzureSubscription -Current | %{ $_.SubscriptionId } 


##################################################################
# 1. Input information


$clusterName = "<HDInsightClusterName>"
$location = "<DatacenterLocation>" #e.g. North Europe, West Europe, etc.
$numNodes = 1 #start small
$storageAccount = "<StorageAccountName>"
$defaultContainer = "<StorageContainerName>"

# Variables automatically set for you
$storageKey = Get-AzureStorageKey $storageAccount | %{ $_.Primary } 
$storageContext = New-AzureStorageContext -StorageAccountName $storageAccount
 `
   
-StorageAccountKey 
$storageKey
$fullStorage
 = "${storageAccount}.blob.core.windows.net"


# local HiveQL scripts
$localFileNames = "<scriptFileName1>", "<scriptFileName2>"
$localFolder = "C:\<scriptFilesPath>"
$blobFolder = "scripts"


##################################################################
# 2. Upload HiveQL scripts from local to Azure Blob Storage


foreach ($item in $localFileNames
){
   
$hqlLocalFile = "$localFolder\$item.hql"
    $hqlBlobName = "$blobFolder/$item.hql"

    Write-Host "Copying $hqlLocalFile to $hqlBlobName" -BackgroundColor Green

    # Copy the file from local workstation to WASB
    Set-AzureStorageBlobContent -File $hqlLocalFile -Container $defaultContainer
 `
       
-Blob $hqlBlobName -Context $storageContext
}



##################################################################
# 3. Create HDInsight Cluster


$clusterCreds = Get-Credential
 `
   
-Message "New admin account to be created for your HDInsight cluster"

# Simple create
New-AzureHDInsightCluster -Name $clusterName -Subscription $subID
 `
   
-Location $location -DefaultStorageAccountName $storageAccount
 `
   
-DefaultStorageAccountKey $storageKey -DefaultStorageContainerName $defaultContainer
 `
   
-Credential $clusterCreds -ClusterSizeInNodes $numNodes



##################################################################
# 4. Execute HiveQL scripts


foreach ($item in $localFileNames
){

   
# set script
    $hqlScriptFile = "wasb://$defaultContainer@$storageAccount.blob.core.windows.net/$blobFolder/$item.hql"

    Write-Host "Invoking HiveQL script $item" -BackgroundColor Green

    Use-AzureHDInsightCluster $clusterName

    # execute HiveQL script
    Invoke-Hive -File $hqlScriptFile
}



##################################################################
# 5. OPTIONAL: Clean up

# Remove HDInsight cluster

Remove-AzureHDInsightCluster -Name $clusterName

# OPTIONAL: remove scripts
foreach ($item in $localFileNames
){
   
$hqlLocalFile = "$localFolder\$item.hql"
    $hqlBlobName = "$blobFolder/$item.hql"

    Write-Host "Removing $hqlBlobName" -BackgroundColor Green

    # Remove the file from WASB
    Remove-AzureStorageBlob -Blob $hqlBlobName
 `
       
-Container $defaultContainer -Context $storageContext
}