HDInsight PowerShell

 
HappyNewYear2014

Voici un article que je souhaitai rédiger depuis pas mal de temps ! Je prends donc le temps de le faire avant de commencer les festivités de ce soir et finir l’année 2013 en toute beauté 🙂

Dans cet article je vais mettre en évidence le fait qu’avec HDInsight la Big Data est à portée de toutes les bourses ! En effet je vais créer un script PowerShell permettant d’initialiser un cluster de N nœuds, ajouter des UDF’s HiveQL, exécuter un certain nombre de traitements, d’agrégations, stocker les résultats dans une table Hive externe, supprimer le cluster et prouver que le résultat des Job Map Reduce est toujours accessible dans Windows Azure Blob Storage !

 

PowerShell

powershell-logo

Windows PowerShell, anciennement Microsoft Command Shell (MSH), nom de code Monad, est une interface en ligne de commande et un langage de script développé par Microsoft.

Windows Azure PowerShell peut être utilisé pour contrôler et automatiser le déploiement et la gestion de vos charges de travail dans Windows Azure. Avant de pouvoir commencer à utiliser les commandes Azure PowerShell, vous devez télécharger et installer le module, puis vous connecter à votre abonnement Windows Azure.

Pour télécharger le module : Windows Azure PowerShell

Pour vous connecter à votre abonnement Azure : Connect to your subscription

La dernière version de PowerShell est la Version 4.0 intégrée dans Windows 8.1 et Windows Server 2012 R2, voici les nouveautés : TechNet.

 
PowerShell ISE :

Windows PowerShell ISE est un environnement d’écriture de scripts intégrés (ISE) permettant d’exécuter des scripts PowerShell. Vous pouvez ainsi tester et déboguer des scripts via une interface utilisateur graphique offrant les fonctionnalités suivantes : édition multi ligne, saisie automatique par tabulation, coloration de syntaxe, exécution sélective, aide contextuelle…

PowerShell_HDInsight

-> Après l’avoir essayé, vous l’adopterez !

 
Astuces :
Pour connaitre votre version de PowerShell:

$PSVersionTable

Pour activer le mode débug :

$DebugPreference ='Continue'

Pour désactiver le mode débug :

$DebugPreference ='Silentlycontinue'

Pour choisir votre abonnement Azure (si vous en avez plusieurs) :

Select-AzureSubscription –SubscriptionName "Ma Souscription"

Se connecter à un cluster HDInsight :

Use-AzureHDInsightCluster MonCluster (Get-AzureSubscription -Current).SubscriptionId

 

Création d’un Cluster HDInsight et chargement d’UDF’s

La commande New-AzureHDInsightClusterConfig permet d’initialiser la configuration d’un cluster HDInsight.

La commande Add-AzureHDInsightConfigValues permet entre autres d’ajouter une bibliothèque partagée d’UDF’s.

