Repository: ambari Updated Branches: refs/heads/branch-2.5 f1cd0b76d -> d1d58ad8e
AMBARI-20175. Rebalance HDFS operation returns after the command is issued. (Laszlo Puskas via stoader) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d1d58ad8 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d1d58ad8 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d1d58ad8 Branch: refs/heads/branch-2.5 Commit: d1d58ad8e931684b6d4a592026aa9f3f38eafdc2 Parents: f1cd0b7 Author: Laszlo Puskas <lpus...@hortonworks.com> Authored: Fri Mar 3 21:00:57 2017 +0100 Committer: Toader, Sebastian <stoa...@hortonworks.com> Committed: Fri Mar 3 21:00:57 2017 +0100 ---------------------------------------------------------------------- .../2.1.0.2.0/package/scripts/hdfs_rebalance.py | 31 +++++++++++++++++++- .../HDFS/2.1.0.2.0/package/scripts/namenode.py | 14 ++++++--- .../python/stacks/2.0.6/HDFS/test_namenode.py | 19 ++++++++---- 3 files changed, 53 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/d1d58ad8/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py index 1dc545e..e0432a4 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py @@ -19,6 +19,10 @@ limitations under the License. ''' import re +import sys +from resource_management.core.exceptions import Fail +from resource_management.libraries.resources.execute_hadoop import ExecuteHadoop + class HdfsParser(): def __init__(self): @@ -127,4 +131,29 @@ class HdfsLine(): 'bytesBeingMoved': self.bytesBeingMoved, } def __str__(self): - return "[ date=%s,iteration=%d, bytesAlreadyMoved=%d, bytesLeftToMove=%d, bytesBeingMoved=%d]"%(self.date, self.iteration, self.bytesAlreadyMoved, self.bytesLeftToMove, self.bytesBeingMoved) \ No newline at end of file + return "[ date=%s,iteration=%d, bytesAlreadyMoved=%d, bytesLeftToMove=%d, bytesBeingMoved=%d]"%(self.date, self.iteration, self.bytesAlreadyMoved, self.bytesLeftToMove, self.bytesBeingMoved) + + + +def is_balancer_running(): + import params + check_balancer_command = "fs -test -e /system/balancer.id" + does_hdfs_file_exist = False + try: + _print("Checking if the balancer is running ...") + ExecuteHadoop(check_balancer_command, + user=params.hdfs_user, + logoutput=True, + conf_dir=params.hadoop_conf_dir, + bin_dir=params.hadoop_bin_dir) + + does_hdfs_file_exist = True + _print("Balancer is running. ") + except Fail: + pass + + return does_hdfs_file_exist + +def _print(line): + sys.stdout.write(line) + sys.stdout.flush() http://git-wip-us.apache.org/repos/asf/ambari/blob/d1d58ad8/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py index 123486e..350e704 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py @@ -341,10 +341,16 @@ class NameNodeDefault(NameNode): self.put_structured_out({'completePercent' : 1}) return - Execute(command, - on_new_line = handle_new_line, - logoutput = False, - ) + if (not hdfs_rebalance.is_balancer_running()): + # As the rebalance may take a long time (haours, days) the process is triggered only + # Tracking the progress based on the command output is no longer supported due to this + Execute(command, wait_for_finish=False) + + _print("The rebalance process has been triggered") + else: + _print("There is another balancer running. This means you or another Ambari user may have triggered the " + "operation earlier. The process may take a long time to finish (hours, even days). If the problem persists " + "please consult with the HDFS administrators if they have triggred or killed the operation.") if params.security_enabled: # Delete the kerberos credentials cache (ccache) file http://git-wip-us.apache.org/repos/asf/ambari/blob/d1d58ad8/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py index fae500f..da5d353 100644 --- a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py +++ b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py @@ -1205,8 +1205,10 @@ class TestNamenode(RMFTestCase): cd_access='a' ) + @patch("hdfs_rebalance.is_balancer_running") @patch("resource_management.libraries.script.Script.put_structured_out") - def test_rebalance_hdfs(self, pso): + def test_rebalance_hdfs(self, pso, hdfs_rebalance_mock): + hdfs_rebalance_mock.return_value = False self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/namenode.py", classname = "NameNode", command = "rebalancehdfs", @@ -1214,17 +1216,20 @@ class TestNamenode(RMFTestCase): stack_version = self.STACK_VERSION, target = RMFTestCase.TARGET_COMMON_SERVICES ) + self.assertResourceCalled('Execute', "ambari-sudo.sh su hdfs -l -s /bin/bash -c 'export PATH=/bin:/usr/bin ; hdfs --config /etc/hadoop/conf balancer -threshold -1'", - logoutput = False, - on_new_line = FunctionMock('handle_new_line'), + wait_for_finish=False ) + self.assertNoMoreResources() + @patch("hdfs_rebalance.is_balancer_running") @patch("resource_management.libraries.script.Script.put_structured_out") @patch("os.system") - def test_rebalance_secured_hdfs(self, pso, system_mock): + def test_rebalance_secured_hdfs(self, pso, system_mock, hdfs_rebalance_mock): system_mock.return_value = -1 + hdfs_rebalance_mock.return_value = False self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/namenode.py", classname = "NameNode", command = "rebalancehdfs", @@ -1241,13 +1246,15 @@ class TestNamenode(RMFTestCase): self.assertResourceCalled('Execute', kinit_cmd, user = 'hdfs', ) + self.assertResourceCalled('Execute', rebalance_cmd, - logoutput = False, - on_new_line = FunctionMock('handle_new_line'), + wait_for_finish=False ) + self.assertResourceCalled('File', ccache_path, action = ['delete'], ) + self.assertNoMoreResources() @patch("os.path.isfile")