This is an automated email from the ASF dual-hosted git repository.

jialiang pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 8330c6b731 AMBARI-26055: Add alluxio support (#3934)
8330c6b731 is described below

commit 8330c6b731e3e53116dafc7745e9408a02e4ab3d
Author: zrain <[email protected]>
AuthorDate: Mon Jan 20 13:21:17 2025 +0800

    AMBARI-26055: Add alluxio support (#3934)
    
    * add alluxio service
    
    Co-authored-by: jialiang <[email protected]>
    
    * fix license
    
    ---------
    
    Co-authored-by: jialiang <[email protected]>
---
 .../BIGTOP/3.2.0/properties/stack_packages.json    |  26 ++
 .../BIGTOP/3.2.0/services/ALLUXIO/alerts.json      |  59 ++++
 .../services/ALLUXIO/configuration/alluxio-env.xml | 232 ++++++++++++++++
 .../configuration/alluxio-log4j-properties.xml     | 244 +++++++++++++++++
 .../configuration/alluxio-metrics-properties.xml   | 132 +++++++++
 .../configuration/alluxio-site-properties.xml      | 153 +++++++++++
 .../BIGTOP/3.2.0/services/ALLUXIO/kerberos.json    |  70 +++++
 .../BIGTOP/3.2.0/services/ALLUXIO/metainfo.xml     | 132 +++++++++
 .../services/ALLUXIO/package/scripts/master.py     | 184 +++++++++++++
 .../services/ALLUXIO/package/scripts/params.py     | 305 +++++++++++++++++++++
 .../ALLUXIO/package/scripts/service_check.py       |  43 +++
 .../services/ALLUXIO/package/scripts/worker.py     | 147 ++++++++++
 .../services/ALLUXIO/package/templates/masters.j2  |  19 ++
 .../services/ALLUXIO/package/templates/workers.j2  |  19 ++
 .../services/ALLUXIO/quicklinks/quicklinks.json    |  21 ++
 .../3.2.0/services/ALLUXIO/role_command_order.json |   8 +
 .../3.2.0/services/ALLUXIO/service_advisor.py      | 210 ++++++++++++++
 17 files changed, 2004 insertions(+)

diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/properties/stack_packages.json
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/properties/stack_packages.json
index 3025e61075..3cbda98976 100644
--- 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/properties/stack_packages.json
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/properties/stack_packages.json
@@ -1,6 +1,32 @@
 {
   "BIGTOP": {
     "stack-select": {
+      "ALLUXIO": {
+        "ALLUXIO_MASTER": {
+          "STACK-SELECT-PACKAGE": "alluxio",
+          "INSTALL": [
+            "alluxio"
+          ],
+          "PATCH": [
+            "alluxio"
+          ],
+          "STANDARD": [
+            "alluxio"
+          ]
+        },
+        "ALLUXIO_WORKER": {
+          "STACK-SELECT-PACKAGE": "alluxio",
+          "INSTALL": [
+            "alluxio"
+          ],
+          "PATCH": [
+            "alluxio"
+          ],
+          "STANDARD": [
+            "alluxio"
+          ]
+        }
+      },
       "HBASE": {
         "HBASE_CLIENT": {
           "STACK-SELECT-PACKAGE": "hbase-client",
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/alerts.json
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/alerts.json
new file mode 100755
index 0000000000..b82dec8c80
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/alerts.json
@@ -0,0 +1,59 @@
+{
+  "ALLUXIO": {
+    "service": [],
+    "ALLUXIO_MASTER": [
+      {
+        "name": "ALLUXIO_MASTER_PROCESS",
+        "label": "alluxio master",
+        "description": "This host-level alert is triggered if the alluxio 
msater cannot be determined to be up.",
+        "interval": 1,
+        "scope": "HOST",
+        "source": {
+          "type": "PORT",
+          "uri": "{{alluxio-log4j-properties/alluxio.master.rpc.port}}",
+          "default_port": 19998,
+          "reporting": {
+            "ok": {
+              "text": "TCP OK - {0:.3f}s response on port {1}"
+            },
+            "warning": {
+              "text": "TCP OK - {0:.3f}s response on port {1}",
+              "value": 1.5
+            },
+            "critical": {
+              "text": "Connection failed: {0} to {1}:{2}",
+              "value": 5
+            }
+          }
+        }
+      }
+    ],
+    "ALLUXIO_WORKER": [
+      {
+        "name": "ALLUXIO_WORKER_PROCESS",
+        "label": "alluxio worker",
+        "description": "This host-level alert is triggered if the alluxio 
worker cannot be determined to be up.",
+        "interval": 1,
+        "scope": "HOST",
+        "source": {
+          "type": "PORT",
+          "uri": "{{alluxio-log4j-properties/alluxio.worker.rpc.port}}",
+          "default_port": 29999,
+          "reporting": {
+            "ok": {
+              "text": "TCP OK - {0:.3f}s response on port {1}"
+            },
+            "warning": {
+              "text": "TCP OK - {0:.3f}s response on port {1}",
+              "value": 1.5
+            },
+            "critical": {
+              "text": "Connection failed: {0} to {1}:{2}",
+              "value": 5
+            }
+          }
+        }
+      }
+    ]
+  }
+}
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-env.xml
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-env.xml
new file mode 100755
index 0000000000..72917b6ed0
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-env.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration supports_final="true">
+    <property>
+        <name>alluxio_user</name>
+        <display-name>Alluxio User</display-name>
+        <value>alluxio</value>
+        <property-type>USER</property-type>
+        <value-attributes>
+            <type>user</type>
+            <overridable>false</overridable>
+            <user-groups>
+                <property>
+                    <type>cluster-env</type>
+                    <name>user_group</name>
+                </property>
+                <property>
+                    <type>alluxio-env</type>
+                    <name>alluxio_group</name>
+                </property>
+            </user-groups>
+        </value-attributes>
+        <on-ambari-upgrade add="true"/>
+    </property>
+    <property>
+        <name>alluxio_group</name>
+        <display-name>Alluxio Group</display-name>
+        <value>hadoop</value>
+        <property-type>GROUP</property-type>
+        <description>alluxio group</description>
+        <value-attributes>
+            <type>user</type>
+        </value-attributes>
+        <on-ambari-upgrade add="true"/>
+    </property>
+    <property>
+        <name>alluxio_log_dir</name>
+        <display-name>Alluxio Log directory</display-name>
+        <value>/var/log/alluxio</value>
+        <description>Alluxio Log Dir</description>
+        <value-attributes>
+            <type>directory</type>
+        </value-attributes>
+        <on-ambari-upgrade add="true"/>
+    </property>
+    <property>
+        <name>alluxio_pid_dir</name>
+        <display-name>Alluxio PID directory</display-name>
+        <value>/var/run/alluxio</value>
+        <value-attributes>
+            <type>directory</type>
+        </value-attributes>
+        <on-ambari-upgrade add="true"/>
+    </property>
+
+  <property>
+    <name>alluxio_service_keytab</name>
+    <description>Alluxio keytab path</description>
+    <on-ambari-upgrade add="false"/>
+  </property>
+  <property>
+    <name>alluxio_service_principal</name>
+    <description>Alluxio principal</description>
+    <property-type>KERBEROS_PRINCIPAL</property-type>
+    <on-ambari-upgrade add="false"/>
+  </property>
+
+  <property>
+    <name>alluxio_keytab</name>
+    <description>Alluxio keytab path</description>
+    <on-ambari-upgrade add="false"/>
+  </property>
+  <property>
+    <name>alluxio_principal</name>
+    <description>Alluxio principal</description>
+    <property-type>KERBEROS_PRINCIPAL</property-type>
+    <on-ambari-upgrade add="false"/>
+  </property> 
+
+    <!-- alluxio-env.sh -->
+    <property>
+        <name>content</name>
+        <description>This is the jinja template for alluxio-env.sh 
file</description>
+        <value>
+
+#!/usr/bin/env bash
+#
+# The Alluxio Open Foundation licenses this work under the Apache License, 
version 2.0
+# (the "License"). You may not use this work except in compliance with the 
License, which is
+# available at www.apache.org/licenses/LICENSE-2.0
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR 
CONDITIONS OF ANY KIND,
+# either express or implied, as more fully set forth in the License.
+#
+# See the NOTICE file distributed with this work for information regarding 
copyright ownership.
+#
+
+# Copy this file as alluxio-env.sh and edit it to configure Alluxio for your
+# site. This file is sourced to launch Alluxio servers or use Alluxio shell
+# commands.
+#
+# This file is an optional approach to configure Alluxio options by setting the
+# following listed environment variables. Note that, setting this file will not
+# affect jobs (e.g., Spark job or MapReduce job) that are using Alluxio client
+# as a library. Alternatively, it is recommended to create 
alluxio-site.properties file,
+# which supports all the configuration options provided by Alluxio
+# (https://docs.alluxio.io/os/user/stable/en/reference/Properties-List.html),
+# and is respected by both external jobs and Alluxio servers (or shell).
+
+# This file also allows you to configure Alluxio remote debugging as outlined 
here:
+# 
https://docs.alluxio.io/os/user/stable/en/operation/Troubleshooting.html#alluxio-remote-debug
+
+# JVM is required to run Alluxio.
+# If its path is not set in Shell, please specify either of following 
environment variables
+# JAVA_HOME
+# JAVA
+
+JAVA_HOME={{java_home}}
+
+# The directory where log files are stored. (Default: ${ALLUXIO_HOME}/logs).
+# ALLUXIO_LOGS_DIR
+
+# The hostname for log server. If set, remote logging is enabled.
+# ALLUXIO_LOGSERVER_HOSTNAME
+# If remote logging is enabled, the port for log server. (Default: 45600)
+# ALLUXIO_LOGSERVER_PORT
+# If remote logging is enabled, the directory where log server log files are 
stored. (Default: ${ALLUXIO_HOME}/logs)
+# ALLUXIO_LOGSERVER_LOGS_DIR
+
+# Config properties set for Alluxio master, worker and shell. (Default: "")
+# E.g. "-Dalluxio.master.rpc.port=39999"
+# ALLUXIO_JAVA_OPTS
+
+ALLUXIO_JAVA_OPTS+=" 
-Djava.library.path=/usr/hdp/current/hadoop-client/lib/native/ "
+
+# Config properties set for Alluxio master daemon. (Default: "")
+# E.g. "-Dalluxio.master.rpc.port=39999"
+# ALLUXIO_MASTER_JAVA_OPTS
+
+# Config properties set for Alluxio job master daemon. (Default: "")
+# E.g. " -javaagent:./jmx_prometheus_javaagent-0.16.0.jar=8080:./config.yaml "
+# ALLUXIO_JOB_MASTER_JAVA_OPTS
+
+# Config properties set for Alluxio worker daemon. (Default: "")
+# E.g. "-Dalluxio.worker.rpc.port=49999" to set worker port, "-Xms2048M 
-Xmx2048M" to limit the heap size of worker.
+# ALLUXIO_WORKER_JAVA_OPTS
+
+# Config properties set for Alluxio job worker daemon. (Default: "")
+# E.g. " -javaagent:./jmx_prometheus_javaagent-0.16.0.jar=18080:./config.yaml "
+# ALLUXIO_JOB_WORKER_JAVA_OPTS
+
+# Config properties set for Alluxio proxy daemon. (Default: "")
+# E.g. "-Xms2048M -Xmx2048M" to limit the heap size of proxy.
+# ALLUXIO_PROXY_JAVA_OPTS
+
+# Config properties set for Alluxio log server daemon. (Default: "")
+# E.g. "-Xms2048M -Xmx2048M" to limit the heap size of log server.
+# ALLUXIO_LOGSERVER_JAVA_OPTS
+
+# Config properties set for Alluxio shell. (Default: "")
+# E.g. "-Dalluxio.user.file.writetype.default=CACHE_THROUGH"
+# ALLUXIO_USER_JAVA_OPTS
+
+# Additional classpath entries for Alluxio processes. (Default: "")
+# E.g. "/path/to/library1/:/path/to/library2/"
+# ALLUXIO_CLASSPATH
+
+# Configuring remote debugging for Alluxio master process. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60001"
+# ALLUXIO_MASTER_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio secondary master process. (Default: 
"")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60010"
+# ALLUXIO_SECONDARY_MASTER_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio job master process. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60002"
+# ALLUXIO_JOB_MASTER_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio worker process. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60003"
+# ALLUXIO_WORKER_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio job worker process. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60004"
+# ALLUXIO_JOB_WORKER_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio proxy process. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60005"
+# ALLUXIO_PROXY_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio log server process. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60006"
+# ALLUXIO_LOGSERVER_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio fuse process. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60009"
+# ALLUXIO_FUSE_ATTACH_OPTS
+
+# Configuring remote debugging for Alluxio shell. (Default: "")
+# E.g. "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=60000"
+# ALLUXIO_USER_ATTACH_OPTS
+
+# Config LANG to support different characters in filenames
+# export LANG=en_US.UTF-8
+
+        </value>
+        <value-attributes>
+            <type>content</type>
+        </value-attributes>
+        <on-ambari-upgrade add="true"/>
+    </property>
+</configuration>
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-log4j-properties.xml
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-log4j-properties.xml
new file mode 100755
index 0000000000..a6ff8df89e
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-log4j-properties.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration supports_final="true">
+    <property>
+        <name>content</name>
+        <description>alluxio-log4j2-properties</description>
+        <value>
+#
+# The Alluxio Open Foundation licenses this work under the Apache License, 
version 2.0
+# (the "License"). You may not use this work except in compliance with the 
License, which is
+# available at www.apache.org/licenses/LICENSE-2.0
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR 
CONDITIONS OF ANY KIND,
+# either express or implied, as more fully set forth in the License.
+#
+# See the NOTICE file distributed with this work for information regarding 
copyright ownership.
+#
+
+# May get overridden by System Property
+
+log4j.rootLogger=INFO, ${alluxio.logger.type}, ${alluxio.remote.logger.type}
+
+log4j.category.alluxio.logserver=INFO, ${alluxio.logserver.logger.type}
+log4j.additivity.alluxio.logserver=false
+
+log4j.logger.AUDIT_LOG=INFO, ${alluxio.master.audit.logger.type}
+log4j.logger.JOB_MASTER_AUDIT_LOG=INFO, ${alluxio.job.master.audit.logger.type}
+log4j.logger.PROXY_AUDIT_LOG=INFO, ${alluxio.proxy.audit.logger.type}
+log4j.additivity.AUDIT_LOG=false
+log4j.additivity.JOB_MASTER_AUDIT_LOG=false
+log4j.additivity.PROXY_AUDIT_LOG=false
+
+# Configures an appender whose name is "" (empty string) to be NullAppender.
+# By default, if a Java class does not specify a particular appender, log4j 
will
+# use "" as the appender name, then it will use Null appender.
+log4j.appender.=org.apache.log4j.varia.NullAppender
+
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.Target=System.out
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+log4j.appender.Console.layout.ConversionPattern=%d{ISO8601} %-5p [%t](%F:%L) - 
%m%n
+
+# The ParquetWriter logs for every row group which is not noisy for large row 
group size,
+# but very noisy for small row group size.
+log4j.logger.org.apache.parquet.hadoop.InternalParquetRecordWriter=WARN
+log4j.logger.org.apache.parquet.hadoop.InternalParquetRecordReader=WARN
+
+# Appender for Job Master
+log4j.appender.JOB_MASTER_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.JOB_MASTER_LOGGER.File=${alluxio.logs.dir}/job_master.log
+log4j.appender.JOB_MASTER_LOGGER.MaxFileSize=10MB
+log4j.appender.JOB_MASTER_LOGGER.MaxBackupIndex=100
+log4j.appender.JOB_MASTER_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.JOB_MASTER_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Appender for Job Workers
+log4j.appender.JOB_WORKER_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.JOB_WORKER_LOGGER.File=${alluxio.logs.dir}/job_worker.log
+log4j.appender.JOB_WORKER_LOGGER.MaxFileSize=10MB
+log4j.appender.JOB_WORKER_LOGGER.MaxBackupIndex=100
+log4j.appender.JOB_WORKER_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.JOB_WORKER_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Appender for Master
+log4j.appender.MASTER_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.MASTER_LOGGER.File=${alluxio.logs.dir}/master.log
+log4j.appender.MASTER_LOGGER.MaxFileSize=10MB
+log4j.appender.MASTER_LOGGER.MaxBackupIndex=100
+log4j.appender.MASTER_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.MASTER_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Appender for Master
+log4j.appender.SECONDARY_MASTER_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.SECONDARY_MASTER_LOGGER.File=${alluxio.logs.dir}/secondary_master.log
+log4j.appender.SECONDARY_MASTER_LOGGER.MaxFileSize=10MB
+log4j.appender.SECONDARY_MASTER_LOGGER.MaxBackupIndex=100
+log4j.appender.SECONDARY_MASTER_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.SECONDARY_MASTER_LOGGER.layout.ConversionPattern=%d{ISO8601} 
%-5p [%t](%F:%L) - %m%n
+
+# Appender for Master audit
+log4j.appender.MASTER_AUDIT_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.MASTER_AUDIT_LOGGER.File=${alluxio.logs.dir}/master_audit.log
+log4j.appender.MASTER_AUDIT_LOGGER.MaxFileSize=10MB
+log4j.appender.MASTER_AUDIT_LOGGER.MaxBackupIndex=100
+log4j.appender.MASTER_AUDIT_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.MASTER_AUDIT_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Appender for Job Master audit
+log4j.appender.JOB_MASTER_AUDIT_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.JOB_MASTER_AUDIT_LOGGER.File=${alluxio.logs.dir}/job_master_audit.log
+log4j.appender.JOB_MASTER_AUDIT_LOGGER.MaxFileSize=10MB
+log4j.appender.JOB_MASTER_AUDIT_LOGGER.MaxBackupIndex=100
+log4j.appender.JOB_MASTER_AUDIT_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.JOB_MASTER_AUDIT_LOGGER.layout.ConversionPattern=%d{ISO8601} 
%-5p [%t](%F:%L) - %m%n
+
+# Appender for Proxy
+log4j.appender.PROXY_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.PROXY_LOGGER.File=${alluxio.logs.dir}/proxy.log
+log4j.appender.PROXY_LOGGER.MaxFileSize=10MB
+log4j.appender.PROXY_LOGGER.MaxBackupIndex=100
+log4j.appender.PROXY_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.PROXY_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Appender for Proxy audit
+log4j.appender.PROXY_AUDIT_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.PROXY_AUDIT_LOGGER.File=${alluxio.logs.dir}/proxy_audit.log
+log4j.appender.PROXY_AUDIT_LOGGER.MaxFileSize=10MB
+log4j.appender.PROXY_AUDIT_LOGGER.MaxBackupIndex=100
+log4j.appender.PROXY_AUDIT_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.PROXY_AUDIT_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
%c{2}[%t](%F:%M:%L) - %m%n
+
+# Appender for Workers
+log4j.appender.WORKER_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.WORKER_LOGGER.File=${alluxio.logs.dir}/worker.log
+log4j.appender.WORKER_LOGGER.MaxFileSize=10MB
+log4j.appender.WORKER_LOGGER.MaxBackupIndex=100
+log4j.appender.WORKER_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.WORKER_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Remote appender for Job Master
+log4j.appender.REMOTE_JOB_MASTER_LOGGER=org.apache.log4j.net.SocketAppender
+log4j.appender.REMOTE_JOB_MASTER_LOGGER.Port=${alluxio.logserver.port}
+log4j.appender.REMOTE_JOB_MASTER_LOGGER.RemoteHost=${alluxio.logserver.hostname}
+log4j.appender.REMOTE_JOB_MASTER_LOGGER.ReconnectionDelay=10000
+log4j.appender.REMOTE_JOB_MASTER_LOGGER.filter.ID=alluxio.AlluxioRemoteLogFilter
+log4j.appender.REMOTE_JOB_MASTER_LOGGER.filter.ID.ProcessType=JOB_MASTER
+log4j.appender.REMOTE_JOB_MASTER_LOGGER.Threshold=WARN
+
+# Remote appender for Job Workers
+log4j.appender.REMOTE_JOB_WORKER_LOGGER=org.apache.log4j.net.SocketAppender
+log4j.appender.REMOTE_JOB_WORKER_LOGGER.Port=${alluxio.logserver.port}
+log4j.appender.REMOTE_JOB_WORKER_LOGGER.RemoteHost=${alluxio.logserver.hostname}
+log4j.appender.REMOTE_JOB_WORKER_LOGGER.ReconnectionDelay=10000
+log4j.appender.REMOTE_JOB_WORKER_LOGGER.filter.ID=alluxio.AlluxioRemoteLogFilter
+log4j.appender.REMOTE_JOB_WORKER_LOGGER.filter.ID.ProcessType=JOB_WORKER
+log4j.appender.REMOTE_JOB_WORKER_LOGGER.Threshold=WARN
+
+# Remote appender for Master
+log4j.appender.REMOTE_MASTER_LOGGER=org.apache.log4j.net.SocketAppender
+log4j.appender.REMOTE_MASTER_LOGGER.Port=${alluxio.logserver.port}
+log4j.appender.REMOTE_MASTER_LOGGER.RemoteHost=${alluxio.logserver.hostname}
+log4j.appender.REMOTE_MASTER_LOGGER.ReconnectionDelay=10000
+log4j.appender.REMOTE_MASTER_LOGGER.filter.ID=alluxio.AlluxioRemoteLogFilter
+log4j.appender.REMOTE_MASTER_LOGGER.filter.ID.ProcessType=MASTER
+log4j.appender.REMOTE_MASTER_LOGGER.Threshold=WARN
+
+# Remote appender for Secondary Master
+log4j.appender.REMOTE_SECONDARY_MASTER_LOGGER=org.apache.log4j.net.SocketAppender
+log4j.appender.REMOTE_SECONDARY_MASTER_LOGGER.Port=${alluxio.logserver.port}
+log4j.appender.REMOTE_SECONDARY_MASTER_LOGGER.RemoteHost=${alluxio.logserver.hostname}
+log4j.appender.REMOTE_SECONDARY_MASTER_LOGGER.ReconnectionDelay=10000
+log4j.appender.REMOTE_SECONDARY_MASTER_LOGGER.filter.ID=alluxio.AlluxioRemoteLogFilter
+log4j.appender.REMOTE_SECONDARY_MASTER_LOGGER.filter.ID.ProcessType=SECONDARY_MASTER
+log4j.appender.REMOTE_SECONDARY_MASTER_LOGGER.Threshold=WARN
+
+# Remote appender for Proxy
+log4j.appender.REMOTE_PROXY_LOGGER=org.apache.log4j.net.SocketAppender
+log4j.appender.REMOTE_PROXY_LOGGER.Port=${alluxio.logserver.port}
+log4j.appender.REMOTE_PROXY_LOGGER.RemoteHost=${alluxio.logserver.hostname}
+log4j.appender.REMOTE_PROXY_LOGGER.ReconnectionDelay=10000
+log4j.appender.REMOTE_PROXY_LOGGER.filter.ID=alluxio.AlluxioRemoteLogFilter
+log4j.appender.REMOTE_PROXY_LOGGER.filter.ID.ProcessType=PROXY
+log4j.appender.REMOTE_PROXY_LOGGER.Threshold=WARN
+
+# Remote appender for Workers
+log4j.appender.REMOTE_WORKER_LOGGER=org.apache.log4j.net.SocketAppender
+log4j.appender.REMOTE_WORKER_LOGGER.Port=${alluxio.logserver.port}
+log4j.appender.REMOTE_WORKER_LOGGER.RemoteHost=${alluxio.logserver.hostname}
+log4j.appender.REMOTE_WORKER_LOGGER.ReconnectionDelay=10000
+log4j.appender.REMOTE_WORKER_LOGGER.filter.ID=alluxio.AlluxioRemoteLogFilter
+log4j.appender.REMOTE_WORKER_LOGGER.filter.ID.ProcessType=WORKER
+log4j.appender.REMOTE_WORKER_LOGGER.Threshold=WARN
+
+# (Local) appender for log server itself
+log4j.appender.LOGSERVER_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.LOGSERVER_LOGGER.File=${alluxio.logs.dir}/logserver.log
+log4j.appender.LOGSERVER_LOGGER.MaxFileSize=10MB
+log4j.appender.LOGSERVER_LOGGER.MaxBackupIndex=100
+log4j.appender.LOGSERVER_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.LOGSERVER_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# (Local) appender for log server to log on behalf of log clients
+# No need to configure file path because log server will dynamically
+# figure out for each appender.
+log4j.appender.LOGSERVER_CLIENT_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.LOGSERVER_CLIENT_LOGGER.MaxFileSize=10MB
+log4j.appender.LOGSERVER_CLIENT_LOGGER.MaxBackupIndex=100
+log4j.appender.LOGSERVER_CLIENT_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.LOGSERVER_CLIENT_LOGGER.layout.ConversionPattern=%d{ISO8601} 
%-5p [%t](%F:%L) - %m%n
+
+# Appender for User
+log4j.appender.USER_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.USER_LOGGER.File=${alluxio.user.logs.dir}/user_${user.name}.log
+log4j.appender.USER_LOGGER.MaxFileSize=10MB
+log4j.appender.USER_LOGGER.MaxBackupIndex=10
+log4j.appender.USER_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.USER_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Appender for Fuse
+log4j.appender.FUSE_LOGGER=org.apache.log4j.RollingFileAppender
+log4j.appender.FUSE_LOGGER.File=${alluxio.logs.dir}/fuse.log
+log4j.appender.FUSE_LOGGER.MaxFileSize=100MB
+log4j.appender.FUSE_LOGGER.MaxBackupIndex=10
+log4j.appender.FUSE_LOGGER.layout=org.apache.log4j.PatternLayout
+log4j.appender.FUSE_LOGGER.layout.ConversionPattern=%d{ISO8601} %-5p 
[%t](%F:%L) - %m%n
+
+# Disable noisy DEBUG logs
+log4j.logger.com.amazonaws.util.EC2MetadataUtils=OFF
+log4j.logger.io.grpc.netty.NettyServerHandler=OFF
+
+# Disable noisy INFO logs from ratis
+log4j.logger.org.apache.ratis.grpc.server.GrpcLogAppender=ERROR
+log4j.logger.org.apache.ratis.grpc.server.GrpcServerProtocolService=WARN
+log4j.logger.org.apache.ratis.server.impl.FollowerInfo=WARN
+log4j.logger.org.apache.ratis.server.leader.FollowerInfo=WARN
+log4j.logger.org.apache.ratis.server.impl.RaftServerImpl=WARN
+log4j.logger.org.apache.ratis.server.RaftServer$Division=WARN
+
+        </value>
+        <value-attributes>
+            <type>content</type>
+        </value-attributes>
+        <on-ambari-upgrade add="true"/>
+    </property>
+</configuration>
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-metrics-properties.xml
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-metrics-properties.xml
new file mode 100755
index 0000000000..f76330a82a
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-metrics-properties.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration supports_final="true">
+    <property>
+        <name>content</name>
+        <description>metrics.properties</description>
+        <value>
+#
+# The Alluxio Open Foundation licenses this work under the Apache License, 
version 2.0
+# (the "License"). You may not use this work except in compliance with the 
License, which is
+# available at www.apache.org/licenses/LICENSE-2.0
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR 
CONDITIONS OF ANY KIND,
+# either express or implied, as more fully set forth in the License.
+#
+# See the NOTICE file distributed with this work for information regarding 
copyright ownership.
+#
+
+#  syntax: sink.[name].[options]=[value]
+
+#  This file configures Alluxio's internal metrics system.
+#  The metrics can be configured to report its metrics to one or more sinks. 
The master, worker
+#  and client can have different configurations.
+#
+#  A "sink" specifies where metrics are delivered to. One or more sinks can be 
assigned.
+#
+#  The [name] field specifies the name of a sink.
+#
+#  The [options] field is the specific property of this source or sink. The
+#  source or sink is responsible for parsing this property.
+#
+#  Notes:
+#    1. To add a new sink, set the "class" option to a fully qualified class
+#    name (see examples below).
+#    2. Some sinks involve a polling period. The minimum allowed polling period
+#    is 1 second.
+#    3. A metrics specific configuration
+#    "alluxio.metrics.conf.file=${ALLUXIO_HOME}/conf/metrics.properties" 
should be
+#    added to Java properties using -Dalluxio.metrics.conf.file=xxx if you 
want to
+#    customize metrics system. You can also put the file in 
${ALLUXIO_HOME}/conf
+#    and it will be loaded automatically.
+#
+
+## List of available sinks and their properties.
+
+# alluxio.metrics.sink.ConsoleSink
+#   Name:   Default:   Description:
+#   period  10         Poll period
+#   unit    seconds    Units of poll period
+
+# alluxio.metrics.sink.CsvSink
+#   Name:     Default:   Description:
+#   period    10         Poll period
+#   unit      seconds    Units of poll period
+#   directory /tmp       Where to store CSV files
+
+# alluxio.metrics.sink.JmxSink
+
+# alluxio.metrics.sink.MetricsServlet
+#   Name:     Default:      Description:
+#   path      /metrics/json Path prefix from the web server root
+
+# alluxio.metrics.sink.PrometheusMetricsServlet
+#   Name:     Default:      Description:
+#   path      /metrics/prometheus Path prefix from the web server root
+
+# alluxio.metrics.sink.GraphiteSink
+#   Name:     Default:      Description:
+#   host      NONE          Hostname of Graphite server
+#   port      NONE          Port of Graphite server
+#   period    10            Poll period
+#   unit      seconds       Units of poll period
+#   prefix    EMPTY STRING  Prefix to prepend to metric name
+
+# alluxio.metrics.sink.Slf4jSink
+#   Name:     Default:   Description:
+#   period    10         Poll period
+#   unit      seconds    Units of poll period
+#   filter-class null    Contains all metrics
+#   filter-regex null    Contains all metrics
+
+## Examples
+# Enable JmxSink by class name
+# sink.jmx.class=alluxio.metrics.sink.JmxSink
+# Jmx domain
+# sink.jmx.domain=org.alluxio
+
+# Enable ConsoleSink by class name
+# sink.console.class=alluxio.metrics.sink.ConsoleSink
+
+# Polling period for ConsoleSink
+# sink.console.period=10
+
+# sink.console.unit=seconds
+
+# Enable CsvSink
+# sink.csv.class=alluxio.metrics.sink.CsvSink
+
+# Polling period for CsvSink
+# sink.csv.period=1
+
+# sink.csv.unit=minutes
+
+# Polling directory for CsvSink
+# sink.csv.directory=/tmp/
+
+        </value>
+        <value-attributes>
+            <type>content</type>
+        </value-attributes>
+        <on-ambari-upgrade add="true"/>
+    </property>
+</configuration>
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-site-properties.xml
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-site-properties.xml
new file mode 100755
index 0000000000..e61c58e779
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/configuration/alluxio-site-properties.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration supports_final="true">
+  <property>
+    <name>alluxio.master.rpc.port</name>
+    <description>alluxio.master.rpc.port</description>
+    <value>19998</value>
+    <on-ambari-upgrade add="true"/>
+  </property>
+
+  <property>
+    <name>alluxio.master.web.port</name>
+    <description>alluxio.master.web.port</description>
+    <value>19999</value>
+    <on-ambari-upgrade add="true"/>
+  </property>
+
+  <property>
+    <name>alluxio.worker.rpc.port</name>
+    <description>alluxio.worker.rpc.port</description>
+    <value>29999</value>
+    <on-ambari-upgrade add="true"/>
+  </property>
+
+  <property>
+    <name>alluxio.worker.web.port</name>
+    <description>alluxio.worker.web.port</description>
+    <value>30000</value>
+    <on-ambari-upgrade add="true"/>
+  </property>
+
+  <property>
+    <name>alluxio.worker.memory</name>
+    <description>Alluxio Worker Memory(GB)</description>
+    <value>1GB</value>
+    <on-ambari-upgrade add="true"/>
+  </property>
+
+  <property>
+    <name>alluxio.underfs.hdfs.address</name>
+    <description>Alluxio UnderFS hdfs Address</description>
+    <value>/alluxio/underFSStorage</value>
+    <on-ambari-upgrade add="true"/>
+  </property>
+
+  <property>
+    <name>alluxio.master.metastore.dir</name>
+    <description>Alluxio UnderFS Address</description>
+    <value>/usr/bigtop/current/alluxio/metastore</value>
+    <on-ambari-upgrade add="true"/>
+  </property>
+
+  <property>
+    <name>content</name>
+    <description>alluxio-log4j-properties</description>
+    <value>
+#
+# The Alluxio Open Foundation licenses this work under the Apache License, 
version 2.0
+# (the "License"). You may not use this work except in compliance with the 
License, which is
+# available at www.apache.org/licenses/LICENSE-2.0
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR 
CONDITIONS OF ANY KIND,
+# either express or implied, as more fully set forth in the License.
+#
+# See the NOTICE file distributed with this work for information regarding 
copyright ownership.
+#
+
+# Site specific configuration properties for Alluxio
+# Details about all configuration properties 
https://docs.alluxio.io/os/user/stable/en/reference/Properties-List.html
+
+# Common properties
+# alluxio.master.hostname=localhost
+# alluxio.master.mount.table.root.ufs=${alluxio.work.dir}/underFSStorage
+
+alluxio.master.hostname={{alluxio_master_host}}
+#alluxio.master.mount.table.root.ufs={{namenode_address}}/alluxio/root/
+alluxio.underfs.address={{underfs_hdfs_addr}}
+alluxio.underfs.hdfs.configuration=/etc/hadoop/conf/core-site.xml:/etc/hadoop/conf/hdfs-site.xml
+
+alluxio.master.metastore.dir={{alluxio_master_metastore_dir}}
+
+#ha
+#alluxio.master.embedded.journal.addresses
+{{master_embedded_journal_addresses_config}}
+
+# Security properties
+# alluxio.security.authorization.permission.enabled=true
+# alluxio.security.authentication.type=SIMPLE
+
+alluxio.hadoop.security.authentication={{alluxio_authentication}}
+alluxio.master.mount.table.root.option.alluxio.security.underfs.hdfs.kerberos.client.keytab.file={{alluxio_kerberos_keytab}}
+alluxio.master.mount.table.root.option.alluxio.security.underfs.hdfs.kerberos.client.principal={{alluxio_kerberos_principal}}
+alluxio.master.mount.table.root.option.alluxio.security.underfs.hdfs.impersonation.enabled=true
+alluxio.master.security.impersonation.yarn.users=*
+
+# 
+# alluxio.worker.tieredstore.levels=1
+# alluxio.worker.tieredstore.level0.alias=MEM
+# alluxio.worker.tieredstore.level0.dirs.path=/mnt/ramdisk
+
+# Worker properties
+alluxio.worker.ramdisk.size=1GB
+alluxio.worker.tieredstore.levels=1
+alluxio.worker.tieredstore.level0.alias=MEM
+alluxio.worker.tieredstore.level0.dirs.path=/mnt/ramdisk
+alluxio.worker.tieredstore.level0.dirs.quota={{worker_mem}}
+alluxio.worker.tieredstore.level0.watermark.high.ratio=0.9
+alluxio.worker.tieredstore.level0.watermark.low.ratio=0.7
+
+#alluxio.worker.tieredstore.level1.alias=SSD
+#alluxio.worker.tieredstore.level1.dirs.path=/data/alluxio
+#alluxio.worker.tieredstore.level1.dirs.quota=25GB
+#alluxio.worker.tieredstore.level1.watermark.high.ratio=0.9
+#alluxio.worker.tieredstore.level1.watermark.low.ratio=0.7
+
+alluxio.worker.tieredstore.level1.alias=HDD
+alluxio.worker.tieredstore.level1.dirs.path={{hdd_dirs}}
+alluxio.worker.tieredstore.level1.dirs.quota={{hdd_quota}}
+alluxio.worker.tieredstore.level1.watermark.high.ratio=0.9
+alluxio.worker.tieredstore.level1.watermark.low.ratio=0.7
+
+# User properties
+# alluxio.user.file.readtype.default=CACHE
+# alluxio.user.file.writetype.default=ASYNC_THROUGH
+
+#port
+alluxio.master.rpc.port={{alluxio_master_rpc_port}}
+alluxio.master.web.port={{alluxio_master_web_port}}
+
+alluxio.worker.rpc.port={{alluxio_worker_rpc_port}}
+alluxio.worker.web.port={{alluxio_worker_web_port}}
+
+        </value>
+    </property>
+</configuration>
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/kerberos.json
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/kerberos.json
new file mode 100755
index 0000000000..fbf1a60838
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/kerberos.json
@@ -0,0 +1,70 @@
+{
+  "services": [
+    {
+      "name": "ALLUXIO",
+      "identities": [
+        {
+          "name": "alluxio_smokeuser",
+          "reference": "/smokeuser"
+        },
+        {
+          "name": "alluxio_user",
+          "principal": {
+            "value": "${alluxio-env/alluxio_user}${principal_suffix}@${realm}",
+            "type" : "user",
+            "local_username" : "${alluxio-env/alluxio_user}",
+            "configuration": "alluxio-env/alluxio_principal"
+          },
+          "keytab": {
+            "file": "${keytab_dir}/alluxio.headless.keytab",
+            "owner": {
+              "name": "${alluxio-env/alluxio_user}",
+              "access": "r"
+            },
+            "group": {
+              "name": "${cluster-env/user_group}",
+              "access": "r"
+            },
+            "configuration": "alluxio-env/alluxio_keytab"
+          }
+        },
+        {
+          "name": "alluxio_service_keytab",
+          "principal": {
+            "value": "alluxio/_HOST@${realm}",
+            "type" : "service",
+            "configuration": "alluxio-env/alluxio_service_principal",
+            "local_username" : "${alluxio-env/alluxio_user}"
+          },
+          "keytab": {
+            "file": "${keytab_dir}/alluxio.service.keytab",
+            "owner": {
+              "name": "${alluxio-env/alluxio_user}",
+              "access": "r"
+            },
+            "group": {
+              "name": "${cluster-env/user_group}",
+              "access": ""
+            },
+            "configuration": "alluxio-env/alluxio_service_keytab"
+          }
+        }
+      ],
+      "configurations": [
+        {
+          "alluxio-env": {
+            "alluxio.authentication": "KERBEROS"                  
+          }
+        }
+      ],
+      "components": [
+        {
+          "name": "ALLUXIO_MASTER"
+        },
+        {
+          "name": "ALLUXIO_WORKER"
+        }
+      ]
+    }
+  ]
+}
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/metainfo.xml
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/metainfo.xml
new file mode 100755
index 0000000000..7b3994d346
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/metainfo.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0"?>
+<!--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.
+*/
+-->
+<metainfo>
+  <schemaVersion>2.0</schemaVersion>
+  <services>
+    <service>
+      <name>ALLUXIO</name>
+      <displayName>Alluxio</displayName>
+      <comment>Alluxio is world’s first open source data orchestration 
technology for analytics and AI for the cloud. This service is 
&lt;b&gt;Technical Preview&lt;/b&gt;.</comment>
+      <version>2.9.3</version>
+      <components>        
+        <component>
+          <name>ALLUXIO_MASTER</name>
+          <displayName>Alluxio Master</displayName>
+          <category>MASTER</category>
+          <cardinality>1+</cardinality>
+          <versionAdvertised>true</versionAdvertised>
+          <dependencies>
+            <dependency>
+              <name>HDFS/HDFS_CLIENT</name>
+              <scope>host</scope>
+              <auto-deploy>
+                <enabled>true</enabled>
+              </auto-deploy>
+            </dependency>
+          </dependencies>
+          <commandScript>
+            <script>scripts/master.py</script>
+            <scriptType>PYTHON</scriptType>
+            <timeout>600</timeout>
+          </commandScript>
+          <logs>
+            <log>
+              <logId>alluxio_master</logId>
+              <primary>true</primary>
+            </log>
+          </logs>
+        </component>
+
+        <component>
+          <name>ALLUXIO_WORKER</name>
+          <displayName>Alluxio Worker</displayName>
+          <category>SLAVE</category>
+          <cardinality>1+</cardinality>
+          <versionAdvertised>true</versionAdvertised>
+          <commandScript>
+            <script>scripts/worker.py</script>
+            <scriptType>PYTHON</scriptType>
+          </commandScript>
+          <dependencies>
+            <dependency>
+              <name>HDFS/HDFS_CLIENT</name>
+              <scope>host</scope>
+              <auto-deploy>
+                <enabled>true</enabled>
+              </auto-deploy>
+            </dependency>
+          </dependencies>
+          <logs>
+            <log>
+              <logId>alluxio_worker</logId>
+              <primary>true</primary>
+            </log>
+          </logs>
+        </component>
+
+      </components>
+
+      <configuration-dependencies>
+        <config-type>alluxio-env</config-type>
+        <config-type>alluxio-site-properties</config-type>
+        <config-type>alluxio-log4j-properties</config-type>
+        <config-type>alluxio-metrics-properties</config-type>
+      </configuration-dependencies>
+
+      <commandScript>
+        <script>scripts/service_check.py</script>
+        <scriptType>PYTHON</scriptType>
+        <timeout>300</timeout>
+      </commandScript>
+
+      <requiredServices>
+        <service>HDFS</service>
+      </requiredServices>
+         
+      <quickLinksConfigurations>
+        <quickLinksConfiguration>
+            <fileName>quicklinks.json</fileName>
+            <default>true</default>
+        </quickLinksConfiguration>
+      </quickLinksConfigurations>
+      
+      <restartRequiredAfterChange>true</restartRequiredAfterChange>
+
+      <osSpecifics>
+        <osSpecific>
+          
<osFamily>redhat9,redhat8,redhat7,amazonlinux2,redhat6,suse11,suse12</osFamily>
+          <packages>
+            <package>
+              <name>alluxio_${stack_version}</name>
+            </package>
+          </packages>
+        </osSpecific>
+        <osSpecific>
+          
<osFamily>debian7,debian9,ubuntu12,ubuntu14,ubuntu16,ubuntu18</osFamily>
+          <packages>
+            <package>
+              <name>alluxio_${stack_version}</name>
+            </package>
+          </packages>
+        </osSpecific>
+      </osSpecifics>
+
+    </service>
+  </services>
+</metainfo>
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/master.py
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/master.py
new file mode 100755
index 0000000000..92d3c63e36
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/master.py
@@ -0,0 +1,184 @@
+#!/usr/bin/python
+"""
+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 os
+from resource_management import *
+from resource_management.core import sudo
+import time
+
+
+class AlluxioMaster(Script):
+  def install(self, env):
+    self.install_packages(env)
+
+  def configure(self, env, upgrade_type=None, config_dir=None):
+    import params
+
+    env.set_params(params)
+
+    Directory(
+      [
+        params.alluxio_pid_dir,
+        params.alluxio_master_metastore_dir,
+        params.alluxio_journal_dir,
+      ],
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o775,
+      create_parents=True,
+    )
+
+    Directory(
+      [params.alluxio_log_dir, os.path.join(params.alluxio_log_dir, "user")],
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o777,
+      create_parents=True,
+    )
+
+    # create alluxio-site.properties in alluxio install dir
+    File(
+      os.path.join(params.alluxio_conf_dir, "alluxio-site.properties"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      content=InlineTemplate(params.alluxio_site_properties),
+      mode=0o644,
+    )
+
+    # create alluxio-env.sh in alluxio install dir
+    File(
+      os.path.join(params.alluxio_conf_dir, "alluxio-env.sh"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      content=InlineTemplate(params.alluxio_env_sh),
+      mode=0o775,
+    )
+
+    # create log4j2.properties alluxio install dir
+    File(
+      os.path.join(params.alluxio_conf_dir, "log4j.properties"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      content=InlineTemplate(params.alluxio_log4j2_properties),
+      mode=0o644,
+    )
+
+    # masters
+    File(
+      format("{alluxio_conf_dir}/masters"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o644,
+      content=Template("masters.j2", conf_dir=params.alluxio_conf_dir),
+    )
+
+    # workers
+    File(
+      format("{alluxio_conf_dir}/workers"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o644,
+      content=Template("workers.j2", conf_dir=params.alluxio_conf_dir),
+    )
+
+    # hdfs dir
+    params.HdfsResource(
+      params.alluxio_hdfs_user_dir,
+      type="directory",
+      action="create_on_execute",
+      owner=params.alluxio_user,
+      mode=0o775,
+    )
+    params.HdfsResource(
+      params.underfs_hdfs_addr,
+      type="directory",
+      action="create_on_execute",
+      owner=params.alluxio_user,
+      mode=0o775,
+    )
+
+  def start(self, env, upgrade_type=None):
+    import params
+
+    env.set_params(params)
+
+    self.configure(env)
+    if not params.alluxio_master_metastore_formatted:
+      Execute(
+        params.alluxio_master_format,
+        user=params.alluxio_user,
+        environment={"JAVA_HOME": params.java_home},
+      )
+
+    # start
+    Execute(
+      params.alluxio_master_start_cmd,
+      user=params.alluxio_user,
+      environment={"JAVA_HOME": params.java_home},
+    )
+
+    # generate pid,multiple judyment
+    tryTimes = 5
+    while tryTimes > 0:
+      Execute(
+        params.alluxio_master_pid_cmd,
+        user=params.alluxio_user,
+        environment={"JAVA_HOME": params.java_home},
+      )
+      if sudo.read_file(params.alluxio_master_pid_file) != "":
+        break
+      else:
+        Logger.info("waiting from fe start...")
+        time.sleep(60)
+        tryTimes = tryTimes - 1
+    if tryTimes == 0:
+      Logger.error("start error,pls check logs.")
+
+  def stop(self, env, upgrade_type=None):
+    import params
+
+    env.set_params(params)
+    self.configure(env)
+
+    Execute(
+      params.alluxio_master_stop_cmd,
+      user=params.alluxio_user,
+      environment={"JAVA_HOME": params.java_home},
+    )
+
+  def status(self, env):
+    import params
+
+    env.set_params(params)
+    check_process_status(params.alluxio_master_pid_file)
+
+  def get_user(self):
+    import params
+
+    return params.alluxio_user
+
+  def get_pid_files(self):
+    import params
+
+    return [params.alluxio_master_pid_file]
+
+
+if __name__ == "__main__":
+  AlluxioMaster().execute()
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/params.py
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/params.py
new file mode 100755
index 0000000000..2a6f7ee830
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/params.py
@@ -0,0 +1,305 @@
+#!/usr/bin/env python
+"""
+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 socket
+import os
+from urllib.parse import urlparse
+
+from ambari_commons.constants import AMBARI_SUDO_BINARY
+from resource_management import *
+from resource_management.libraries.functions.stack_features import 
check_stack_feature
+from resource_management.libraries.functions.constants import StackFeature
+from resource_management.libraries.functions import conf_select, stack_select
+from resource_management.libraries.functions.version import (
+  format_stack_version,
+  get_major_version,
+)
+from resource_management.libraries.functions.copy_tarball import (
+  get_sysprep_skip_copy_tarballs_hdfs,
+)
+from resource_management.libraries.functions.format import format
+from resource_management.libraries.functions.default import default
+from resource_management.libraries.functions import get_kinit_path
+from resource_management.libraries.functions.get_not_managed_resources import (
+  get_not_managed_resources,
+)
+from resource_management.libraries.resources.hdfs_resource import HdfsResource
+from resource_management.libraries.script.script import Script
+from resource_management.libraries.functions.copy_tarball import 
get_current_version
+from resource_management.libraries.functions.stack_features import (
+  check_stack_feature,
+  get_stack_feature_version,
+)
+from resource_management.libraries.functions import StackFeature
+
+
+config = Script.get_config()
+
+java_home = config["ambariLevelParams"]["java_home"]
+stack_root = Script.get_stack_root()
+
+config = Script.get_config()
+tmp_dir = Script.get_tmp_dir()
+sudo = AMBARI_SUDO_BINARY
+fqdn = socket.getfqdn().lower()
+
+retryAble = default("/commandParams/command_retry_enabled", False)
+
+cluster_name = config["clusterName"]
+stack_name = default("/clusterLevelParams/stack_name", None)
+stack_root = Script.get_stack_root()
+# 3.2
+stack_version_unformatted = config["clusterLevelParams"]["stack_version"]
+# 3.2.0.0
+stack_version_formatted = format_stack_version(stack_version_unformatted)
+# 3.2
+major_stack_version = get_major_version(stack_version_formatted)
+
+# 3.2.1.0-001
+effective_version = get_current_version(service="ALLUXIO")
+
+sysprep_skip_copy_tarballs_hdfs = get_sysprep_skip_copy_tarballs_hdfs()
+
+# New Cluster Stack Version that is defined during the RESTART of a Stack 
Upgrade
+version = default("/commandParams/version", None)
+
+hadoop_conf_dir = conf_select.get_hadoop_conf_dir()
+hadoop_bin_dir = stack_select.get_hadoop_dir("bin")
+
+if stack_version_formatted and check_stack_feature(
+  StackFeature.ROLLING_UPGRADE, stack_version_formatted
+):
+  hadoop_home = stack_select.get_hadoop_dir("home")
+
+hdfs_user = config["configurations"]["hadoop-env"]["hdfs_user"]
+hdfs_principal_name = 
config["configurations"]["hadoop-env"]["hdfs_principal_name"]
+hdfs_user_keytab = config["configurations"]["hadoop-env"]["hdfs_user_keytab"]
+user_group = config["configurations"]["cluster-env"]["user_group"]
+
+
+component_directory = "alluxio"
+alluxio_home = format("{stack_root}/current/{component_directory}")
+alluxio_conf_dir = format("{stack_root}/current/{component_directory}/conf")
+
+alluxio_user = config["configurations"]["alluxio-env"]["alluxio_user"]
+alluxio_group = config["configurations"]["alluxio-env"]["alluxio_group"]
+alluxio_pid_dir = config["configurations"]["alluxio-env"]["alluxio_pid_dir"]
+alluxio_log_dir = config["configurations"]["alluxio-env"]["alluxio_log_dir"]
+alluxio_work_dir = format("{alluxio_pid_dir}/work")
+
+alluxio_journal_dir = 
format("{stack_root}/current/{component_directory}/journal")
+
+host_name = config["agentLevelParams"]["hostname"]
+
+# alluxio masters address
+alluxio_masters = config["clusterHostInfo"]["alluxio_master_hosts"]
+alluxio_masters_str = "\n".join(alluxio_masters)
+alluxio_master_host = host_name
+
+masters_journal_port = "19200"
+master_embedded_journal_addresses = ""
+master_embedded_journal_addresses_config = ""
+# get comma separated lists of masters_journal_host hosts from alluxio_masters
+if len(alluxio_masters) > 1:
+  alluxio_master_host = host_name
+  index = 0
+  for host in alluxio_masters:
+    masters_journal_host = host
+    if masters_journal_port is not None:
+      masters_journal_host = host + ":" + str(masters_journal_port)
+
+    master_embedded_journal_addresses += masters_journal_host
+    index += 1
+    if index < len(alluxio_masters):
+      master_embedded_journal_addresses += ","
+  master_embedded_journal_addresses_config = (
+    "alluxio.master.embedded.journal.addresses=" + 
master_embedded_journal_addresses
+  )
+elif len(alluxio_masters) == 1:
+  alluxio_master_host = alluxio_masters[0]
+print(alluxio_master_host)
+print(master_embedded_journal_addresses_config)
+
+
+# alluxio.underfs.address
+alluxio_master_metastore_dir = 
config["configurations"]["alluxio-site-properties"][
+  "alluxio.master.metastore.dir"
+]
+if alluxio_master_metastore_dir is None:
+  alluxio_master_metastore_dir = "/usr/hdp/current/alluxio/metastore"
+alluxio_master_metastore_formatted = False
+if (
+  os.path.exists(alluxio_master_metastore_dir)
+  and os.path.isdir(alluxio_master_metastore_dir)
+  and len(os.listdir(alluxio_master_metastore_dir)) > 0
+):
+  alluxio_master_metastore_formatted = True
+
+
+alluxio_master_rpc_port = config["configurations"]["alluxio-site-properties"][
+  "alluxio.master.rpc.port"
+]
+alluxio_master_web_port = config["configurations"]["alluxio-site-properties"][
+  "alluxio.master.web.port"
+]
+
+alluxio_worker_rpc_port = config["configurations"]["alluxio-site-properties"][
+  "alluxio.worker.rpc.port"
+]
+alluxio_worker_web_port = config["configurations"]["alluxio-site-properties"][
+  "alluxio.worker.web.port"
+]
+
+# alluxio workers address
+alluxio_workers = config["clusterHostInfo"]["alluxio_worker_hosts"]
+alluxio_workers_str = "\n".join(alluxio_workers)
+
+# alluxio worker memory alotment
+worker_mem = config["configurations"]["alluxio-site-properties"][
+  "alluxio.worker.memory"
+]
+
+# Find current stack and version to push agent files to
+stack_name = default("/hostLevelParams/stack_name", None)
+stack_version = config["hostLevelParams"]["stack_version"]
+
+# hadoop params
+namenode_address = None
+if "dfs.namenode.rpc-address" in config["configurations"]["hdfs-site"]:
+  namenode_rpcaddress = config["configurations"]["hdfs-site"][
+    "dfs.namenode.rpc-address"
+  ]
+  namenode_address = format("hdfs://{namenode_rpcaddress}")
+else:
+  namenode_address = config["configurations"]["core-site"]["fs.defaultFS"]
+
+# alluxio underfs address
+underfs_hdfs_addr = (
+  namenode_address
+  + 
config["configurations"]["alluxio-site-properties"]["alluxio.underfs.hdfs.address"]
+)
+
+
+# alluxio hdd dirs
+
+
+alluxio_site_properties = 
config["configurations"]["alluxio-site-properties"]["content"]
+alluxio_env_sh = config["configurations"]["alluxio-env"]["content"]
+
+alluxio_log4j2_properties = 
config["configurations"]["alluxio-log4j-properties"][
+  "content"
+]
+
+alluxio_hdfs_user_dir = format("/user/{alluxio_user}")
+
+smoke_user = config["configurations"]["cluster-env"]["smokeuser"]
+
+alluxio_authentication = "SIMPLE"
+
+# security_enabled
+security_enabled = default("/configurations/cluster-env/security_enabled", 
None)
+kinit_path_local = get_kinit_path(
+  default("/configurations/kerberos-env/executable_search_paths", None)
+)
+
+if security_enabled:
+  alluxio_authentication = "KERBEROS"
+  alluxio_kerberos_keytab = 
config["configurations"]["alluxio-env"]["alluxio_keytab"]
+  alluxio_kerberos_principal = config["configurations"]["alluxio-env"][
+    "alluxio_principal"
+  ]
+  smoke_user_keytab = 
config["configurations"]["cluster-env"]["smokeuser_keytab"]
+  smokeuser_principal = config["configurations"]["cluster-env"][
+    "smokeuser_principal_name"
+  ]
+  alluxio_service_kerberos_keytab = config["configurations"]["alluxio-env"][
+    "alluxio_service_keytab"
+  ]
+  alluxio_serive_kerberos_principal = config["configurations"]["alluxio-env"][
+    "alluxio_service_principal"
+  ]
+
+
+# for create_hdfs_directory
+default_fs = config["configurations"]["core-site"]["fs.defaultFS"]
+hdfs_site = config["configurations"]["hdfs-site"]
+hdfs_resource_ignore_file = "/var/lib/ambari-agent/data/.hdfs_resource_ignore"
+
+dfs_type = default("/clusterLevelParams/dfs_type", "")
+
+import functools
+
+# create partial functions with common arguments for every HdfsResource call
+# to create/delete hdfs directory/file/copyfromlocal we need to call 
params.HdfsResource in code
+HdfsResource = functools.partial(
+  HdfsResource,
+  user=hdfs_user,
+  hdfs_resource_ignore_file=hdfs_resource_ignore_file,
+  security_enabled=security_enabled,
+  keytab=hdfs_user_keytab,
+  kinit_path_local=kinit_path_local,
+  hadoop_bin_dir=hadoop_bin_dir,
+  hadoop_conf_dir=hadoop_conf_dir,
+  principal_name=hdfs_principal_name,
+  hdfs_site=hdfs_site,
+  default_fs=default_fs,
+  immutable_paths=get_not_managed_resources(),
+  dfs_type=dfs_type,
+)
+
+
+# command
+alluxio_master_pid_file = format("{alluxio_pid_dir}/{alluxio_user}-master.pid")
+alluxio_master_pid_cmd = (
+  "echo `ps -A -o pid,command | grep -i \"[j]ava\" | grep 
alluxio.master.AlluxioMaster | awk '{print $1; exit}'`> "
+  + alluxio_master_pid_file
+)
+alluxio_master_start_cmd = format(
+  "rm -fr {alluxio_master_pid_file} && {alluxio_home}/bin/alluxio-start.sh -a 
master"
+)
+alluxio_master_stop_cmd = format(
+  "{alluxio_home}/bin/alluxio-stop.sh master && rm -fr 
{alluxio_master_pid_file}"
+)
+alluxio_master_format = format("{alluxio_home}/bin/alluxio formatMaster")
+
+alluxio_worker_pid_file = format("{alluxio_pid_dir}/{alluxio_user}-worker.pid")
+alluxio_worker_pid_cmd = (
+  "echo `ps -A -o pid,command | grep -i \"[j]ava\" | grep 
alluxio.worker.AlluxioWorker | awk '{print $1; exit}'`> "
+  + alluxio_worker_pid_file
+)
+alluxio_worker_start_cmd = format(
+  "rm -fr {alluxio_worker_pid_file} && {alluxio_home}/bin/alluxio-start.sh 
worker"
+)
+alluxio_worker_stop_cmd = format(
+  "{alluxio_home}/bin/alluxio-stop.sh worker  && rm -fr 
{alluxio_worker_pid_file}"
+)
+
+sudo = AMBARI_SUDO_BINARY
+alluxio_worker_mount_cmd = format("{alluxio_home}/bin/alluxio-mount.sh Mount")
+
+alluxio_test_cmd = format("{alluxio_home}/bin/alluxio runTests")
+
+if security_enabled:
+  kinit_principal = alluxio_serive_kerberos_principal.replace("_HOST", 
host_name)
+  alluxio_kinit_cmd = format(
+    "kinit -kt {alluxio_service_kerberos_keytab} {kinit_principal}"
+  )
+  alluxio_master_start_cmd = alluxio_kinit_cmd + " && " + 
alluxio_master_start_cmd
+  alluxio_worker_start_cmd = alluxio_kinit_cmd + " && " + 
alluxio_worker_start_cmd
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/service_check.py
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/service_check.py
new file mode 100755
index 0000000000..0d5c8da929
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/service_check.py
@@ -0,0 +1,43 @@
+"""
+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 agree 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 subprocess
+import time
+import os
+
+from resource_management.core.exceptions import Fail
+from resource_management.libraries.script.script import Script
+from resource_management.libraries.functions.format import format
+from resource_management.core.resources.system import Execute
+from resource_management.core.logger import Logger
+
+
+CHECK_COMMAND_TIMEOUT_DEFAULT = 300.0
+
+
+class AlluxioServiceCheck(Script):
+  def service_check(self, env):
+    import params
+
+    env.set_params(params)
+
+    Execute(params.alluxio_test_cmd, user=params.alluxio_user)
+
+
+if __name__ == "__main__":
+  AlluxioServiceCheck().execute()
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/worker.py
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/worker.py
new file mode 100755
index 0000000000..8c8072d0c2
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/scripts/worker.py
@@ -0,0 +1,147 @@
+#!/usr/bin/python
+"""
+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 os
+from resource_management import *
+import time
+
+
+class AlluxioWorker(Script):
+  def install(self, env):
+    self.install_packages(env)
+
+  def configure(self, env, upgrade_type=None, config_dir=None):
+    import params
+
+    env.set_params(params)
+
+    Directory(
+      [params.alluxio_pid_dir, params.alluxio_journal_dir],
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o775,
+      create_parents=True,
+    )
+
+    Directory(
+      [params.alluxio_log_dir, os.path.join(params.alluxio_log_dir, "user")],
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o777,
+      create_parents=True,
+    )
+
+    # create alluxio-site.properties in alluxio install dir
+    File(
+      os.path.join(params.alluxio_conf_dir, "alluxio-site.properties"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      content=InlineTemplate(params.alluxio_site_properties),
+      mode=0o644,
+    )
+
+    # create alluxio-env.sh in alluxio install dir
+    File(
+      os.path.join(params.alluxio_conf_dir, "alluxio-env.sh"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      content=InlineTemplate(params.alluxio_env_sh),
+      mode=0o775,
+    )
+
+    # create log4j2.properties alluxio install dir
+    File(
+      os.path.join(params.alluxio_conf_dir, "log4j.properties"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      content=InlineTemplate(params.alluxio_log4j2_properties),
+      mode=0o644,
+    )
+
+    # masters
+    File(
+      format("{alluxio_conf_dir}/masters"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o644,
+      content=Template("masters.j2", conf_dir=params.alluxio_conf_dir),
+    )
+
+    # workers
+    File(
+      format("{alluxio_conf_dir}/workers"),
+      owner=params.alluxio_user,
+      group=params.alluxio_group,
+      mode=0o644,
+      content=Template("workers.j2", conf_dir=params.alluxio_conf_dir),
+    )
+
+  def start(self, env, upgrade_type=None):
+    import params
+
+    env.set_params(params)
+
+    self.configure(env)
+
+    Execute(("bash", "-c", params.alluxio_worker_mount_cmd), sudo=True)
+
+    Execute(
+      params.alluxio_worker_start_cmd,
+      user=params.alluxio_user,
+      environment={"JAVA_HOME": params.java_home},
+    )
+
+    Execute(
+      params.alluxio_worker_pid_cmd,
+      user=params.alluxio_user,
+      environment={"JAVA_HOME": params.java_home},
+    )
+
+  def stop(self, env, upgrade_type=None):
+    import params
+
+    env.set_params(params)
+    self.configure(env)
+
+    Execute(
+      params.alluxio_worker_stop_cmd,
+      user=params.alluxio_user,
+      environment={"JAVA_HOME": params.java_home},
+    )
+
+  def status(self, env):
+    import params
+
+    env.set_params(params)
+    check_process_status(params.alluxio_worker_pid_file)
+
+  def get_user(self):
+    import params
+
+    return params.alluxio_user
+
+  def get_pid_files(self):
+    import params
+
+    return [params.alluxio_worker_pid_file]
+
+
+if __name__ == "__main__":
+  AlluxioWorker().execute()
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/templates/masters.j2
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/templates/masters.j2
new file mode 100755
index 0000000000..8b61209517
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/templates/masters.j2
@@ -0,0 +1,19 @@
+{#
+# 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.
+#}
+
+{{alluxio_masters_str}}
\ No newline at end of file
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/templates/workers.j2
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/templates/workers.j2
new file mode 100755
index 0000000000..a7ffc689df
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/package/templates/workers.j2
@@ -0,0 +1,19 @@
+{#
+# 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.
+#}
+
+{{alluxio_workers_str}}
\ No newline at end of file
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/quicklinks/quicklinks.json
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/quicklinks/quicklinks.json
new file mode 100755
index 0000000000..46cc4ef05c
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/quicklinks/quicklinks.json
@@ -0,0 +1,21 @@
+{
+  "name": "default",
+  "description": "default quick links configuration",
+  "configuration": {
+    "links": [
+      {
+        "name": "Alluxio_WEB_UI",
+        "label": "Alluxio Web UI",
+        "requires_user_name": "false",
+        "component_name": "ALLUXIO_MASTER",
+        "url":"%@://%@:%@",
+        "port":{
+          "http_property": "alluxio.master.web.port",
+          "http_default_port": "19999",
+          "regex": "^(\\d+)$",
+          "site": "alluxio-site-properties"
+        }
+      }
+    ]
+  }
+}
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/role_command_order.json
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/role_command_order.json
new file mode 100755
index 0000000000..a5b5669247
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/role_command_order.json
@@ -0,0 +1,8 @@
+{
+  "general_deps" : {
+    "_comment" : "dependencies for ALLUXIO",
+         "ALLUXIO_SERVICE_CHECK-SERVICE_CHECK" : 
["ALLUXIO_MASTER-START","ALLUXIO_WORKER-START"],
+    "ALLUXIO_MASTER-START" : ["ZOOKEEPER_SERVER-START", 
"NAMENODE-START","SECONDARY_NAMENODE-START", "DATANODE-START"],
+    "ALLUXIO_WORKER-START" : ["ALLUXIO_MASTER-START"]
+  }
+}
\ No newline at end of file
diff --git 
a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/service_advisor.py
 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/service_advisor.py
new file mode 100755
index 0000000000..08c5dcb261
--- /dev/null
+++ 
b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ALLUXIO/service_advisor.py
@@ -0,0 +1,210 @@
+#!/usr/bin/env ambari-python-wrap
+"""
+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.
+"""
+
+# Python imports
+from ast import Param
+import imp
+import os
+import traceback
+import re
+import socket
+import fnmatch
+
+
+from resource_management.core.logger import Logger
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+STACKS_DIR = os.path.join(SCRIPT_DIR, "../../../../../stacks/")
+PARENT_FILE = os.path.join(STACKS_DIR, "service_advisor.py")
+
+try:
+  if "BASE_SERVICE_ADVISOR" in os.environ:
+    PARENT_FILE = os.environ["BASE_SERVICE_ADVISOR"]
+  with open(PARENT_FILE, "rb") as fp:
+    service_advisor = imp.load_module(
+      "service_advisor", fp, PARENT_FILE, (".py", "rb", imp.PY_SOURCE)
+    )
+except Exception as e:
+  traceback.print_exc()
+  print("Failed to load parent")
+
+
+class AlluxioServiceAdvisor(service_advisor.ServiceAdvisor):
+  def __init__(self, *args, **kwargs):
+    self.as_super = super(AlluxioServiceAdvisor, self)
+    self.as_super.__init__(*args, **kwargs)
+
+    # Always call these methods
+    self.modifyMastersWithMultipleInstances()
+    self.modifyCardinalitiesDict()
+    self.modifyHeapSizeProperties()
+    self.modifyNotValuableComponents()
+    self.modifyComponentsNotPreferableOnServer()
+    self.modifyComponentLayoutSchemes()
+
+  def modifyMastersWithMultipleInstances(self):
+    """
+    Modify the set of masters with multiple instances.
+    Must be overriden in child class.
+    """
+    # Nothing to do
+    pass
+
+  def modifyCardinalitiesDict(self):
+    """
+    Modify the dictionary of cardinalities.
+    Must be overriden in child class.
+    """
+    # Nothing to do
+    pass
+
+  def modifyHeapSizeProperties(self):
+    """
+    Modify the dictionary of heap size properties.
+    Must be overriden in child class.
+    """
+    pass
+
+  def modifyNotValuableComponents(self):
+    """
+    Modify the set of components whose host assignment is based on other 
services.
+    Must be overriden in child class.
+    """
+    # Nothing to do
+    pass
+
+  def modifyComponentsNotPreferableOnServer(self):
+    """
+    Modify the set of components that are not preferable on the server.
+    Must be overriden in child class.
+    """
+    # Nothing to do
+    pass
+
+  def modifyComponentLayoutSchemes(self):
+    """
+    Modify layout scheme dictionaries for components.
+    The scheme dictionary basically maps the number of hosts to
+    host index where component should exist.
+    Must be overriden in child class.
+    """
+
+    # Nothing to do
+    pass
+
+  def getServiceComponentLayoutValidations(self, services, hosts):
+    """
+    Get a list of errors.
+    Must be overriden in child class.
+    """
+
+    return self.getServiceComponentCardinalityValidations(services, hosts, 
"ALLUXIO")
+
+  def getServiceConfigurationRecommendations(
+    self, configurations, clusterData, services, hosts
+  ):
+    """
+    Entry point.
+    Must be overriden in child class.
+    """
+    # Logger.info("Class: %s, Method: %s. Recommending Service 
Configurations." %
+    #            (self.__class__.__name__, inspect.stack()[0][3]))
+
+    recommender = AlluxioRecommender()
+    recommender.recommendAlluxioConfigurationsFromHDP33(
+      configurations, clusterData, services, hosts
+    )
+
+  # def getServiceConfigurationRecommendationsForSSO(self, configurations, 
clusterData, services, hosts):
+  #   """
+  #   Entry point.
+  #   Must be overriden in child class.
+  #   """
+  #   recommender = AlluxioRecommender()
+  #   recommender.recommendConfigurationsForSSO(configurations, clusterData, 
services, hosts)
+
+  def getServiceConfigurationsValidationItems(
+    self, configurations, recommendedDefaults, services, hosts
+  ):
+    """
+    Entry point.
+    Validate configurations for the service. Return a list of errors.
+    The code for this function should be the same for each Service Advisor.
+    """
+    # Logger.info("Class: %s, Method: %s. Validating Configurations." %
+    #            (self.__class__.__name__, inspect.stack()[0][3]))
+
+    return []
+
+  @staticmethod
+  def isKerberosEnabled(services, configurations):
+    """
+    Determines if security is enabled by testing the value of 
core-site/hadoop.security.authentication enabled.
+    If the property exists and is equal to "kerberos", then is it enabled; 
otherwise is it assumed to be
+    disabled.
+
+    :type services: dict
+    :param services: the dictionary containing the existing configuration 
values
+    :type configurations: dict
+    :param configurations: the dictionary containing the updated configuration 
values
+    :rtype: bool
+    :return: True or False
+    """
+    if (
+      configurations
+      and "core-site" in configurations
+      and "hadoop.security.authentication" in 
configurations["core-site"]["properties"]
+    ):
+      return (
+        configurations["core-site"]["properties"][
+          "hadoop.security.authentication"
+        ].lower()
+        == "kerberos"
+      )
+    elif (
+      services
+      and "core-site" in services["configurations"]
+      and "hadoop.security.authentication"
+      in services["configurations"]["core-site"]["properties"]
+    ):
+      return (
+        services["configurations"]["core-site"]["properties"][
+          "hadoop.security.authentication"
+        ].lower()
+        == "kerberos"
+      )
+    else:
+      return False
+
+
+class AlluxioRecommender(service_advisor.ServiceAdvisor):
+  """
+  Alluxio Recommender suggests properties when adding the service for the 
first time or modifying configs via the UI.
+  """
+
+  def __init__(self, *args, **kwargs):
+    self.as_super = super(AlluxioRecommender, self)
+    self.as_super.__init__(*args, **kwargs)
+
+  def recommendAlluxioConfigurationsFromHDP33(
+    self, configurations, clusterData, services, hosts
+  ):
+    """
+    Recommend configurations for this service based on HDP 3.3.
+    """


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to