/** * 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. */ package org.apache.hive.jdbc; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.security.GroupMappingServiceProvider; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulerConfiguration; import org.apache.hive.jdbc.miniHS2.MiniHS2; import org.apache.hive.jdbc.miniHS2.MiniHS2.MiniClusterType; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class TestSchedulerQueue { // hadoop group mapping that maps user to same group public static class HiveTestSimpleGroupMapping implements GroupMappingServiceProvider { public static String primaryTag = ""; @Override public List<String> getGroups(String user) throws IOException { List<String> results = new ArrayList<String>(); results.add(user + primaryTag); results.add(user + "-group"); return results; } @Override public void cacheGroupsRefresh() throws IOException { } @Override public void cacheGroupsAdd(List<String> groups) throws IOException { } } private MiniHS2 miniHS2 = null; private static HiveConf conf = new HiveConf(); private Connection hs2Conn = null; @BeforeClass public static void beforeTest() throws Exception { Class.forName(MiniHS2.getJdbcDriverName()); conf.set("hadoop.security.group.mapping", HiveTestSimpleGroupMapping.class.getName()); } @Before public void setUp() throws Exception { DriverManager.setLoginTimeout(0); miniHS2 = new MiniHS2(conf, MiniClusterType.MR); miniHS2.setConfProperty(HiveConf.ConfVars.HIVE_SERVER2_ENABLE_DOAS.varname, "false"); miniHS2.setConfProperty(HiveConf.ConfVars.HIVE_SERVER2_MAP_FAIR_SCHEDULER_QUEUE.varname, "true"); miniHS2.setConfProperty(YarnConfiguration.RM_SCHEDULER, "org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler"); miniHS2.start(new HashMap<String, String>()); HiveTestSimpleGroupMapping.primaryTag = ""; } @After public void tearDown() throws Exception { if (hs2Conn != null) { hs2Conn.close(); } if (miniHS2 != null && miniHS2.isStarted()) { miniHS2.stop(); } System.clearProperty("mapreduce.job.queuename"); } /** * Verify: * Test is running with MR2 and queue mapping defaults are set. * Queue mapping is set for the connected user. * * @throws Exception */ @Test public void testFairSchedulerQueueMapping() throws Exception { hs2Conn = DriverManager.getConnection(miniHS2.getJdbcURL(), "user1", "bar"); verifyProperty(HiveConf.ConfVars.HIVE_SERVER2_ENABLE_DOAS.varname, "false"); verifyProperty("mapreduce.framework.name", "yarn"); verifyProperty(HiveConf.ConfVars.HIVE_SERVER2_MAP_FAIR_SCHEDULER_QUEUE.varname, "true"); verifyProperty(YarnConfiguration.RM_SCHEDULER, "org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler"); verifyProperty("mapreduce.job.queuename", "root.user1"); } /** * Verify: * Test is running with MR2 and queue mapping are set correctly for primary group rule. * @throws Exception */ @Test public void testFairSchedulerPrimaryQueueMapping() throws Exception { miniHS2.setConfProperty(FairSchedulerConfiguration.ALLOCATION_FILE, "fair-scheduler-test.xml"); HiveTestSimpleGroupMapping.primaryTag = "-test"; hs2Conn = DriverManager.getConnection(miniHS2.getJdbcURL(), "user2", "bar"); verifyProperty("mapreduce.job.queuename", "root.user2" + HiveTestSimpleGroupMapping.primaryTag); } /** * Verify: * Test is running with MR2 and queue mapping are set correctly for primary group rule. * @throws Exception */ @Test public void testFairSchedulerSecondaryQueueMapping() throws Exception { miniHS2.setConfProperty(FairSchedulerConfiguration.ALLOCATION_FILE, "fair-scheduler-test.xml"); hs2Conn = DriverManager.getConnection(miniHS2.getJdbcURL(), "user3", "bar"); verifyProperty("mapreduce.job.queuename", "root.user3-group"); } /** * Verify that the queue refresh doesn't happen when configured to be off. * * @throws Exception */ @Test public void testQueueMappingCheckDisabled() throws Exception { miniHS2.setConfProperty( HiveConf.ConfVars.HIVE_SERVER2_MAP_FAIR_SCHEDULER_QUEUE.varname, "false"); hs2Conn = DriverManager.getConnection(miniHS2.getJdbcURL(), "user1", "bar"); verifyProperty(HiveConf.ConfVars.HIVE_SERVER2_MAP_FAIR_SCHEDULER_QUEUE.varname, "false"); verifyProperty("mapreduce.job.queuename", YarnConfiguration.DEFAULT_QUEUE_NAME); } /** * Verify that the given property contains the expected value. * * @param propertyName * @param expectedValue * @throws Exception */ private void verifyProperty(String propertyName, String expectedValue) throws Exception { Statement stmt = hs2Conn .createStatement(); ResultSet res = stmt.executeQuery("set " + propertyName); assertTrue(res.next()); String results[] = res.getString(1).split("="); assertEquals("Property should be set", results.length, 2); assertEquals("Property should be set", expectedValue, results[1]); } }