You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by od...@apache.org on 2013/08/06 14:37:15 UTC
git commit: AMBARI-2809. Add support for install,
start and smoke test JournalNode slave Component in HDFS.
Updated Branches:
refs/heads/trunk e883524cb -> 80a8850ca
AMBARI-2809. Add support for install, start and smoke test JournalNode slave Component in HDFS.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/80a8850c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/80a8850c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/80a8850c
Branch: refs/heads/trunk
Commit: 80a8850cacd62871568605f02bc44b05094cc8bb
Parents: e883524
Author: Alex <alex@ubuntu.(none)>
Authored: Tue Aug 6 15:14:18 2013 +0300
Committer: Alex <alex@ubuntu.(none)>
Committed: Tue Aug 6 15:16:07 2013 +0300
----------------------------------------------------------------------
.../modules/hdp-hadoop/files/checkWebUI.py | 46 ++++++++++++++
.../hdp-hadoop/manifests/hdfs/service_check.pp | 64 +++++++++++++++++---
.../modules/hdp-hadoop/manifests/journalnode.pp | 60 ++++++++++++++++++
.../modules/hdp-hadoop/manifests/params.pp | 3 +
.../puppet/modules/hdp/manifests/configfile.pp | 2 +
.../main/puppet/modules/hdp/manifests/init.pp | 2 +
.../main/puppet/modules/hdp/manifests/params.pp | 3 +
.../main/python/ambari_agent/AmbariConfig.py | 6 +-
.../src/main/python/ambari_agent/LiveStatus.py | 2 +
.../java/org/apache/ambari/server/Role.java | 3 +-
.../apache/ambari/server/utils/StageUtils.java | 1 +
.../services/HDFS/configuration/hdfs-site.xml | 15 +++++
.../stacks/HDP/2.0.3/services/HDFS/metainfo.xml | 6 ++
13 files changed, 203 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/puppet/modules/hdp-hadoop/files/checkWebUI.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/puppet/modules/hdp-hadoop/files/checkWebUI.py b/ambari-agent/src/main/puppet/modules/hdp-hadoop/files/checkWebUI.py
new file mode 100644
index 0000000..2679e94
--- /dev/null
+++ b/ambari-agent/src/main/puppet/modules/hdp-hadoop/files/checkWebUI.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python2.6
+
+'''
+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 optparse
+import urllib
+
+#
+# Main.
+#
+def main():
+ parser = optparse.OptionParser(usage="usage: %prog [options] component ")
+ parser.add_option("-u", "--url", dest="url", help="Host:Port for WEB UI to check it availability")
+
+ (options, args) = parser.parse_args()
+
+ url = options.url
+
+ try:
+ httpCode = urllib.urlopen('http://' + url).getcode()
+ except Exception:
+ httpCode = 404
+
+ if httpCode != 200:
+ exit(1)
+ else:
+ exit(0)
+
+if __name__ == "__main__":
+ main()
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/hdfs/service_check.pp
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/hdfs/service_check.pp b/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/hdfs/service_check.pp
index ace972d..511fabe 100644
--- a/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/hdfs/service_check.pp
+++ b/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/hdfs/service_check.pp
@@ -62,14 +62,7 @@ class hdp-hadoop::hdfs::service_check()
notify => Hdp-hadoop::Exec-hadoop['hdfs::service_check::test']
}
- hdp-hadoop::exec-hadoop { 'hdfs::service_check::test':
- command => $test_cmd,
- refreshonly => true,
- user => $hdp::params::smokeuser,
- require => Hdp-hadoop::Exec-hadoop['hdfs::service_check::create_file'],
- #notify => Hdp-hadoop::Exec-hadoop['hdfs::service_check::cleanup'] #TODO: put in after testing
- before => Anchor['hdp-hadoop::hdfs::service_check::end'] #TODO: remove after testing
- }
+
#TODO: put in after testing
# hdp-hadoop::exec-hadoop { 'hdfs::service_check::cleanup':
@@ -78,6 +71,61 @@ class hdp-hadoop::hdfs::service_check()
# require => Hdp-hadoop::Exec-hadoop['hdfs::service_check::test'],
# before => Anchor['hdp-hadoop::hdfs::service_check::end']
#}
+
+ if hdp_is_empty($hdp::params::journalnode_hosts) {
+ ##No journalnode hosts, just run hdfs test
+ hdp-hadoop::exec-hadoop { 'hdfs::service_check::test':
+ command => $test_cmd,
+ refreshonly => true,
+ user => $hdp::params::smokeuser,
+ require => Hdp-hadoop::Exec-hadoop['hdfs::service_check::create_file'],
+ before => Anchor['hdp-hadoop::hdfs::service_check::end']
+ }
+ }
+ else {
+ ## Cluster has journalnode hosts, run hdfs test and test of journalnodes
+ hdp-hadoop::exec-hadoop { 'hdfs::service_check::test':
+ command => $test_cmd,
+ refreshonly => true,
+ user => $hdp::params::smokeuser,
+ require => Hdp-hadoop::Exec-hadoop['hdfs::service_check::create_file'],
+ before => Class['hdp-hadoop::journalnode::service_check']
+ }
+ class { 'hdp-hadoop::journalnode::service_check':
+ journalnode_host => $hdp::params::journalnode_hosts,
+ require => Hdp-hadoop::Exec-hadoop['hdfs::service_check::test'],
+ before => Anchor['hdp-hadoop::hdfs::service_check::end']
+ }
+ }
+
+
anchor{ 'hdp-hadoop::hdfs::service_check::end':}
}
+
+class hdp-hadoop::journalnode::service_check($journalnode_host)
+{
+
+ $journalnode_port = $hdp::params::journalnode_port
+ $smoke_test_user = $hdp::params::smokeuser
+
+ $checkWebUIFileName = "checkWebUI.py"
+ $checkWebUIFilePath = "/tmp/$checkWebUIFileName"
+
+ $checkWebUICmd = "su - ${smoke_test_user} -c 'python $checkWebUIFilePath -u $journalnode_host:$journalnode_port'"
+
+ file { $checkWebUIFilePath:
+ ensure => present,
+ source => "puppet:///modules/hdp-hadoop/$checkWebUIFileName",
+ mode => '0755'
+ }
+
+ exec { $checkWebUIFilePath:
+ command => $checkWebUICmd,
+ tries => 3,
+ try_sleep => 5,
+ path => '/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin',
+ logoutput => "true"
+}
+ anchor{"hdp-hadoop::smoketest::begin":} -> File[$checkWebUIFilePath] -> Exec[$checkWebUIFilePath] -> anchor{"hdp-hadoop::smoketest::end":}
+}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/journalnode.pp
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/journalnode.pp b/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/journalnode.pp
new file mode 100644
index 0000000..3d5aaa6
--- /dev/null
+++ b/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/journalnode.pp
@@ -0,0 +1,60 @@
+#
+#
+# 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.
+#
+#
+class hdp-hadoop::journalnode(
+ $service_state = $hdp::params::cluster_service_state,
+ $opts = {}
+) inherits hdp-hadoop::params
+{
+
+ $hdp::params::service_exists['hdp-hadoop::journalnode'] = true
+
+ Hdp-hadoop::Common<||>{service_states +> $service_state}
+ Hdp-hadoop::Package<||>{include_64_bit => true}
+ Hdp-hadoop::Configfile<||>{sizes +> 64}
+
+ $jn_edits_dir = $hdp-hadoop::params::jn_edits_dir
+ $hdfs_user = $hdp-hadoop::params::hdfs_user
+
+ if ($service_state == 'no_op') {
+ } elsif ($service_state in ['running','stopped','installed_and_configured','uninstalled']) {
+
+ #adds package, users and directories, and common hadoop configs
+ include hdp-hadoop::initialize
+
+ hdp::directory_recursive_create{ $jn_edits_dir:
+ service_state => $service_state,
+ force => true,
+ owner => $hdfs_user
+ }
+
+ hdp-hadoop::service{ 'journalnode':
+ ensure => $service_state,
+ user => $hdp-hadoop::params::hdfs_user,
+ create_pid_dir => true,
+ create_log_dir => true
+ }
+
+ #top level does not need anchors
+ Anchor['hdp-hadoop::begin'] -> Hdp::Directory_recursive_create[$jn_edits_dir] -> Hdp-hadoop::Service['journalnode'] -> Anchor['hdp-hadoop::end']
+ } else {
+ hdp_fail("TODO not implemented yet: service_state = ${service_state}")
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/params.pp
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/params.pp b/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/params.pp
index fe5efce..f1b96fc 100644
--- a/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/params.pp
+++ b/ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/params.pp
@@ -131,6 +131,9 @@ class hdp-hadoop::params(
$dfs_support_append = hdp_default("hdfs-site/dfs.support.append",true)
$dfs_webhdfs_enabled = hdp_default("hdfs-site/dfs.webhdfs.enabled",false)
+
+ $jn_edits_dir = hdp_default("hdfs-site/dfs.journalnode.edits.dir", "/grid/0/hdfs/journal")
+
######### mapred #######
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/puppet/modules/hdp/manifests/configfile.pp
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/puppet/modules/hdp/manifests/configfile.pp b/ambari-agent/src/main/puppet/modules/hdp/manifests/configfile.pp
index 84d8309..b768b1b 100644
--- a/ambari-agent/src/main/puppet/modules/hdp/manifests/configfile.pp
+++ b/ambari-agent/src/main/puppet/modules/hdp/manifests/configfile.pp
@@ -33,6 +33,7 @@ define hdp::configfile(
$nm_hosts = $hdp::params::nm_hosts,
$hs_host = $hdp::params::hs_host,
$slave_hosts = $hdp::params::slave_hosts,
+ $journalnode_hosts = $hdp::params::journalnode_hosts,
$mapred_tt_hosts = $hdp::params::mapred_tt_hosts,
$all_hosts = $hdp::params::all_hosts,
$hbase_rs_hosts = $hdp::params::hbase_rs_hosts,
@@ -53,6 +54,7 @@ define hdp::configfile(
$public_rm_host = $hdp::params::public_rm_host,
$public_nm_hosts = $hdp::params::public_nm_hosts,
$public_hs_host = $hdp::params::public_hs_host,
+ $public_journalnode_hosts = $hdp::params::public_journalnode_hosts,
$public_jtnode_host = $hdp::params::public_jtnode_host,
$public_hbase_master_hosts = $hdp::params::public_hbase_master_hosts,
$public_zookeeper_hosts = $hdp::params::public_zookeeper_hosts,
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/puppet/modules/hdp/manifests/init.pp
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/puppet/modules/hdp/manifests/init.pp b/ambari-agent/src/main/puppet/modules/hdp/manifests/init.pp
index 1a0bf32..7a53ed6 100644
--- a/ambari-agent/src/main/puppet/modules/hdp/manifests/init.pp
+++ b/ambari-agent/src/main/puppet/modules/hdp/manifests/init.pp
@@ -39,10 +39,12 @@ class hdp(
$namenode_port = hdp_get_port_from_url($hdfs-site["dfs.http.address"])
$snamenode_port = hdp_get_port_from_url($hdfs-site["dfs.secondary.http.address"])
$datanode_port = hdp_get_port_from_url($hdfs-site["dfs.datanode.http.address"])
+ $journalnode_port = hdp_get_port_from_url($hdfs-site["dfs.journalnode.http-address"])
} else {
$namenode_port = "50070"
$snamenode_port = "50090"
$datanode_port = "50075"
+ $journalnode_port = "8480"
}
if has_key($configuration, 'mapred-site') {
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/puppet/modules/hdp/manifests/params.pp
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/puppet/modules/hdp/manifests/params.pp b/ambari-agent/src/main/puppet/modules/hdp/manifests/params.pp
index 5a2b91b..b27bff5 100644
--- a/ambari-agent/src/main/puppet/modules/hdp/manifests/params.pp
+++ b/ambari-agent/src/main/puppet/modules/hdp/manifests/params.pp
@@ -64,6 +64,7 @@ class hdp::params()
$snamenode_host = hdp_default("snamenode_host")
$jtnode_host = hdp_default("jtnode_host")
$slave_hosts = hdp_default("slave_hosts")
+ $journalnode_hosts = hdp_default("journalnode_hosts")
$nn_principal_str = hdp_default("hdfs-site/dfs.namenode.kerberos.principal", "nn/_HOST@EXAMPLE.COM")
if ("_HOST" in $nn_principal_str and hdp_is_empty($namenode_host) == false) {
@@ -154,6 +155,7 @@ class hdp::params()
$public_rm_host = hdp_host_attribute($hostAttributes,"publicfqdn",$rm_host)
$public_nm_hosts = hdp_host_attribute($hostAttributes,"publicfqdn",$nm_hosts)
$public_hs_host = hdp_host_attribute($hostAttributes,"publicfqdn",$hs_host)
+ $public_journalnode_hosts = hdp_host_attribute($hostAttributes,"publicfqdn",$journalnode_hosts)
$public_jtnode_host = hdp_host_attribute($hostAttributes,"publicfqdn",$jtnode_host)
$public_hbase_master_hosts = hdp_host_attribute($hostAttributes,"publicfqdn",$hbase_master_hosts)
$public_zookeeper_hosts = hdp_host_attribute($hostAttributes,"publicfqdn",$zookeeper_hosts)
@@ -169,6 +171,7 @@ class hdp::params()
$public_rm_host = hdp_default("rm_host")
$public_nm_hosts = hdp_default("nm_hosts")
$public_hs_host = hdp_default("hs_host")
+ $public_journalnode_hosts = hdp_default("journalnode_hosts")
$public_jtnode_host = hdp_default("jtnode_host")
$public_hbase_master_hosts = hdp_default("hbase_master_hosts")
$public_zookeeper_hosts = hdp_default("zookeeper_hosts")
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py b/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
index 9dad41a..567044d 100644
--- a/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
+++ b/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py
@@ -134,7 +134,9 @@ rolesToClass = {
'HISTORYSERVER_SERVICE_CHECK': 'hdp-yarn::historyserver::service_check',
'TEZ_CLIENT': 'hdp-tez::tez_client',
'YARN_SERVICE_CHECK': 'hdp-yarn::yarn::service_check',
- 'FLUME_SERVER': 'hdp-flume'
+ 'FLUME_SERVER': 'hdp-flume',
+ 'JOURNALNODE': 'hdp-hadoop::journalnode',
+ 'JOURNALNODE_SERVICE_CHECK': 'hdp-hadoop::journalnode::service_check'
}
serviceStates = {
@@ -153,6 +155,7 @@ servicesToPidNames = {
'RESOURCEMANAGER': 'yarn-{USER}-resourcemanager.pid$',
'NODEMANAGER': 'yarn-{USER}-nodemanager.pid$',
'HISTORYSERVER': 'mapred-{USER}-historyserver.pid$',
+ 'JOURNALNODE': 'hadoop-{USER}-journalnode.pid$',
'OOZIE_SERVER': 'oozie.pid',
'ZOOKEEPER_SERVER': 'zookeeper_server.pid',
'FLUME_SERVER': 'flume-node.pid',
@@ -176,6 +179,7 @@ servicesToLinuxUser = {
'NAMENODE': 'hdfs_user',
'SECONDARY_NAMENODE': 'hdfs_user',
'DATANODE': 'hdfs_user',
+ 'JOURNALNODE': 'hdfs_user',
'JOBTRACKER': 'mapred_user',
'TASKTRACKER': 'mapred_user',
'RESOURCEMANAGER': 'yarn_user',
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-agent/src/main/python/ambari_agent/LiveStatus.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/LiveStatus.py b/ambari-agent/src/main/python/ambari_agent/LiveStatus.py
index 087582d..44e0588 100644
--- a/ambari-agent/src/main/python/ambari_agent/LiveStatus.py
+++ b/ambari-agent/src/main/python/ambari_agent/LiveStatus.py
@@ -43,6 +43,8 @@ class LiveStatus:
"componentName" : "NAMENODE"},
{"serviceName" : "HDFS",
"componentName" : "SECONDARY_NAMENODE"},
+ {"serviceName" : "HDFS",
+ "componentName" : "JOURNALNODE"},
{"serviceName" : "MAPREDUCE",
"componentName" : "JOBTRACKER"},
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-server/src/main/java/org/apache/ambari/server/Role.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/Role.java b/ambari-server/src/main/java/org/apache/ambari/server/Role.java
index 82180dc..18f318c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/Role.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/Role.java
@@ -82,5 +82,6 @@ public enum Role {
YARN_CLIENT,
HISTORYSERVER,
TEZ_CLIENT,
- FLUME_SERVER
+ FLUME_SERVER,
+ JOURNALNODE
}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
index c4e9dcf..59660f9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
@@ -89,6 +89,7 @@ public class StageUtils {
componentToClusterInfoKeyMap.put("RESOURCEMANAGER", "rm_host");
componentToClusterInfoKeyMap.put("NODEMANAGER", "nm_hosts");
componentToClusterInfoKeyMap.put("HISTORYSERVER", "hs_host");
+ componentToClusterInfoKeyMap.put("JOURNALNODE", "journalnode_hosts");
componentToClusterInfoKeyMap.put("ZOOKEEPER_SERVER", "zookeeper_hosts");
componentToClusterInfoKeyMap.put("FLUME_SERVER", "flume_hosts");
componentToClusterInfoKeyMap.put("HBASE_MASTER", "hbase_master_hosts");
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/configuration/hdfs-site.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/configuration/hdfs-site.xml b/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/configuration/hdfs-site.xml
index 10d58c5..fcd6015 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/configuration/hdfs-site.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/configuration/hdfs-site.xml
@@ -455,5 +455,20 @@ don't exist, they will be created with this permission.</description>
<value>30000</value>
<description>Datanode is stale after not getting a heartbeat in this interval in ms</description>
</property>
+
+ <property>
+ <name>dfs.journalnode.http-address</name>
+ <value>0.0.0.0:8480</value>
+ <description>The address and port the JournalNode web UI listens on.
+ If the port is 0 then the server will start on a free port. </description>
+ </property>
+
+ <property>
+ <name>dfs.journalnode.edits.dir</name>
+ <value>/grid/0/hdfs/journal</value>
+ <description>The path where the JournalNode daemon will store its local state. </description>
+ </property>
+
+
</configuration>
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/80a8850c/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/metainfo.xml
index 8514121..7eb4d8c 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.3/services/HDFS/metainfo.xml
@@ -40,6 +40,12 @@
<name>HDFS_CLIENT</name>
<category>CLIENT</category>
</component>
+
+ <component>
+ <name>JOURNALNODE</name>
+ <category>SLAVE</category>
+ </component>
+
</components>