Skip to content

Commit d20e5ac

Browse files
author
Zhenyu Zhou
committed
Support Custom Ambari DB as metastore
1 parent d08ff19 commit d20e5ac

File tree

13 files changed

+3098
-15
lines changed

13 files changed

+3098
-15
lines changed

src/HDInsight/HDInsight.Test/ScenarioTests/HDInsightClusterTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,12 @@ public void TestCreateClusterWithRelayOutoundAndPrivateLink()
8484
{
8585
TestController.NewInstance.RunPowerShellTest(_logger, "Test-CreateClusterWithRelayOutoundAndPrivateLink");
8686
}
87+
88+
[Fact]
89+
[Trait(Category.AcceptanceType, Category.CheckIn)]
90+
public void TestCreateClusterWithCustomAmbariDatabase()
91+
{
92+
TestController.NewInstance.RunPowerShellTest(_logger, "Test-CreateClusterWithCustomAmbariDatabase");
93+
}
8794
}
8895
}

src/HDInsight/HDInsight.Test/ScenarioTests/HDInsightClusterTests.ps1

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,3 +313,44 @@ function Test-CreateClusterWithRelayOutoundAndPrivateLink{
313313
Remove-AzResourceGroup -ResourceGroupName $cluster.ResourceGroup
314314
}
315315
}
316+
317+
<#
318+
.SYNOPSIS
319+
Test Create Azure HDInsight Cluster with custom ambari database
320+
#>
321+
322+
function Test-CreateClusterWithCustomAmbariDatabase{
323+
324+
# Create some resources that will be used throughout test
325+
try
326+
{
327+
# prepare parameter for creating parameter
328+
$params= Prepare-ClusterCreateParameter -location "South Central US"
329+
330+
# prepare custom ambari database
331+
$databaseUserName="databaseuser"
332+
$databasePassword="xxxxxxx"
333+
$databasePassword=ConvertTo-SecureString $databasePassword -AsPlainText -Force
334+
$sqlserverCredential=New-Object System.Management.Automation.PSCredential($databaseUserName, $databasePassword)
335+
$sqlserver="yoursqlserver.database.windows.net"
336+
$database="yourdatabase"
337+
$config=New-AzHDInsightClusterConfig
338+
339+
# create cluster
340+
$cluster = New-AzHDInsightCluster -Location $params.location -ResourceGroupName $params.resourceGroupName `
341+
-ClusterName $params.clusterName -ClusterSizeInNodes $params.clusterSizeInNodes -ClusterType $params.clusterType `
342+
-StorageAccountResourceId $params.storageAccountResourceId -StorageAccountKey $params.storageAccountKey `
343+
-HttpCredential $params.httpCredential -SshCredential $params.sshCredential `
344+
-MinSupportedTlsVersion $params.minSupportedTlsVersion `
345+
-AmbariDatabase $config.AmbariDatabase
346+
347+
Assert-NotNull $cluster
348+
349+
}
350+
finally
351+
{
352+
# Delete cluster and resource group
353+
Remove-AzHDInsightCluster -ClusterName $cluster.Name
354+
Remove-AzResourceGroup -ResourceGroupName $cluster.ResourceGroup
355+
}
356+
}

src/HDInsight/HDInsight.Test/SessionRecords/Commands.HDInsight.Test.ScenarioTests.HDInsightClusterTests/TestCreateClusterWithCustomAmbariDatabase.json

Lines changed: 2815 additions & 0 deletions
Large diffs are not rendered by default.

src/HDInsight/HDInsight/ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
## Upcoming Release
2121

2222
* Add parameters `ResourceProviderConnection` and `PrivateLink` to cmdlet `New-AzHDInsightCluster` to support relay outbound and private link feature
23+
* Add parameter `AmbariDatabase` to cmdlet `New-AzHDInsightCluster` to support custom Ambari database feature
24+
* Add accept value "AmbariDatabase" to the parameter `MetastoreType` of the cmdlet `Add-AzHDInsightMetastore`
2325

2426
## Version 4.0.0
2527
* For New-AzHDInsightCluster cmdlet:

src/HDInsight/HDInsight/ClusterCreateHelper.cs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
// limitations under the License.
1212
// ----------------------------------------------------------------------------------
1313

14-
using Microsoft.Azure.Commands.HDInsight.Models.Management;
1514
using Microsoft.Azure.Management.HDInsight.Models;
1615
using Microsoft.WindowsAzure.Commands.Common;
1716
using System;
@@ -25,7 +24,7 @@ public static class ClusterCreateHelper
2524
{
2625
public static void AddClusterCredentialToGatewayConfig(PSCredential httpCredential, IDictionary<string, Dictionary<string, string>> configurations)
2726
{
28-
Dictionary<string, string> gatewayConfig = GetExistingConfigurationsForType(configurations, ConfigurationKey.Gateway);
27+
Dictionary<string, string> gatewayConfig = GetExistingConfigurationsForType(configurations, Constants.ConfigurationKey.Gateway);
2928
if (!string.IsNullOrEmpty(httpCredential?.UserName))
3029
{
3130
gatewayConfig[Constants.GatewayConfigurations.CredentialIsEnabledKey] = "true";
@@ -37,7 +36,7 @@ public static void AddClusterCredentialToGatewayConfig(PSCredential httpCredenti
3736
gatewayConfig[Constants.GatewayConfigurations.CredentialIsEnabledKey] = "false";
3837
}
3938

40-
configurations[ConfigurationKey.Gateway] = gatewayConfig;
39+
configurations[Constants.ConfigurationKey.Gateway] = gatewayConfig;
4140
}
4241

4342
public static void AddAzureDataLakeStorageGen1ToCoreConfig(string storageResourceId, string storageRootPath, string defaultAzureDataLakeStoreFileSystemEndpointSuffix, IDictionary<string, Dictionary<string, string>> configurations)
@@ -56,28 +55,28 @@ public static void AddAzureDataLakeStorageGen1ToCoreConfig(string storageResourc
5655
}
5756

5857
// Get existing core configs.
59-
Dictionary<string, string> coreConfig = GetExistingConfigurationsForType(configurations, ConfigurationKey.CoreSite);
58+
Dictionary<string, string> coreConfig = GetExistingConfigurationsForType(configurations, Constants.ConfigurationKey.CoreSite);
6059

6160
// Add configurations for default ADL storage.
6261
coreConfig[Constants.StorageConfigurations.DefaultFsKey] = Constants.StorageConfigurations.DefaultFsAdlValue;
6362
coreConfig[Constants.StorageConfigurations.AdlHostNameKey] = storageAccountName;
6463
coreConfig[Constants.StorageConfigurations.AdlMountPointKey] = storageRootPath;
6564

66-
configurations[ConfigurationKey.CoreSite] = coreConfig;
65+
configurations[Constants.ConfigurationKey.CoreSite] = coreConfig;
6766
}
6867

6968
public static void AddAdditionalStorageAccountsToCoreConfig(Dictionary<string, string> additionalStorageAccounts, IDictionary<string, Dictionary<string, string>> configurations)
7069
{
7170
// Get existing core configs.
72-
Dictionary<string, string> coreConfig = GetExistingConfigurationsForType(configurations, ConfigurationKey.CoreSite);
71+
Dictionary<string, string> coreConfig = GetExistingConfigurationsForType(configurations, Constants.ConfigurationKey.CoreSite);
7372

7473
foreach (KeyValuePair<string, string> storageAccount in additionalStorageAccounts)
7574
{
7675
string configKey = string.Format(Constants.StorageConfigurations.WasbStorageAccountKeyFormat, storageAccount.Key);
7776
coreConfig[configKey] = storageAccount.Value;
7877
}
7978

80-
configurations[ConfigurationKey.CoreSite] = coreConfig;
79+
configurations[Constants.ConfigurationKey.CoreSite] = coreConfig;
8180
}
8281

8382
public static void AddDataLakeStorageGen1IdentityToIdentityConfig(Guid applicationId, Guid aadTenantId, byte[] certificateFileBytes, string certificatePassword,
@@ -95,7 +94,7 @@ public static void AddDataLakeStorageGen1IdentityToIdentityConfig(Guid applicati
9594
{Constants.DataLakeConfigurations.ResourceUriKey, dataLakeEndpointResourceId}
9695
};
9796

98-
configurations[ConfigurationKey.ClusterIdentity] = datalakeConfig;
97+
configurations[Constants.ConfigurationKey.ClusterIdentity] = datalakeConfig;
9998
}
10099

101100
public static StorageAccount CreateAzureStorageAccount(string clusterName, string storageResourceId, string storageAccountkey, string storageContainer, string defaultStorageSuffix)
@@ -142,15 +141,15 @@ public static void AddHiveMetastoreToConfigurations(AzureHDInsightMetastore hive
142141
string connectionUrl =
143142
string.Format(Constants.MetastoreConfigurations.ConnectionUrlFormat, hiveMetastore.SqlAzureServerName, hiveMetastore.DatabaseName);
144143

145-
configurations.AddOrCombineConfigurations(ConfigurationKey.HiveSite, new Dictionary<string, string>
144+
configurations.AddOrCombineConfigurations(Constants.ConfigurationKey.HiveSite, new Dictionary<string, string>
146145
{
147146
{Constants.MetastoreConfigurations.HiveSite.ConnectionUrlKey, connectionUrl},
148147
{Constants.MetastoreConfigurations.HiveSite.ConnectionUserNameKey, hiveMetastore.Credential.UserName},
149148
{Constants.MetastoreConfigurations.HiveSite.ConnectionPasswordKey, hiveMetastore.Credential.Password.ConvertToString()},
150149
{Constants.MetastoreConfigurations.HiveSite.ConnectionDriverNameKey, Constants.MetastoreConfigurations.HiveSite.ConnectionDriverNameValue}
151150
});
152151

153-
configurations.AddOrCombineConfigurations(ConfigurationKey.HiveEnv, new Dictionary<string, string>
152+
configurations.AddOrCombineConfigurations(Constants.ConfigurationKey.HiveEnv, new Dictionary<string, string>
154153
{
155154
{Constants.MetastoreConfigurations.HiveEnv.DatabaseKey, Constants.MetastoreConfigurations.DatabaseValue},
156155
{Constants.MetastoreConfigurations.HiveEnv.DatabaseNameKey, hiveMetastore.DatabaseName},
@@ -169,7 +168,7 @@ public static void AddOozieMetastoreToConfigurations(AzureHDInsightMetastore ooz
169168
}
170169
string connectionUrl = string.Format(Constants.MetastoreConfigurations.ConnectionUrlFormat, oozieMetastore.SqlAzureServerName, oozieMetastore.DatabaseName);
171170

172-
configurations.AddOrCombineConfigurations(ConfigurationKey.OozieSite, new Dictionary<string, string>
171+
configurations.AddOrCombineConfigurations(Constants.ConfigurationKey.OozieSite, new Dictionary<string, string>
173172
{
174173
{Constants.MetastoreConfigurations.OozieSite.UrlKey, connectionUrl},
175174
{Constants.MetastoreConfigurations.OozieSite.UserNameKey, oozieMetastore.Credential.UserName},
@@ -178,7 +177,7 @@ public static void AddOozieMetastoreToConfigurations(AzureHDInsightMetastore ooz
178177
{Constants.MetastoreConfigurations.OozieSite.SchemaKey, Constants.MetastoreConfigurations.OozieSite.SchemaValue}
179178
});
180179

181-
configurations.AddOrCombineConfigurations(ConfigurationKey.OozieEnv, new Dictionary<string, string>
180+
configurations.AddOrCombineConfigurations(Constants.ConfigurationKey.OozieEnv, new Dictionary<string, string>
182181
{
183182
{Constants.MetastoreConfigurations.OozieEnv.DatabaseKey, Constants.MetastoreConfigurations.DatabaseValue},
184183
{Constants.MetastoreConfigurations.OozieEnv.DatabaseNameKey, oozieMetastore.DatabaseName},
@@ -189,6 +188,22 @@ public static void AddOozieMetastoreToConfigurations(AzureHDInsightMetastore ooz
189188
});
190189
}
191190

191+
public static void AddCustomAmbariDatabaseToConfigurations(AzureHDInsightMetastore ambariDatabase, IDictionary<string, Dictionary<string, string>> configurations)
192+
{
193+
if (Uri.CheckHostName(ambariDatabase.SqlAzureServerName) != UriHostNameType.Dns)
194+
{
195+
throw new ArgumentException("Please provide the fully qualified sql server name.");
196+
}
197+
198+
configurations.AddOrCombineConfigurations(Constants.ConfigurationKey.AmbariConf, new Dictionary<string, string>
199+
{
200+
{Constants.AmbariConfiguration.SqlServerKey, ambariDatabase.SqlAzureServerName},
201+
{Constants.AmbariConfiguration.DatabaseNameKey, ambariDatabase.DatabaseName},
202+
{Constants.AmbariConfiguration.DatabaseUserKey, ambariDatabase.Credential.UserName},
203+
{Constants.AmbariConfiguration.DatabasePasswordKey, ambariDatabase.Credential.Password.ConvertToString()}
204+
});
205+
}
206+
192207
public static VirtualNetworkProfile CreateVirtualNetworkProfile(string virtualNetworkId, string subnetName)
193208
{
194209
if (string.IsNullOrEmpty(virtualNetworkId) && string.IsNullOrEmpty(subnetName))

src/HDInsight/HDInsight/Constants.cs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,5 +143,116 @@ public static class Errors
143143
public static string ERROR_INPUT_CANNOT_BE_EMPTY = "Input cannot be empty";
144144
public static string ERROR_SCHEME_SPECIFIED_IN_STORAGE_FQDN = "Please specify fully qualified storage endpoint without the scheme";
145145
}
146+
147+
public static class ConfigurationKey
148+
{
149+
/// <summary>
150+
/// The constant for Core site configs.
151+
/// </summary>
152+
public const string CoreSite = "core-site";
153+
154+
/// <summary>
155+
/// The constant for Hive site configs.
156+
/// </summary>
157+
public const string HiveSite = "hive-site";
158+
159+
/// <summary>
160+
/// The constant for hive environment configs.
161+
/// </summary>
162+
public const string HiveEnv = "hive-env";
163+
164+
/// <summary>
165+
/// The constant for Oozie site configs.
166+
/// </summary>
167+
public const string OozieSite = "oozie-site";
168+
169+
/// <summary>
170+
/// The constant for Oozie environment configs.
171+
/// </summary>
172+
public const string OozieEnv = "oozie-env";
173+
174+
/// <summary>
175+
/// The constant for WebHCAT site configs.
176+
/// </summary>
177+
public const string WebHCatSite = "webhcat-site";
178+
179+
/// <summary>
180+
/// The constant for HBase environment configs.
181+
/// </summary>
182+
public const string HBaseEnv = "hbase-env";
183+
184+
/// <summary>
185+
/// The constant for HBase site configs.
186+
/// </summary>
187+
public const string HBaseSite = "hbase-site";
188+
189+
/// <summary>
190+
/// The constant for Storm site configs.
191+
/// </summary>
192+
public const string StormSite = "storm-site";
193+
194+
/// <summary>
195+
/// The constant for Yarn site configs.
196+
/// </summary>
197+
public const string YarnSite = "yarn-site";
198+
199+
/// <summary>
200+
/// The constant for MapRed site configs.
201+
/// </summary>
202+
public const string MapRedSite = "mapred-site";
203+
204+
/// <summary>
205+
/// The constant for Tez site configs.
206+
/// </summary>
207+
public const string TezSite = "tez-site";
208+
209+
/// <summary>
210+
/// The constant for HDFS site configs.
211+
/// </summary>
212+
public const string HdfsSite = "hdfs-site";
213+
214+
/// <summary>
215+
/// The constant for Gateway configs.
216+
/// </summary>
217+
public const string Gateway = "gateway";
218+
219+
/// <summary>
220+
/// The constant for cluster identity configs.
221+
/// </summary>
222+
public const string ClusterIdentity = "clusterIdentity";
223+
224+
/// <summary>
225+
/// The constant for Spark-Defaults configs.
226+
/// </summary>
227+
public const string SparkDefaults = "spark-defaults";
228+
229+
/// <summary>
230+
/// The constant for Spark-Thrift-SparkConf configs.
231+
/// </summary>
232+
public const string SparkThriftConf = "spark-thrift-sparkconf";
233+
234+
/// <summary>
235+
/// The constant for Spark2-Defaults configs.
236+
/// </summary>
237+
public const string Spark2Defaults = "spark2-defaults";
238+
239+
/// <summary>
240+
/// The constant for Spark2-Thrift-SparkConf configs.
241+
/// </summary>
242+
public const string Spark2ThriftConf = "spark2-thrift-sparkconf";
243+
244+
/// <summary>
245+
/// The constant for custom ambari db configs.
246+
/// </summary>
247+
public const string AmbariConf = "ambari-conf";
248+
}
249+
250+
public static class AmbariConfiguration
251+
{
252+
public const string SqlServerKey = "database-server";
253+
public const string DatabaseNameKey = "database-name";
254+
public const string DatabaseUserKey = "database-user-name";
255+
public const string DatabasePasswordKey = "database-user-password";
256+
}
146257
}
147258
}

src/HDInsight/HDInsight/ManagementCommands/AddAzureHDInsightMetastoreCommand.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ public override void ExecuteCmdlet()
8080
case AzureHDInsightMetastoreType.OozieMetastore:
8181
Config.OozieMetastore = _metastore;
8282
break;
83+
case AzureHDInsightMetastoreType.AmbariDatabase:
84+
Config.AmbariDatabase = _metastore;
85+
break;
8386
}
8487

8588
WriteObject(Config);

src/HDInsight/HDInsight/ManagementCommands/NewAzureHDInsightClusterCommand.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public AzureHDInsightConfig Config
114114
ZookeeperNodeSize = ZookeeperNodeSize,
115115
HiveMetastore = HiveMetastore,
116116
OozieMetastore = OozieMetastore,
117+
AmbariDatabase = AmbariDatabase,
117118
ObjectId = ObjectId,
118119
ApplicationId = ApplicationId,
119120
AADTenantId = AadTenantId,
@@ -175,6 +176,7 @@ var storageAccount in
175176
ZookeeperNodeSize = value.ZookeeperNodeSize;
176177
HiveMetastore = value.HiveMetastore;
177178
OozieMetastore = value.OozieMetastore;
179+
AmbariDatabase = value.AmbariDatabase;
178180
CertificateFileContents = value.CertificateFileContents;
179181
CertificateFilePath = value.CertificateFilePath;
180182
AadTenantId = value.AADTenantId;
@@ -220,6 +222,9 @@ var storageAccount in
220222
[Parameter(HelpMessage = "Gets or sets the database to store the metadata for Hive.")]
221223
public AzureHDInsightMetastore HiveMetastore { get; set; }
222224

225+
[Parameter(HelpMessage = "Gets or sets the database for ambari.")]
226+
public AzureHDInsightMetastore AmbariDatabase { get; set; }
227+
223228
[Parameter(HelpMessage = "Gets additional Azure Storage Account that you want to enable access to.")]
224229
public Dictionary<string, string> AdditionalStorageAccounts { get; private set; }
225230

@@ -447,6 +452,12 @@ var storageAccount in
447452
ClusterCreateHelper.AddHiveMetastoreToConfigurations(HiveMetastore, clusterConfigurations);
448453
}
449454

455+
// Handle Custom Ambari Database
456+
if (AmbariDatabase != null)
457+
{
458+
ClusterCreateHelper.AddCustomAmbariDatabaseToConfigurations(AmbariDatabase, clusterConfigurations);
459+
}
460+
450461
// Handle ADLSGen1 identity
451462
if (!string.IsNullOrEmpty(CertificatePassword))
452463
{
@@ -553,7 +564,6 @@ var storageAccount in
553564
networkProperties = new NetworkProperties(ResourceProviderConnection, PrivateLink);
554565
}
555566

556-
557567
// Construct cluster create parameter
558568
ClusterCreateParametersExtended createParams = new ClusterCreateParametersExtended
559569
{

src/HDInsight/HDInsight/Models/Management/AzureHDInsightConfig.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ public class AzureHDInsightConfig
8787
/// </summary>
8888
public AzureHDInsightMetastore HiveMetastore { get; set; }
8989

90+
/// <summary>
91+
/// Gets or sets the database for ambari.
92+
/// </summary>
93+
public AzureHDInsightMetastore AmbariDatabase { get; set; }
94+
9095
/// <summary>
9196
/// Gets Object id of the service principal.
9297
/// </summary>

src/HDInsight/HDInsight/Models/Management/AzureHDInsightMetastoreType.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public enum AzureHDInsightMetastoreType
2727
/// <summary>
2828
/// An Oozie metastore.
2929
/// </summary>
30-
OozieMetastore
30+
OozieMetastore,
31+
32+
/// <summary>
33+
/// An Ambari database
34+
/// </summary>
35+
AmbariDatabase
3136
}
3237
}

0 commit comments

Comments
 (0)