blob: f243f15ee780a8b62d7d561629a2417407b6f041 [file] [log] [blame]
'''
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''
import json
import os
import socket
from unittest import TestCase
from mock.mock import patch
class TestHDP23StackAdvisor(TestCase):
def setUp(self):
import imp
self.maxDiff = None
self.testDirectory = os.path.dirname(os.path.abspath(__file__))
stackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/stack_advisor.py')
hdp206StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.0.6/services/stack_advisor.py')
hdp21StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.1/services/stack_advisor.py')
hdp22StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.2/services/stack_advisor.py')
hdp23StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.3/services/stack_advisor.py')
hdp23StackAdvisorClassName = 'HDP23StackAdvisor'
with open(stackAdvisorPath, 'rb') as fp:
imp.load_module('stack_advisor', fp, stackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
with open(hdp206StackAdvisorPath, 'rb') as fp:
imp.load_module('stack_advisor_impl', fp, hdp206StackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
with open(hdp21StackAdvisorPath, 'rb') as fp:
imp.load_module('stack_advisor_impl', fp, hdp21StackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
with open(hdp22StackAdvisorPath, 'rb') as fp:
imp.load_module('stack_advisor_impl', fp, hdp22StackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
with open(hdp23StackAdvisorPath, 'rb') as fp:
stack_advisor_impl = imp.load_module('stack_advisor_impl', fp, hdp23StackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
clazz = getattr(stack_advisor_impl, hdp23StackAdvisorClassName)
self.stackAdvisor = clazz()
# substitute method in the instance
self.get_system_min_uid_real = self.stackAdvisor.get_system_min_uid
self.stackAdvisor.get_system_min_uid = self.get_system_min_uid_magic
def load_json(self, filename):
file = os.path.join(self.testDirectory, filename)
with open(file, 'rb') as f:
data = json.load(f)
return data
def prepareHosts(self, hostsNames):
hosts = { "items": [] }
for hostName in hostsNames:
nextHost = {"Hosts":{"host_name" : hostName}}
hosts["items"].append(nextHost)
return hosts
@patch('__builtin__.open')
@patch('os.path.exists')
def get_system_min_uid_magic(self, exists_mock, open_mock):
class MagicFile(object):
def read(self):
return """
#test line UID_MIN 200
UID_MIN 500
"""
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def __enter__(self):
return self
exists_mock.return_value = True
open_mock.return_value = MagicFile()
return self.get_system_min_uid_real()
def fqdn_mock_result(value=None):
return 'c6401.ambari.apache.org' if value is None else value
@patch('socket.getfqdn', side_effect=fqdn_mock_result)
def test_getComponentLayoutValidations_sparkts_no_hive(self, socket_mock):
""" Test SparkTS is picked when Hive is not installed """
hosts = self.load_json("sparkts-host.json")
services = self.load_json("services-sparkts.json")
componentsListList = [service["components"] for service in services["services"]]
componentsList = [item for sublist in componentsListList for item in sublist]
sparkTS = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "SPARK_THRIFTSERVER"]
hiveMetaStore = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "HIVE_METASTORE"]
self.assertEquals(len(sparkTS), 1)
self.assertEquals(len(hiveMetaStore), 0)
validations = self.stackAdvisor.getComponentLayoutValidations(services, hosts)
expected = {'component-name': 'SPARK_THRIFTSERVER', 'message': 'SPARK_THRIFTSERVER requires HIVE_METASTORE to be selected/deployed.', 'type': 'host-component', 'level': 'ERROR'}
self.assertEquals(validations[0], expected)
@patch('socket.getfqdn', side_effect=fqdn_mock_result)
def test_getComponentLayoutValidations_sparkts_with_hive(self, socket_mock):
""" Test SparkTS is picked when Hive is installed """
hosts = self.load_json("sparkts-host.json")
services = self.load_json("services-sparkts-hive.json")
componentsListList = [service["components"] for service in services["services"]]
componentsList = [item for sublist in componentsListList for item in sublist]
sparkTS = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "SPARK_THRIFTSERVER"]
hiveMetaStore = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "HIVE_METASTORE"]
self.assertEquals(len(sparkTS), 1)
self.assertEquals(len(hiveMetaStore), 1)
validations = self.stackAdvisor.getComponentLayoutValidations(services, hosts)
self.assertEquals(len(validations), 0)
def test_recommendHDFSConfigurations(self):
configurations = {
"hdfs-site": {
"properties": {
"dfs.namenode.inode.attributes.provider.class": "org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer",
}
},
"ranger-hdfs-plugin-properties": {
"properties": {
"ranger-hdfs-plugin-enabled": "No"
}
}
}
clusterData = {
"totalAvailableRam": 2048,
"hBaseInstalled": True,
"hbaseRam": 112,
"reservedRam": 128
}
hosts = {
"items": [
{
"Hosts": {
"disk_info": [{
"size": '8',
"mountpoint": "/"
}]
}
}]}
services = {
"services":
[
{
"StackServices": {
"service_name" : "HDFS",
"service_version" : "2.6.0.2.2"
},
"components": [
]
}
],
"Versions": {
"stack_version": "2.3"
},
"configurations": configurations,
"ambari-server-properties": {"ambari-server.user":"ambari_user"}
}
# Test with Ranger HDFS plugin disabled
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations['hdfs-site']['property_attributes']['dfs.namenode.inode.attributes.provider.class'], {'delete': 'true'}, "Test with Ranger HDFS plugin is disabled")
# Test with Ranger HDFS plugin is enabled
configurations['hdfs-site']['properties'] = {}
configurations['hdfs-site']['property_attributes'] = {}
services['configurations']['ranger-hdfs-plugin-properties']['properties']['ranger-hdfs-plugin-enabled'] = 'Yes'
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations['hdfs-site']['properties']['dfs.namenode.inode.attributes.provider.class'], 'org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer', "Test with Ranger HDFS plugin is enabled")
def test_recommendYARNConfigurations(self):
configurations = {}
servicesList = ["YARN"]
components = []
hosts = {
"items" : [
{
"Hosts" : {
"cpu_count" : 6,
"total_mem" : 50331648,
"disk_info" : [
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"},
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"}
],
"public_host_name" : "c6401.ambari.apache.org",
"host_name" : "c6401.ambari.apache.org"
}
}
]
}
services = {
"services" : [ {
"StackServices":{
"service_name": "YARN",
},
"Versions": {
"stack_version": "2.3"
},
"components": [
{
"StackServiceComponents": {
"component_name": "NODEMANAGER",
"hostnames": ["c6401.ambari.apache.org"]
}
}
]
}
],
"configurations": {
"yarn-site": {
"properties": {
"yarn.authorization-provider": "org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizer"
}
},
"ranger-yarn-plugin-properties": {
"properties": {
"ranger-yarn-plugin-enabled": "No"
}
}
}
}
clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None)
# Test with Ranger YARN plugin disabled
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['yarn-site']['property_attributes']['yarn.authorization-provider'], {'delete': 'true'}, "Test with Ranger HDFS plugin is disabled")
# Test with Ranger YARN plugin is enabled
configurations['yarn-site']['properties'] = {}
configurations['yarn-site']['property_attributes'] = {}
services['configurations']['ranger-yarn-plugin-properties']['properties']['ranger-yarn-plugin-enabled'] = 'Yes'
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['yarn-site']['properties']['yarn.authorization-provider'], 'org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizer', "Test with Ranger YARN plugin enabled")
def test_recommendKAFKAConfigurations(self):
configurations = {}
clusterData = {
"totalAvailableRam": 2048,
"hBaseInstalled": True,
"hbaseRam": 112,
"reservedRam": 128
}
services = {
"services":
[
{
"StackServices": {
"service_name" : "KAFKA",
"service_version" : "2.6.0.2.2"
}
},
{
"StackServices": {
"service_name": "RANGER",
"service_version": "0.5.0.2.3"
}
},
{
"StackServices": {
"service_name": "AMBARI_METRICS"
},
"components": [{
"StackServiceComponents": {
"component_name": "METRICS_COLLECTOR",
"hostnames": ["host1"]
}
}, {
"StackServiceComponents": {
"component_name": "METRICS_MONITOR",
"hostnames": ["host1"]
}
}]
}
],
"Versions": {
"stack_version": "2.3"
},
"configurations": {
"core-site": {
"properties": { },
},
"cluster-env": {
"properties": {
"security_enabled" : "true"
},
"property_attributes": {}
},
"kafka-broker": {
"properties": {
"authorizer.class.name" : "kafka.security.auth.SimpleAclAuthorizer"
},
"property_attributes": {}
},
"ranger-kafka-plugin-properties": {
"properties": {
"ranger-kafka-plugin-enabled": "No"
}
},
"kafka-log4j": {
"properties": {
"content": "kafka.logs.dir=logs"
}
}
}
}
# Test authorizer.class.name with Ranger Kafka plugin disabled in non-kerberos environment
services['configurations']['cluster-env']['properties']['security_enabled'] = "false"
self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['kafka-broker']['property_attributes']['authorizer.class.name'], {'delete': 'true'}, "Test authorizer.class.name with Ranger Kafka plugin is disabled in non-kerberos environment")
# Test authorizer.class.name with Ranger Kafka plugin disabled in kerberos environment
services['configurations']['cluster-env']['properties']['security_enabled'] = "true"
configurations['kafka-broker']['properties'] = {}
configurations['kafka-broker']['property_attributes'] = {}
services['configurations']['kafka-broker']['properties']['security.inter.broker.protocol'] = 'PLAINTEXTSASL'
services['configurations']['kafka-broker']['properties']['authorizer.class.name'] = 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer'
self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['kafka-broker']['properties']['authorizer.class.name'], 'kafka.security.auth.SimpleAclAuthorizer' , "Test authorizer.class.name with Ranger Kafka plugin disabled in kerberos environment")
# Test authorizer.class.name with Ranger Kafka plugin enabled in non-kerberos environment
services['configurations']['cluster-env']['properties']['security_enabled'] = "false"
configurations['kafka-broker']['properties'] = {}
configurations['kafka-broker']['property_attributes'] = {}
del services['configurations']['kafka-broker']['properties']['security.inter.broker.protocol']
services['configurations']['kafka-broker']['properties']['authorizer.class.name'] = 'kafka.security.auth.SimpleAclAuthorizer'
services['configurations']['ranger-kafka-plugin-properties']['properties']['ranger-kafka-plugin-enabled'] = 'Yes'
self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['kafka-broker']['properties']['authorizer.class.name'], 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer', "Test authorizer.class.name with Ranger Kafka plugin enabled in kerberos environment")
services['configurations']['cluster-env']['properties']['security_enabled'] = "false"
configurations['kafka-broker']['properties'] = {}
configurations['kafka-broker']['property_attributes'] = {}
services['configurations']['kafka-broker']['properties']['security.inter.broker.protocol'] = 'PLAINTEXTSASL'
services['configurations']['kafka-broker']['properties']['authorizer.class.name'] = 'kafka.security.auth.SimpleAclAuthorizer'
services['configurations']['ranger-kafka-plugin-properties']['properties']['ranger-kafka-plugin-enabled'] = 'Yes'
self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['kafka-broker']['properties']['authorizer.class.name'], 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer', "Test authorizer.class.name with Ranger Kafka plugin enabled in kerberos environment")
# Test kafka-log4j content when Ranger plugin for Kafka is enabled
self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None)
log4jContent = services['configurations']['kafka-log4j']['properties']['content']
newRangerLog4content = "\nlog4j.appender.rangerAppender=org.apache.log4j.DailyRollingFileAppender\nlog4j.appender.rangerAppender.DatePattern='.'yyyy-MM-dd-HH\n" \
"log4j.appender.rangerAppender.File=${kafka.logs.dir}/ranger_kafka.log\nlog4j.appender.rangerAppender.layout" \
"=org.apache.log4j.PatternLayout\nlog4j.appender.rangerAppender.layout.ConversionPattern=%d{ISO8601} %p [%t] %C{6} (%F:%L) - %m%n\n" \
"log4j.logger.org.apache.ranger=INFO, rangerAppender"
expectedLog4jContent = log4jContent + newRangerLog4content
self.assertEquals(configurations['kafka-log4j']['properties']['content'], expectedLog4jContent, "Test kafka-log4j content when Ranger plugin for Kafka is enabled")
# Test kafka.metrics.reporters when AMBARI_METRICS is present in services
self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None)
self.assertEqual(configurations['kafka-broker']['properties']['kafka.metrics.reporters'],
'org.apache.hadoop.metrics2.sink.kafka.KafkaTimelineMetricsReporter')
def test_recommendHBASEConfigurations(self):
configurations = {}
clusterData = {
"totalAvailableRam": 2048,
"hBaseInstalled": True,
"hbaseRam": 112,
"reservedRam": 128
}
expected = {
"hbase-site": {
"properties": {
"hbase.bucketcache.size": "92160",
"hbase.bucketcache.percentage.in.combinedcache": "1.0000",
"hbase.regionserver.global.memstore.size": "0.4",
"hfile.block.cache.size": "0.4",
"hbase.coprocessor.region.classes": "org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint",
"hbase.coprocessor.master.classes": "",
"hbase.coprocessor.regionserver.classes": "",
"hbase.rpc.controllerfactory.class": "org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory",
"hbase.region.server.rpc.scheduler.factory.class": "org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory",
'hbase.regionserver.wal.codec': 'org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec',
"hbase.bucketcache.ioengine": "offheap",
"phoenix.functions.allowUserDefinedFunctions": "true"
},
"property_attributes": {
"hbase.coprocessor.regionserver.classes": {
"delete": "true"
},
"hbase.bucketcache.percentage.in.combinedcache": {
"delete": "true"
}
}
},
"hbase-env": {
"properties": {
"hbase_master_heapsize": "1024",
"hbase_max_direct_memory_size": "94208",
"hbase_regionserver_heapsize": "20480"
}
}
}
services = {
"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2"
},
"components":[
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/DATANODE",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"1+",
"component_category":"SLAVE",
"component_name":"DATANODE",
"custom_commands":[
],
"display_name":"DataNode",
"is_client":"false",
"is_master":"false",
"service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host1"
]
},
"dependencies":[
]
},
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/JOURNALNODE",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"0+",
"component_category":"SLAVE",
"component_name":"JOURNALNODE",
"custom_commands":[
],
"display_name":"JournalNode",
"is_client":"false",
"is_master":"false",
"service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host1"
]
},
"dependencies":[
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/JOURNALNODE/dependencies/HDFS_CLIENT",
"Dependencies":{
"component_name":"HDFS_CLIENT",
"dependent_component_name":"JOURNALNODE",
"dependent_service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2"
}
}
]
},
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/NAMENODE",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"1-2",
"component_category":"MASTER",
"component_name":"NAMENODE",
"custom_commands":[
"DECOMMISSION",
"REBALANCEHDFS"
],
"display_name":"NameNode",
"is_client":"false",
"is_master":"true",
"service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host2"
]
},
"dependencies":[
]
},
],
}],
"Versions": {
"stack_version": "2.3"
},
"configurations": {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "2048"
}
},
"hbase-env": {
"properties": {
"phoenix_sql_enabled": "true"
}
},
"hbase-site": {
"properties": {
"hbase.coprocessor.regionserver.classes": ""
}
}
}
}
# Test
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected)
# Test
clusterData['hbaseRam'] = '4'
expected["hbase-site"]["property_attributes"]["hbase.bucketcache.size"] = {"delete": "true"}
expected["hbase-site"]["property_attributes"]["hbase.bucketcache.ioengine"] = {"delete": "true"}
expected["hbase-site"]["property_attributes"]["hbase.bucketcache.percentage.in.combinedcache"] = {"delete": "true"}
expected["hbase-env"]["property_attributes"] = {"hbase_max_direct_memory_size" : {"delete": "true"}}
expected["hbase-env"]["properties"]["hbase_master_heapsize"] = "1024"
expected["hbase-env"]["properties"]["hbase_regionserver_heapsize"] = "4096"
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected)
# Test - default recommendations should have certain configs deleted. HAS TO BE LAST TEST.
services["configurations"] = {"hbase-site": {"properties": {"phoenix.functions.allowUserDefinedFunctions": '', "hbase.rpc.controllerfactory.class": '', "hbase.region.server.rpc.scheduler.factory.class": ''}}}
configurations = {}
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'], {'delete': 'true'})
self.assertEquals(configurations['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'], {'delete': 'true'})
self.assertEquals(configurations['hbase-site']['property_attributes']['hbase.region.server.rpc.scheduler.factory.class'], {'delete': 'true'})
self.assertEquals(configurations['hbase-site']['properties']['hbase.regionserver.wal.codec'], "org.apache.hadoop.hbase.regionserver.wal.WALCellCodec")
def test_recommendHiveConfigurations(self):
self.maxDiff = None
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "8192",
},
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
'yarn-site': {
'properties': {
'yarn.scheduler.minimum-allocation-mb': '256',
'yarn.scheduler.maximum-allocation-mb': '8192'
}
},
'hive-env': {
'properties': {
'hive_exec_orc_storage_strategy': 'SPEED',
'hive_security_authorization': 'None',
'hive_timeline_logging_enabled': 'true',
'hive_txn_acid': 'off'
}
},
'hive-site': {
'properties': {
'hive.server2.enable.doAs': 'true',
'hive.server2.tez.default.queues': "queue1,queue2",
'hive.server2.tez.initialize.default.sessions': 'false',
'hive.server2.tez.sessions.per.default.queue': '1',
'hive.auto.convert.join.noconditionaltask.size': '214748364',
'hive.compactor.initiator.on': 'false',
'hive.compactor.worker.threads': '0',
'hive.compute.query.using.stats': 'true',
'hive.enforce.bucketing': 'false',
'hive.exec.dynamic.partition.mode': 'strict',
'hive.exec.failure.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.orc.compression.strategy': 'SPEED',
'hive.exec.orc.default.compress': 'ZLIB',
'hive.exec.orc.default.stripe.size': '67108864',
'hive.exec.orc.encoding.strategy': 'SPEED',
'hive.exec.post.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.pre.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.reducers.bytes.per.reducer': '67108864',
'hive.execution.engine': 'mr',
'hive.optimize.index.filter': 'true',
'hive.optimize.sort.dynamic.partition': 'false',
'hive.prewarm.enabled': 'false',
'hive.prewarm.numcontainers': '3',
'hive.security.authorization.enabled': 'false',
'hive.server2.use.SSL': 'false',
'hive.stats.fetch.column.stats': 'true',
'hive.stats.fetch.partition.stats': 'true',
'hive.support.concurrency': 'false',
'hive.tez.auto.reducer.parallelism': 'true',
'hive.tez.container.size': '768',
'hive.tez.dynamic.partition.pruning': 'true',
'hive.tez.java.opts': '-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseParallelGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps',
'hive.txn.manager': 'org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager',
'hive.vectorized.execution.enabled': 'true',
'hive.vectorized.execution.reduce.enabled': 'false',
'hive.security.metastore.authorization.manager': 'org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider',
'hive.security.authorization.manager': 'org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory'
},
'property_attributes': {
'hive.auto.convert.join.noconditionaltask.size': {'maximum': '644245094'},
'hive.server2.authentication.pam.services': {'delete': 'true'},
'hive.server2.custom.authentication.class': {'delete': 'true'},
'hive.server2.authentication.kerberos.principal': {'delete': 'true'},
'hive.server2.authentication.kerberos.keytab': {'delete': 'true'},
'hive.server2.authentication.ldap.url': {'delete': 'true'},
'hive.server2.tez.default.queues': {
'entries': [{'value': 'queue1', 'label': 'queue1 queue'}, {'value': 'queue2', 'label': 'queue2 queue'}]
},
'atlas.cluster.name': {'delete': 'true'},
'atlas.rest.address': {'delete': 'true'},
'datanucleus.rdbms.datastoreAdapterClassName': {'delete': 'true'},
'hive.tez.container.size': {'maximum': '8192', 'minimum': '256'}
}
},
'hiveserver2-site': {
'properties': {
},
'property_attributes': {
'hive.security.authorization.manager': {'delete': 'true'},
'hive.security.authenticator.manager': {'delete': 'true'}
}
},
'webhcat-site': {
'properties': {
'templeton.hadoop.queue.name': 'queue1'
}
}
}
services = {
"Versions": {
"parent_stack_version": "2.2",
"stack_name": "HDP",
"stack_version": "2.3",
"stack_hierarchy": {
"stack_name": "HDP",
"stack_versions": ["2.2", "2.1", "2.0.6"]
}
},
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/YARN",
"StackServices": {
"service_name": "YARN",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "APP_TIMELINE_SERVER",
"display_name": "App Timeline Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "NODEMANAGER",
"display_name": "NodeManager",
"is_client": "false",
"is_master": "false",
"hostnames": [
"c6403.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1-2",
"component_category": "MASTER",
"component_name": "RESOURCEMANAGER",
"display_name": "ResourceManager",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "CLIENT",
"component_name": "YARN_CLIENT",
"display_name": "YARN Client",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": {
"capacity-scheduler": {
"properties": {
"capacity-scheduler" :"yarn.scheduler.capacity.root.queues=queue1,queue2"
}
},
"hive-env": {
"properties": {
}
},
"hive-site": {
"properties": {
"hive.server2.authentication": "none",
"hive.server2.authentication.ldap.url": "",
"hive.server2.authentication.ldap.baseDN": "",
"hive.server2.authentication.kerberos.keytab": "",
"hive.server2.authentication.kerberos.principal": "",
"hive.server2.authentication.pam.services": "",
"hive.server2.custom.authentication.class": "",
"hive.cbo.enable": "true"
}
},
"hiveserver2-site": {
"properties": {
"hive.security.authorization.manager": "",
"hive.security.authenticator.manager": ""
}
}
},
"changed-configurations": [ ]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test JDK1.7
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'}
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test JDK1.8
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.8_44'}
expected['hive-site']['properties']['hive.tez.java.opts'] = "-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps"
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test JDK1.9
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.9.2_44'}
expected['hive-site']['properties']['hive.tez.java.opts'] = "-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps"
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendHiveConfigurations_with_atlas(self):
self.maxDiff = None
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "8192",
},
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
'yarn-site': {
'properties': {
'yarn.scheduler.minimum-allocation-mb': '256',
'yarn.scheduler.maximum-allocation-mb': '8192'
}
},
'hive-env': {
'properties': {
'hive_exec_orc_storage_strategy': 'SPEED',
'hive_security_authorization': 'None',
'hive_timeline_logging_enabled': 'true',
'hive_txn_acid': 'off'
}
},
'hive-site': {
'properties': {
'hive.server2.enable.doAs': 'true',
'hive.server2.tez.default.queues': "queue1,queue2",
'hive.server2.tez.initialize.default.sessions': 'false',
'hive.server2.tez.sessions.per.default.queue': '1',
'hive.auto.convert.join.noconditionaltask.size': '214748364',
'hive.compactor.initiator.on': 'false',
'hive.compactor.worker.threads': '0',
'hive.compute.query.using.stats': 'true',
'hive.enforce.bucketing': 'false',
'hive.exec.dynamic.partition.mode': 'strict',
'hive.exec.failure.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.orc.compression.strategy': 'SPEED',
'hive.exec.orc.default.compress': 'ZLIB',
'hive.exec.orc.default.stripe.size': '67108864',
'hive.exec.orc.encoding.strategy': 'SPEED',
'hive.exec.post.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook,org.apache.atlas.hive.hook.HiveHook',
'hive.exec.pre.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.reducers.bytes.per.reducer': '67108864',
'hive.execution.engine': 'mr',
'hive.optimize.index.filter': 'true',
'hive.optimize.sort.dynamic.partition': 'false',
'hive.prewarm.enabled': 'false',
'hive.prewarm.numcontainers': '3',
'hive.security.authorization.enabled': 'false',
'hive.server2.use.SSL': 'false',
'hive.stats.fetch.column.stats': 'true',
'hive.stats.fetch.partition.stats': 'true',
'hive.support.concurrency': 'false',
'hive.tez.auto.reducer.parallelism': 'true',
'hive.tez.container.size': '768',
'hive.tez.dynamic.partition.pruning': 'true',
'hive.tez.java.opts': '-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseParallelGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps',
'hive.txn.manager': 'org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager',
'hive.vectorized.execution.enabled': 'true',
'hive.vectorized.execution.reduce.enabled': 'false',
'hive.security.metastore.authorization.manager': 'org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider',
'hive.security.authorization.manager': 'org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory'
},
'property_attributes': {
'hive.auto.convert.join.noconditionaltask.size': {'maximum': '644245094'},
'hive.tez.container.size': {'maximum': '8192', 'minimum': '256'},
'hive.server2.authentication.pam.services': {'delete': 'true'},
'hive.server2.custom.authentication.class': {'delete': 'true'},
'hive.server2.authentication.kerberos.principal': {'delete': 'true'},
'hive.server2.authentication.kerberos.keytab': {'delete': 'true'},
'hive.server2.authentication.ldap.url': {'delete': 'true'},
'hive.server2.tez.default.queues': {
'entries': [{'value': 'queue1', 'label': 'queue1 queue'}, {'value': 'queue2', 'label': 'queue2 queue'}]
},
'atlas.cluster.name': {'delete': 'true'},
'atlas.rest.address': {'delete': 'true'},
'datanucleus.rdbms.datastoreAdapterClassName': {'delete': 'true'}
}
},
'hiveserver2-site': {
'properties': {
},
'property_attributes': {
'hive.security.authorization.manager': {'delete': 'true'},
'hive.security.authenticator.manager': {'delete': 'true'}
}
},
'webhcat-site': {
'properties': {
'templeton.hadoop.queue.name': 'queue1'
}
}
}
services = {
"Versions": {
"parent_stack_version": "2.2",
"stack_name": "HDP",
"stack_version": "2.3",
"stack_hierarchy": {
"stack_name": "HDP",
"stack_versions": ["2.2", "2.1", "2.0.6"]
}
},
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/YARN",
"StackServices": {
"service_name": "YARN",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "APP_TIMELINE_SERVER",
"display_name": "App Timeline Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "NODEMANAGER",
"display_name": "NodeManager",
"is_client": "false",
"is_master": "false",
"hostnames": [
"c6403.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1-2",
"component_category": "MASTER",
"component_name": "RESOURCEMANAGER",
"display_name": "ResourceManager",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "CLIENT",
"component_name": "YARN_CLIENT",
"display_name": "YARN Client",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/ATLAS",
"StackServices": {
"service_name": "ATLAS",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.3"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "ATLAS_SERVER",
"display_name": "Atlas Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
}
]
}
],
"configurations": {
"capacity-scheduler": {
"properties": {
"capacity-scheduler" :"yarn.scheduler.capacity.root.queues=queue1,queue2"
}
},
"hive-env": {
"properties": {
}
},
"hive-site": {
"properties": {
"hive.server2.authentication": "none",
"hive.server2.authentication.ldap.url": "",
"hive.server2.authentication.ldap.baseDN": "",
"hive.server2.authentication.kerberos.keytab": "",
"hive.server2.authentication.kerberos.principal": "",
"hive.server2.authentication.pam.services": "",
"hive.server2.custom.authentication.class": "",
"hive.cbo.enable": "true"
}
},
"hiveserver2-site": {
"properties": {
"hive.security.authorization.manager": "",
"hive.security.authenticator.manager": ""
}
}
},
"changed-configurations": [ ]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
@patch('os.path.exists')
@patch('os.path.isdir')
@patch('os.listdir')
def test_recommendTezConfigurations(self, os_listdir_mock, os_isdir_mock, os_exists_mock):
os_exists_mock.return_value = True
os_isdir_mock.return_value = True
os_listdir_mock.return_value = ['TEZ{0.7.0.2.3.0.0-2155}']
self.maxDiff = None
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "8192",
},
},
"capacity-scheduler": {
"properties": {
"yarn.scheduler.capacity.root.queues": "queue1,queue2"
}
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
"capacity-scheduler": {
"properties": {
"yarn.scheduler.capacity.root.queues": "queue1,queue2"
}
},
"tez-site": {
"properties": {
"tez.task.resource.memory.mb": "768",
"tez.am.launch.cmd-opts": "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseParallelGC",
"tez.task.launch.cmd-opts": "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseParallelGC",
"tez.runtime.io.sort.mb": "202",
"tez.session.am.dag.submit.timeout.secs": "600",
"tez.runtime.unordered.output.buffer.size-mb": "57",
"tez.am.resource.memory.mb": "4000",
"tez.queue.name": "queue1",
}
},
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "8192"
}
}
}
services = {
"Versions": {
"parent_stack_version": "2.2",
"stack_name": "HDP",
"stack_version": "2.3",
"stack_hierarchy": {
"stack_name": "HDP",
"stack_versions": ["2.2", "2.1", "2.0.6"]
}
},
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/YARN",
"StackServices": {
"service_name": "YARN",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "APP_TIMELINE_SERVER",
"display_name": "App Timeline Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "NODEMANAGER",
"display_name": "NodeManager",
"is_client": "false",
"is_master": "false",
"hostnames": [
"c6403.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1-2",
"component_category": "MASTER",
"component_name": "RESOURCEMANAGER",
"display_name": "ResourceManager",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "CLIENT",
"component_name": "YARN_CLIENT",
"display_name": "YARN Client",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": configurations,
"changed-configurations": [ ],
"ambari-server-properties": {}
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
server_host = socket.getfqdn()
for host in hosts["items"]:
if server_host == host["Hosts"]["host_name"]:
server_host = host["Hosts"]["public_host_name"]
tez_ui_url = "http://" + server_host + ":8080/#/main/views/TEZ/0.7.0.2.3.0.0-2155/TEZ_CLUSTER_INSTANCE"
# Test JDK1.7
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'}
expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url
self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test JDK1.8
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.8_44'}
expected['tez-site']['properties']['tez.am.launch.cmd-opts'] = "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB"
expected['tez-site']['properties']['tez.task.launch.cmd-opts'] = "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB"
expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url
self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test JDK1.9
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.9.2_44'}
expected['tez-site']['properties']['tez.am.launch.cmd-opts'] = "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB"
expected['tez-site']['properties']['tez.task.launch.cmd-opts'] = "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB"
expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url
self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_validateHiveConfigurations(self):
properties = {"hive_security_authorization": "None",
"hive.exec.orc.default.stripe.size": "8388608",
'hive.tez.container.size': '2048',
'hive.tez.java.opts': '-server -Xmx546m -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseParallelGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps',
'hive.auto.convert.join.noconditionaltask.size': '1100000000'}
recommendedDefaults = {'hive.tez.container.size': '1024',
'hive.tez.java.opts': '-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseParallelGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps',
'hive.auto.convert.join.noconditionaltask.size': '1000000000'}
configurations = {
"hive-site": {
"properties": {"hive.security.authorization.enabled": "true", 'hive.tez.java.opts': '-server -Djava.net.preferIPv4Stack=true'}
},
"hive-env": {
"properties": {"hive_security_authorization": "None"}
}
}
services = {
"services": []
}
# Test for 'ranger-hive-plugin-properties' not being in configs
res_expected = []
res = self.stackAdvisor.validateHiveConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# This test intentionally calls all validate methods with
# incorrect parameters (empty configs)
def test_noRiskyDictLookups(self):
properties = {}
recommendedDefaults = {}
configurations = {"core-site": {"properties": {}}}
services = {
"services": [],
"Versions": {
"stack_name": "HDP",
"stack_version": "2.3"
},
"configurations": configurations
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"disk_info" : [
{
"available" : "4564632",
"used" : "5230344",
"percent" : "54%",
"size" : "10319160",
"type" : "ext4",
"mountpoint" : "/"
},
{
"available" : "1832436",
"used" : "0",
"percent" : "0%",
"size" : "1832436",
"type" : "tmpfs",
"mountpoint" : "/dev/shm"
}
],
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
def return_c6401_hostname(services, service_name, component_name):
return ["c6401.ambari.apache.org"]
self.stackAdvisor.getComponentHostNames = return_c6401_hostname
validators = self.stackAdvisor.getServiceConfigurationValidators()
# Setting up empty configs and services info
for serviceName, validator in validators.items():
services["services"].extend([{"StackServices": {"service_name": serviceName},
"components": []}])
for siteName in validator.keys():
configurations[siteName] = {"properties": {}}
# Emulate enabled RANGER
services["services"].extend([{"StackServices": {"service_name": "RANGER"},
"components": []}])
configurations["ranger-hbase-plugin-properties"] = {
"ranger-hbase-plugin-enabled": "Yes"
}
exceptionThrown = False
try:
recommendations = self.stackAdvisor.recommendConfigurations(services, hosts)
except Exception as e:
exceptionThrown = True
self.assertTrue(exceptionThrown)
pass
def test_recommendRangerConfigurations(self):
clusterData = {}
# Recommend for not existing DB_FLAVOR and http enabled, HDP-2.3
services = {
"Versions": {
"parent_stack_version": "2.2",
"stack_name": "HDP",
"stack_version": "2.3",
"stack_hierarchy": {
"stack_name": "HDP",
"stack_versions": ["2.2", "2.1", "2.0.6"]
}
},
"services": [
{
"StackServices": {
"service_name": "RANGER",
"service_version": "0.5.0.2.3"
},
"components": [
{
"StackServiceComponents": {
"component_name": "RANGER_ADMIN",
"hostnames": ["host1"]
}
}
]
},
],
"configurations": {
"admin-properties": {
"properties": {
"DB_FLAVOR": "NOT_EXISTING",
}
},
"ranger-admin-site": {
"properties": {
"ranger.service.http.port": "7777",
"ranger.service.http.enabled": "true",
}
}
},
"ambari-server-properties": {
"ambari.ldap.isConfigured" : "true",
"authentication.ldap.bindAnonymously" : "false",
"authentication.ldap.baseDn" : "dc=apache,dc=org",
"authentication.ldap.groupNamingAttr" : "cn",
"authentication.ldap.primaryUrl" : "c6403.ambari.apache.org:389",
"authentication.ldap.userObjectClass" : "posixAccount",
"authentication.ldap.secondaryUrl" : "c6403.ambari.apache.org:389",
"authentication.ldap.usernameAttribute" : "uid",
"authentication.ldap.dnAttribute" : "dn",
"authentication.ldap.useSSL" : "false",
"authentication.ldap.managerPassword" : "/etc/ambari-server/conf/ldap-password.dat",
"authentication.ldap.groupMembershipAttr" : "memberUid",
"authentication.ldap.groupObjectClass" : "posixGroup",
"authentication.ldap.managerDn" : "uid=hdfs,ou=people,ou=dev,dc=apache,dc=org"
}
}
expected = {
'admin-properties': {
'properties': {
'policymgr_external_url': 'http://host1:7777'
}
},
'ranger-ugsync-site': {
'properties': {
'ranger.usersync.group.objectclass': 'posixGroup',
'ranger.usersync.group.nameattribute': 'cn',
'ranger.usersync.group.memberattributename': 'memberUid',
'ranger.usersync.ldap.binddn': 'uid=hdfs,ou=people,ou=dev,dc=apache,dc=org',
'ranger.usersync.ldap.user.nameattribute': 'uid',
'ranger.usersync.ldap.user.objectclass': 'posixAccount',
'ranger.usersync.ldap.url': 'ldap://c6403.ambari.apache.org:389',
'ranger.usersync.ldap.searchBase': 'dc=apache,dc=org'
}
},
'ranger-admin-site': {
'properties': {
"ranger.audit.solr.zookeepers": "NONE",
"ranger.audit.source.type": "solr"
}
},
'ranger-env': {
'properties': {
'ranger-storm-plugin-enabled': 'No',
}
}
}
recommendedConfigurations = {}
self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None)
self.assertEquals(recommendedConfigurations, expected)
# Recommend ranger.audit.solr.zookeepers when solrCloud is disabled
services['configurations']['ranger-env'] = {
"properties": {
"is_solrCloud_enabled": "false"
}
}
recommendedConfigurations = {}
self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None)
self.assertEquals(recommendedConfigurations['ranger-admin-site']['properties']['ranger.audit.solr.zookeepers'], 'NONE')
def test_recommendRangerKMSConfigurations(self):
clusterData = {}
services = {
"Versions": {
"stack_version" : "2.3",
},
"services": [
{
"StackServices": {
"service_name": "RANGER_KMS",
"service_version": "0.5.0.2.3"
},
"components": [
{
"StackServiceComponents": {
"component_name": "RANGER_KMS_SERVER",
"hostnames": ["host1"]
}
}
]
}
],
"configurations": {
"kms-env": {
"properties": {
"kms_user": "kmsname"
}
},
"core-site": {
"properties": {
"fs.defaultFS": "hdfs://host1:8020"
}
},
'ranger-kms-audit': {
'properties': {
}
},
'kms-properties': {
'properties': {
'DB_FLAVOR': 'ORACLE',
'db_host' : 'c6401.ambari.apache.org:1521:XE',
'db_name' : "XE"
}
}
},
"forced-configurations": []
}
expected = {
'kms-properties': {
'properties': {}
},
'dbks-site': {
'properties': {
"ranger.ks.jpa.jdbc.driver" : "oracle.jdbc.driver.OracleDriver",
"ranger.ks.jpa.jdbc.url" : "jdbc:oracle:thin:@c6401.ambari.apache.org:1521:XE"
}
},
'core-site': {
'properties': {
}
},
'ranger-kms-audit': {
'properties': {
}
}
}
# non kerberized cluster. There should be no proxyuser configs
recommendedConfigurations = {}
self.stackAdvisor.recommendRangerKMSConfigurations(recommendedConfigurations, clusterData, services, None)
self.assertEquals(recommendedConfigurations, expected)
# kerberized cluster
services['services'].append({
"StackServices": {
"service_name": "KERBEROS"
}
})
expected = {
'kms-properties': {
'properties': {}
},
'dbks-site': {
'properties': {
"ranger.ks.jpa.jdbc.driver" : "oracle.jdbc.driver.OracleDriver",
"ranger.ks.jpa.jdbc.url" : "jdbc:oracle:thin:@c6401.ambari.apache.org:1521:XE"
}
},
'core-site': {
'properties': {
'hadoop.proxyuser.kmsname.groups': '*'
}
},
'ranger-kms-audit': {
'properties': {
}
}
}
# on kerberized cluster property should be recommended
recommendedConfigurations = {}
self.stackAdvisor.recommendRangerKMSConfigurations(recommendedConfigurations, clusterData, services, None)
self.assertEquals(recommendedConfigurations, expected)
recommendedConfigurations = {}
services['changed-configurations'] = [
{
'type': 'kms-env',
'name': 'kms_user',
'old_value': 'kmsname'
}
]
services['configurations']['kms-env']['properties']['kms_user'] = 'kmsnew'
expected['core-site'] = {
'properties': {
'hadoop.proxyuser.kmsnew.groups': '*'
},
'property_attributes': {
'hadoop.proxyuser.kmsname.groups': {
'delete': 'true'
}
}
}
# kms_user was changed, old property should be removed
self.stackAdvisor.recommendRangerKMSConfigurations(recommendedConfigurations, clusterData, services, None)
self.assertEquals(recommendedConfigurations, expected)
def test_recommendStormConfigurations(self):
self.maxDiff = None
configurations = {
"storm-site": {
"properties": {
"storm.topology.submission.notifier.plugin.class": "foo"
}
},
"ranger-storm-plugin-properties": {
"properties": {
"ranger-storm-plugin-enabled": "No"
}
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
'storm-site': {
'properties': {
'storm.topology.submission.notifier.plugin.class': 'foo,org.apache.atlas.storm.hook.StormAtlasHook',
},
"property_attributes":{
'nimbus.authorizer': {'delete':'true'}
}
},
"ranger-storm-plugin-properties": {
"properties": {
"ranger-storm-plugin-enabled": "No"
}
}
}
services = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/ATLAS",
"StackServices": {
"service_name": "ATLAS",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.3"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "ATLAS_SERVER",
"display_name": "Atlas Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": {
"storm-site": {
"properties": {
"storm.topology.submission.notifier.plugin.class": "foo"
},
"property-attributes":{}
},
"ranger-storm-plugin-properties": {
"properties": {
"ranger-storm-plugin-enabled": "No"
}
}
},
"changed-configurations": [ ]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'}
self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendFalconConfigurations(self):
self.maxDiff = None
configurations = {
"falcon-startup.properties": {
"properties": {
"*.application.services": "foo"
}
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
'falcon-startup.properties': {
'properties': {
'*.application.services': 'foo,org.apache.falcon.atlas.service.AtlasService',
}
}
}
services = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/ATLAS",
"StackServices": {
"service_name": "ATLAS",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.3"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "ATLAS_SERVER",
"display_name": "Atlas Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": {
"falcon-startup.properties": {
"properties": {
"*.application.services": "foo"
}
}
},
"changed-configurations": [ ]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendFalconConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'}
self.stackAdvisor.recommendFalconConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendSqoopConfigurations(self):
self.maxDiff = None
configurations = {
"sqoop-site": {
"properties": {
"sqoop.job.data.publish.class": "foo"
}
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
'sqoop-site': {
'properties': {
'sqoop.job.data.publish.class': 'org.apache.atlas.sqoop.hook.SqoopHook',
}
}
}
services = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/ATLAS",
"StackServices": {
"service_name": "ATLAS",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.3"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "ATLAS_SERVER",
"display_name": "Atlas Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": {
"sqoop-site": {
"properties": {
"sqoop.job.data.publish.class": "foo"
}
}
},
"changed-configurations": [ ]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendSqoopConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'}
self.stackAdvisor.recommendSqoopConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendLogsearchConfiguration(self):
configurations = {
"logsearch-properties": {
"properties": {
"logsearch.collection.service.logs.numshards" : "5",
"logsearch.collection.service.logs.replication.factor": "0",
"logsearch.collection.audit.logs.numshards" : "5",
"logsearch.collection.audit.logs.replication.factor": "0"
}
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
'logsearch-properties': {
'properties': {
"logsearch.collection.service.logs.numshards" : "2",
"logsearch.collection.service.logs.replication.factor": "1",
"logsearch.collection.audit.logs.numshards" : "2",
"logsearch.collection.audit.logs.replication.factor": "1"
},
"property_attributes": {
"logsearch.collection.service.logs.numshards": {
"minimum": "1",
"maximum": "3"
},
"logsearch.collection.audit.logs.numshards": {
"minimum": "1",
"maximum": "3"
}
}
}
}
services = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.3/services/AMBARI_INFRA",
"StackServices": {
"service_name": "AMBARI_INFRA",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.3"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "INFRA_SOLR",
"display_name": "Infra Solr Instance",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": {
"logsearch-properties": {
"properties": {
"logsearch.collection.numshards" : "5",
"logsearch.collection.replication.factor": "0"
}
}
},
"changed-configurations": [ ]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
def return_c6401_hostname(services, service_name, component_name):
return ["c6401.ambari.apache.org"]
self.stackAdvisor.getComponentHostNames = return_c6401_hostname
self.stackAdvisor.recommendLogsearchConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_validateRangerConfigurationsEnv(self):
properties = {
"ranger-kafka-plugin-enabled": "Yes",
}
recommendedDefaults = {
"ranger-kafka-plugin-enabled": "No",
}
configurations = {
"cluster-env": {
"properties": {
"security_enabled": "false",
}
}
}
services = {
"services":
[
{
"StackServices": {
"service_name" : "RANGER"
}
}
],
"configurations": {
"cluster-env": {
"properties": {
"security_enabled" : "false"
},
"property_attributes": {}
}
}
}
# Test with ranger plugin enabled, validation fails
res_expected = [{'config-type': 'ranger-env', 'message': 'Ranger Kafka plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-kafka-plugin-enabled', 'level': 'WARN'}]
res = self.stackAdvisor.validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# Test for security_enabled is true
services['configurations']['cluster-env']['properties']['security_enabled'] = "true"
configurations['cluster-env']['properties']['security_enabled'] = "true"
res_expected = []
res = self.stackAdvisor.validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)