In unserer Azure PowerShell Serie knüpfen wir uns die etwas ausgefallenere Erstellung eines HDInsight-Clusters vor.

Im Azure Management Portal hieße das konkret folgendermaßen:

Custom Create HDInsight

In dem untenstehenden PowerShell-Skript passieren noch viele weitere Sachen:

  1. Hive/Oozie Metastore
    Hierfür wird im Skript selber ein Azure SQL Server und eine Datenbank erstellt. Analog in dem Azure Portal sieht es so aus:
    Custom Create HDInsight - Hive/Oozie Metastore
  2. Ein weiteres Speicherkonto anhängen
    Beim Erstellen eines HDInsight-Clusters wird immer ein dediziertes Speicherkonto hergenommen. Dabei kann man noch weitere Speicherkonten anhängen:Custom Create HDInsight - Additional Storage

Der Skript ist dazu angedacht, die Parameter in den Abschnitten 0. Azure Account Details und 1. Input Information selber zu vervollständigen.

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142

###################################################
# Create custom HDInsight Cluster: Custom Create

# ISE is just awesome

ise

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


Add-AzureAccount
$subName = "<AzureSbscriptionName>"
Select-AzureSubscription $subName

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


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

# variables to HDInsight cluster

$clusterName = "<HDInsightClusterName>"
$location = "<DatacenterLocation>" #e.g. North Europe, West Europe, etc.
$numNodes = 1 #start small
$clusterCreds = Get-Credential -Message "New admin account to be created for your HDInsight cluster" 
#this prompts you

# variables to storage accounts

$storageAccount1 = "<StorageAccountName1>"
$defaultContainer = "<StorageContainerName>"
$storageAccount2 = "<StorageAccountName2>"

# admin credentials to Azure SQL Server
$metastoreAzureSQLDBName = "<AzureSQLDatabaseName>"
$sqlAdminLogin = "<SQLServerLogin>"
$sqlAdminPasswd = "<SQLServerPassword>"



###################################################
# 2. Create storage accounts

# Create first storage account without geo-replication and create default container

New-AzureStorageAccount -StorageAccountName $storageAccount1 -Location $location
Set-AzureStorageAccount -StorageAccountName $storageAccount1
 `
   
-GeoReplicationEnabled 
$false
$fullStorage1
 = "$storageAccount1.blob.core.windows.net" #full storage account name
$storageKey1 = Get-AzureStorageKey $storageAccount1 | %{ $_.Primary } 
$storageContext1 = New-AzureStorageContext -StorageAccountName $storageAccount1
 `
   
-StorageAccountKey $storageKey1

New-AzureStorageContainer -Name $defaultContainer -Context $storageContext1
New-AzureStorageContainer "hivelibs" -Context $storageContext1

# Create second storage account
New-AzureStorageAccount -StorageAccountName $storageAccount2 -Location $location
Set-AzureStorageAccount -StorageAccountName $storageAccount2
 `
   
-GeoReplicationEnabled 
$false
$fullStorage2
 = "$storageAccount2.blob.core.windows.net" 
$storageKey2 = Get-AzureStorageKey $StorageAcct2 | %{ $_.Primary }
$storageContext2 = New-AzureStorageContext -StorageAccountName $storageAccount2
 `
   
-StorageAccountKey $storageKey2



###################################################
# 3. Create Azure SQL Database and Server


$sqlServer = New-AzureSqlDatabaseServer -AdministratorLogin $sqlAdminLogin
 `
 
-AdministratorLoginPassword $sqlAdminPasswd -Location $location

# Configure Firewall: allow all IP addresses, and allow all windows Azure services
New-AzureSqlDatabaseServerFirewallRule -ServerName $sqlServer.
ServerName `
   
-RuleName "allowall" -StartIpAddress 1.1.1.1 -EndIpAddress 255.255.255.255
New-AzureSqlDatabaseServerFirewallRule -ServerName $sqlServer.
ServerName `
   
-RuleName "allowallazureservices" -StartIpAddress 0.0.0.0 -EndIpAddress 0.0.0.0

# Azure SQL Database
$sqlServerCreds = New-Object System.Management.Automation.PSCredential($sqlAdminLogin,($sqlAdminPasswd
 `
   
| ConvertTo-SecureString -AsPlainText -Force))
$sqlContext = New-AzureSqlDatabaseServerContext -ServerName $sqlServer.
ServerName `
   
-Credential 
$sqlServerCreds

$MetastoreAzureSQLDBName
 = $sqlDB
New-AzureSqlDatabase -DatabaseName $sqlDB -ConnectionContext 
$sqlContext
$metastoreAzureServerName
 = "$($sqlServer.ServerName).database.windows.net" 
$metastoreCreds = Get-Credential -Message "existing id/password for your SQL Azure DB (metastore)" 
#This prompts for the existing id and password of your existing SQL Azure DB



###################################################
# 4. Hive Configuration

# This value is set for you, don't change!

$configvalues = new-object 'Microsoft.WindowsAzure.Management.HDInsight.Cmdlet.DataObjects.AzureHDInsightHiveConfiguration'
$configvalues.Configuration = @{ “hive.exec.compress.output”=”true” } 
#this is an example of a config value you may pass in

# Add a config file value
# Add AVRO SerDe libraries for Hive (on storage 1)

$configvalues.AdditionalLibraries = new-object 'Microsoft.WindowsAzure.Management.HDInsight.Cmdlet.DataObjects.AzureHDInsightDefaultStorageAccount' 
$configvalues.AdditionalLibraries.StorageAccountName = 
$fullStorage1
$configvalues
.AdditionalLibraries.StorageAccountKey = 
$storageKey1
$configvalues
.AdditionalLibraries.StorageContainerName = "hivelibs" 
#container called hivelibs must exist on specified storage account


###################################################
# 5. Create custom HDInsight Cluster


New-AzureHDInsightClusterConfig -ClusterSizeInNodes $numNodes
 `
   
| Set-AzureHDInsightDefaultStorage -StorageAccountName $fullStorage1
 `
       
-StorageAccountKey $storageKey1 -StorageContainerName $defaultContainer
 `
   
| Add-AzureHDInsightStorage -StorageAccountName $fullStorage2 -StorageAccountKey $storageKey2
 `
   
| Add-AzureHDInsightMetastore -SqlAzureServerName $metastoreAzureServerName
 `
       
-DatabaseName $metastoreAzureSQLDBName -Credential $metastoreCreds -MetastoreType OozieMetastore
 `
   
| Add-AzureHDInsightMetastore -SqlAzureServerName $metastoreAzureServerName
 `
       
-DatabaseName $metastoreAzureSQLDBName -Credential $metastoreCreds -MetastoreType HiveMetastore
 `
   
| Add-AzureHDInsightConfigValues -Hive $configvalues
 `
   
| New-AzureHDInsightCluster -Subscription $subID -Location $location
 `
       
-Name $clusterName -Credential $clusterCreds


###################################################
# 6. get status, properties, etc.


Get-AzureHDInsightProperties -Subscription $subID
Get-AzureHDInsightCluster -Subscription $subID
Get-AzureHDInsightCluster -Subscription $subID -Name $clusterName


###################################################
# 7. Clean up: HDInsight cluster, SQL Server & Database, storage accounts

# Remove HDInsight cluster

Remove-AzureHDInsightCluster -Name $ClusterName 
#-Subscription $SubName

# Remove storage accounts

Remove-AzureStorageAccount $storageAccount1
Remove-AzureStorageAccount $storageAccount2

# Remove SQL server
Remove-AzureSqlDatabaseServer -ServerName $sqlServer.ServerName