Select-AzureSubscription –SubscriptionName "MonAbonnementAzure"
$DebugPreference ='Continue'
$configvalues = new-object 'Microsoft.WindowsAzure.Management.HDInsight.Cmdlet.DataObjects.AzureHDInsightHiveConfiguration'
$mySubName = "MonAbonnementAzure"
$myStoreAcct = "MonStockageAzure"
$blobstorage = "MonStockageAzure.blob.core.windows.net"
$containerdefault = "MonStockageAzure"
$clustername = "MonCluster"
$location = "North Europe"
$numbernodes = 6
$username = "MonLogin"
$password = ConvertTo-SecureString "MonMotDePasse" -AsPlainText -Force
$clusterCredentials = New-Object System.Management.Automation.PSCredential ($username, $password)
$subid = Get-AzureSubscription $mySubName | %{ $_.SubscriptionId }
$cert = Get-AzureSubscription $mySubName | %{ $_.Certificate }
$key1 = Get-AzureStorageKey $myStoreAcct | %{ $_.Primary }
$configvalues.AdditionalLibraries = new-object 'Microsoft.WindowsAzure.Management.HDInsight.Cmdlet.DataObjects.AzureHDInsightDefaultStorageAccount'
$configvalues.AdditionalLibraries.StorageAccountName = $blobstorage
$configvalues.AdditionalLibraries.StorageAccountKey = $Key1
$configvalues.AdditionalLibraries.StorageContainerName = "MonCountainerUDF"
Write-Host "Creating '$numbernodes' Node Cluster named: $clustername" -f yellow
New-AzureHDInsightClusterConfig -ClusterSizeInNodes $numbernodes `
    | Set-AzureHDInsightDefaultStorage -StorageAccountName $blobstorage -StorageAccountKey $Key1 -StorageContainerName $containerdefault `
    | Add-AzureHDInsightConfigValues -Hive $configvalues `
    | New-AzureHDInsightCluster -Subscription $SubID -Location $Location -Name $ClusterName -Credential $clusterCredentials

 

Exécution de script HiveQL

La commande New-AzureHDInsightHiveJobDefinition définit un job HiveQL.

La commande Get-AzureHDInsightJobOutput retourne la sortie du journal pour un Job à partir du compte de stockage associé au cluster.

Write-Host "Executing HiveQL Jobs" -f yellow
Use-AzureHDInsightCluster hadooprcatest (Get-AzureSubscription -Current).SubscriptionId
$clustername = "MonCluster"
$clusterSubscriptionId = (Get-AzureSubscription -Current).SubscriptionId
$clusterAdmin = 'MonLogin'
$clusterPassword = 'MonMotDePasse'
$passwd = ConvertTo-SecureString $clusterPassword -AsPlainText -Force
$clusterCredentials = New-Object System.Management.Automation.PSCredential ($clusterAdmin, $passwd)
$ScriptFolder = "wasb://MonContainer@MonStorage.blob.core.windows.net/MonScript.hql" 
$hiveJobVT = New-AzureHDInsightHiveJobDefinition -JobName "MyJobHQL" -File $ScriptFolder
$startedHiveJobVT03 = $hiveJobVT | Start-AzureHDInsightJob -Credential $clusterCredentials -Cluster $clusterName
$startedHiveJobVT03 | Wait-AzureHDInsightJob -Credential $clusterCredentials
Get-AzureHDInsightJobOutput -StandardError -StandardOutput -JobId $startedHiveJobVT03.JobId -TaskSummary -Subscription $clusterSubscriptionId -Cluster $clusterName

Dans mon script Hive je n’ai pas à rajouter la commande Hive « ADD jar C:\…\MaFonction.jar; »

Voici le code mon script HiveQL :

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

set mapred.tasktracker.expiry.interval=14400000;
set mapred.task.timeout=14400000;

CREATE TEMPORARY FUNCTION MaFonction AS 'com.###.hive.udf.MaFonction';

[HIVE QUERY]

CREATE EXTERNAL TABLE IF NOT EXISTS MaTable ( [...] ) 
ROW FORMAT DELIMITED FIELDS TERMINATED by ',' lines terminated by '\n' stored as textfile location '/MonDossier/MaTable';
INSERT OVERWRITE TABLE MaTable SELECT * FROM MaTable0;

 

Suppression du cluster

La commande Remove-AzureHDInsightCluster supprime le cluster HDInsight de votre abonnement.

$mySubName = "MonAbonnementAzure"
$clustername = "MonCluster"
Write-Host "Deleting Cluster : '$clustername'" -f yellow
Remove-AzureHDInsightCluster -Name $ClusterName -Subscription $mySubName

 

Récupération des données

Mes données sont belles et bien accessibles même après la suppression de mon cluster HDInsight (voir Hive External Table) :

HDInsight_PowerQuery

 

Script PowerShell complet

Le script est à renommer en .ps1 : HDInsight_CreateWithUDF.ps1

Murshed Zaman Senior Program Manager chez Microsoft a créé un script PowerShell pour automatiser la création d’un cluster HDInsight : http://murshedsqlcat.wordpress.com/2013/11/25/automating-hdinsight-cluster-creation-with-powershell/.

Automatisation via un Package SSIS :

 
SSIS_HDINSIGHT_POWERSHELL

 

Je vous souhaite une excellente fin d’années 2013 et une excellente année 2014 !

 

Comments are closed.