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

wuzhiguo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new 6f2f19e  BIGTOP-4194: Add infra stack with the simplest Prometheus 
support (#51)
6f2f19e is described below

commit 6f2f19e80f0bf2b7d69de0aa1d91306d49bcc25e
Author: Zhiguo Wu <[email protected]>
AuthorDate: Fri Aug 23 17:03:38 2024 +0800

    BIGTOP-4194: Add infra stack with the simplest Prometheus support (#51)
---
 bigtop-manager-agent/pom.xml                       |   5 +
 bigtop-manager-bom/pom.xml                         |   9 +-
 .../message/entity/payload/CommandPayload.java     |   4 +-
 .../pojo/{RepoInfo.java => PackageInfo.java}       |  14 +--
 ...SSpecificInfo.java => PackageSpecificInfo.java} |   4 +-
 .../common/message/entity/pojo/RepoInfo.java       |   2 +
 .../org/apache/bigtop/manager/dao/po/RepoPO.java   |   3 +
 .../apache/bigtop/manager/dao/po/ServicePO.java    |   6 +-
 .../manager/server/command/job/AbstractJob.java    |  25 ++--
 .../server/command/job/AbstractServiceJob.java     |   2 +-
 .../command/stage/AbstractComponentStage.java      |   2 +-
 .../server/command/stage/AbstractStage.java        |  39 ++++---
 .../server/command/task/AbstractComponentTask.java |  36 +++---
 .../manager/server/command/task/AbstractTask.java  |  22 ++--
 .../server/model/converter/ServiceConverter.java   |   2 +-
 .../model/dto/{RepoDTO.java => PackageDTO.java}    |  12 +-
 ...{OSSpecificDTO.java => PackageSpecificDTO.java} |   4 +-
 .../bigtop/manager/server/model/dto/RepoDTO.java   |   2 +
 .../manager/server/model/dto/ServiceDTO.java       |   2 +-
 .../bigtop/manager/server/model/dto/StackDTO.java  |   2 +
 .../bigtop/manager/server/model/req/RepoReq.java   |   2 +
 .../bigtop/manager/server/model/vo/RepoVO.java     |   2 +
 .../RepoVO.java => stack/model/PackageModel.java}  |  18 ++-
 ...pecificModel.java => PackageSpecificModel.java} |   4 +-
 .../manager/server/stack/model/RepoModel.java      |   6 +
 .../manager/server/stack/model/ServiceModel.java   |   6 +-
 .../manager/server/stack/model/StackModel.java     |   9 +-
 .../src/main/resources/ddl/DaMeng-DDL-CREATE.sql   |   2 +-
 .../src/main/resources/ddl/MySQL-DDL-CREATE.sql    |   5 +-
 .../resources/stacks/bigtop/3.3.0/metainfo.xml     |  16 +--
 .../bigtop/3.3.0/services/flink/metainfo.xml       |  12 +-
 .../stacks/bigtop/3.3.0/services/hdfs/metainfo.xml |  20 ++--
 .../bigtop/3.3.0/services/kafka/metainfo.xml       |  12 +-
 .../bigtop/3.3.0/services/mapred/metainfo.xml      |  20 ++--
 .../stacks/bigtop/3.3.0/services/solr/metainfo.xml |  13 ++-
 .../stacks/bigtop/3.3.0/services/tez/metainfo.xml  |  12 +-
 .../stacks/bigtop/3.3.0/services/yarn/metainfo.xml |  20 ++--
 .../bigtop/3.3.0/services/zookeeper/metainfo.xml   |  12 +-
 .../main/resources/stacks/infra/1.0.0/metainfo.xml |  41 +++++++
 .../prometheus/configuration/prometheus.xml        |  51 ++++++++
 .../1.0.0/services/prometheus}/metainfo.xml        |  46 ++++----
 .../infra/1.0.0/services/prometheus/order.json     |   1 +
 .../manager/stack/bigtop/param/BigtopParams.java   |  54 +++++++++
 .../bigtop/v3_3_0/flink/FlinkClientScript.java     |   6 -
 .../v3_3_0/flink/FlinkHistoryServerScript.java     |   6 -
 .../stack/bigtop/v3_3_0/flink/FlinkParams.java     |   4 +-
 .../stack/bigtop/v3_3_0/hdfs/DataNodeScript.java   |   6 -
 .../stack/bigtop/v3_3_0/hdfs/HdfsClientScript.java |   6 -
 .../stack/bigtop/v3_3_0/hdfs/HdfsParams.java       |   4 +-
 .../stack/bigtop/v3_3_0/hdfs/NameNodeScript.java   |   6 -
 .../stack/bigtop/v3_3_0/hdfs/SNameNodeScript.java  |   6 -
 .../bigtop/v3_3_0/kafka/KafkaBrokerScript.java     |   6 -
 .../stack/bigtop/v3_3_0/kafka/KafkaParams.java     |   4 +-
 .../bigtop/v3_3_0/mapred/HistoryServerScript.java  |   6 -
 .../bigtop/v3_3_0/mapred/MapredClientScript.java   |   6 -
 .../bigtop/v3_3_0/mapred/Mapreduce2Params.java     |   4 +-
 .../stack/bigtop/v3_3_0/solr/SolrClientScript.java |   6 -
 .../stack/bigtop/v3_3_0/solr/SolrParams.java       |   4 +-
 .../stack/bigtop/v3_3_0/solr/SolrServerScript.java |   6 -
 .../stack/bigtop/v3_3_0/tez/TezClientScript.java   |   6 -
 .../manager/stack/bigtop/v3_3_0/tez/TezParams.java |   4 +-
 .../bigtop/v3_3_0/yarn/NodeManagerScript.java      |   6 -
 .../bigtop/v3_3_0/yarn/ResourceManagerScript.java  |   6 -
 .../stack/bigtop/v3_3_0/yarn/YarnClientScript.java |   6 -
 .../stack/bigtop/v3_3_0/yarn/YarnParams.java       |   4 +-
 .../v3_3_0/zookeeper/ZookeeperClientScript.java    |   6 -
 .../bigtop/v3_3_0/zookeeper/ZookeeperParams.java   |   4 +-
 .../v3_3_0/zookeeper/ZookeeperServerScript.java    |   6 -
 .../bigtop-manager-stack-core/pom.xml              |   5 +
 .../manager/stack/core/param/BaseParams.java       |  88 +++++++-------
 .../bigtop/manager/stack/core/param/Params.java    |  15 ++-
 .../manager/stack/core/spi/hook/InstallHook.java   |   3 +-
 .../stack/core/spi/script/AbstractScript.java      |  48 ++++++++
 .../stack/core/tarball/ChecksumValidator.java      |  55 +++++++++
 .../stack/core/tarball/TarballDownloader.java      |  86 ++++++++++++++
 .../stack/core/tarball/TarballExtractor.java       | 129 +++++++++++++++++++++
 .../manager/stack/core/utils/TarballUtils.java     |  86 ++++++++++++++
 .../stack/core/utils/linux/LinuxFileUtils.java     |  12 +-
 .../pom.xml                                        |  22 +---
 .../manager/stack/infra/param/InfraParams.java     |  34 +++---
 .../infra/v1_0_0/prometheus/PrometheusParams.java  |  31 +++--
 .../v1_0_0/prometheus/PrometheusServerScript.java} |  40 ++++---
 .../infra/v1_0_0/prometheus/PrometheusSetup.java}  |  36 +++---
 bigtop-manager-stack/pom.xml                       |   1 +
 bigtop-manager-ui/src/api/repo/types.ts            |   1 +
 pom.xml                                            |   6 +
 86 files changed, 973 insertions(+), 440 deletions(-)

diff --git a/bigtop-manager-agent/pom.xml b/bigtop-manager-agent/pom.xml
index 08fdcfc..7923b0f 100644
--- a/bigtop-manager-agent/pom.xml
+++ b/bigtop-manager-agent/pom.xml
@@ -63,6 +63,11 @@
             <artifactId>bigtop-manager-stack-bigtop</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.bigtop</groupId>
+            <artifactId>bigtop-manager-stack-infra</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
diff --git a/bigtop-manager-bom/pom.xml b/bigtop-manager-bom/pom.xml
index d0a4ad4..72f101a 100644
--- a/bigtop-manager-bom/pom.xml
+++ b/bigtop-manager-bom/pom.xml
@@ -36,9 +36,10 @@
         <freemarker.version>2.3.32</freemarker.version>
         <common-lang3.version>3.12.0</common-lang3.version>
         <snakeyaml.version>2.0</snakeyaml.version>
-        <commons-io.version>2.13.0</commons-io.version>
+        <commons-io.version>2.16.1</commons-io.version>
         <guava.version>32.1.1-jre</guava.version>
         <commons-collections4.version>4.4</commons-collections4.version>
+        <commons-compress.version>1.26.2</commons-compress.version>
         <jwt.version>4.4.0</jwt.version>
         <janino.version>3.0.16</janino.version>
         <eclipse-link.version>4.0.2</eclipse-link.version>
@@ -128,6 +129,12 @@
                 <version>${commons-collections4.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-compress</artifactId>
+                <version>${commons-compress.version}</version>
+            </dependency>
+
             <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava</artifactId>
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
index a3b7a3c..bf7951c 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/payload/CommandPayload.java
@@ -20,7 +20,7 @@ package 
org.apache.bigtop.manager.common.message.entity.payload;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.common.message.entity.pojo.CustomCommandInfo;
-import org.apache.bigtop.manager.common.message.entity.pojo.OSSpecificInfo;
+import 
org.apache.bigtop.manager.common.message.entity.pojo.PackageSpecificInfo;
 import org.apache.bigtop.manager.common.message.entity.pojo.ScriptInfo;
 
 import lombok.Data;
@@ -56,5 +56,5 @@ public class CommandPayload extends BasePayload {
 
     private String componentName;
 
-    private List<OSSpecificInfo> osSpecifics;
+    private List<PackageSpecificInfo> packageSpecifics;
 }
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/PackageInfo.java
similarity index 84%
copy from 
bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
copy to 
bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/PackageInfo.java
index c48c8b1..dfccbc5 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/PackageInfo.java
@@ -25,17 +25,9 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class RepoInfo {
+public class PackageInfo {
 
-    private String repoId;
+    private String name;
 
-    private String repoName;
-
-    private String baseUrl;
-
-    private String os;
-
-    private String arch;
-
-    private String mirrorList;
+    private String checksum;
 }
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/OSSpecificInfo.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/PackageSpecificInfo.java
similarity index 92%
rename from 
bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/OSSpecificInfo.java
rename to 
bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/PackageSpecificInfo.java
index 9c061e8..13be034 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/OSSpecificInfo.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/PackageSpecificInfo.java
@@ -23,11 +23,11 @@ import lombok.Data;
 import java.util.List;
 
 @Data
-public class OSSpecificInfo {
+public class PackageSpecificInfo {
 
     private List<String> os;
 
     private List<String> arch;
 
-    private List<String> packages;
+    private List<PackageInfo> packages;
 }
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
index c48c8b1..4eb4890 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
@@ -31,6 +31,8 @@ public class RepoInfo {
 
     private String repoName;
 
+    private String repoType;
+
     private String baseUrl;
 
     private String os;
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
index 4f502bf..d0a922a 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
@@ -69,6 +69,9 @@ public class RepoPO extends BasePO {
     @Column(name = "repo_name")
     private String repoName;
 
+    @Column(name = "repo_type")
+    private String repoType;
+
     @ManyToOne
     @JoinColumn(name = "cluster_id", foreignKey = 
@ForeignKey(ConstraintMode.NO_CONSTRAINT))
     private ClusterPO clusterPO;
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
index f49a254..51a7369 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ServicePO.java
@@ -64,14 +64,14 @@ public class ServicePO extends BasePO {
     @Column(name = "display_name")
     private String displayName;
 
-    @Column(name = "service_desc")
+    @Column(name = "service_desc", length = 1024)
     private String serviceDesc;
 
     @Column(name = "service_version")
     private String serviceVersion;
 
-    @Column(name = "os_specifics")
-    private String osSpecifics;
+    @Column(name = "package_specifics", length = 1024)
+    private String packageSpecifics;
 
     @Column(name = "service_user")
     private String serviceUser;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
index 8987db0..2dc180e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
@@ -87,18 +87,23 @@ public abstract class AbstractJob implements Job {
 
     @Override
     public void run() {
-        beforeRun();
-
         boolean success = true;
-        LinkedBlockingQueue<Stage> queue = new LinkedBlockingQueue<>(stages);
-        while (!queue.isEmpty()) {
-            Stage stage = queue.poll();
-            Boolean stageSuccess = stage.run();
-
-            if (!stageSuccess) {
-                success = false;
-                break;
+
+        try {
+            beforeRun();
+
+            LinkedBlockingQueue<Stage> queue = new 
LinkedBlockingQueue<>(stages);
+            while (!queue.isEmpty()) {
+                Stage stage = queue.poll();
+                Boolean stageSuccess = stage.run();
+
+                if (!stageSuccess) {
+                    success = false;
+                    break;
+                }
             }
+        } catch (Exception e) {
+            success = false;
         }
 
         if (success) {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
index 76bf6f5..a5bd909 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractServiceJob.java
@@ -96,7 +96,7 @@ public abstract class AbstractServiceJob extends AbstractJob {
 
     protected List<String> getTodoListForCommand(Command command) {
         try {
-            List<String> orderedList = dag.topologicalSort();
+            List<String> orderedList = dag.getAllNodesList().isEmpty() ? new 
ArrayList<>() : dag.topologicalSort();
             List<String> componentNames = getComponentNames();
             List<String> componentCommandNames = new 
ArrayList<>(componentNames.stream()
                     .map(x -> x + "-" + command.name().toUpperCase())
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
index 9e2b589..fb6029a 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractComponentStage.java
@@ -78,7 +78,7 @@ public abstract class AbstractComponentStage extends 
AbstractStage {
 
         Map<String, Object> properties = new HashMap<>();
         properties.put("customCommands", componentDTO.getCustomCommands());
-        properties.put("osSpecifics", serviceDTO.getOsSpecifics());
+        properties.put("packageSpecifics", serviceDTO.getPackageSpecifics());
         properties.put("commandScript", componentDTO.getCommandScript());
         taskContext.setProperties(properties);
         return taskContext;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
index 4b72b62..fd30373 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
@@ -79,24 +79,31 @@ public abstract class AbstractStage implements Stage {
 
     @Override
     public Boolean run() {
-        beforeRun();
-
-        List<CompletableFuture<Boolean>> futures = new ArrayList<>();
-        for (Task task : tasks) {
-            futures.add(CompletableFuture.supplyAsync(task::run));
+        boolean allTaskSuccess;
+
+        try {
+            beforeRun();
+
+            List<CompletableFuture<Boolean>> futures = new ArrayList<>();
+            for (Task task : tasks) {
+                futures.add(CompletableFuture.supplyAsync(task::run));
+            }
+
+            List<Boolean> taskResults = futures.stream()
+                    .map((future) -> {
+                        try {
+                            return future.get();
+                        } catch (Exception e) {
+                            return false;
+                        }
+                    })
+                    .toList();
+
+            allTaskSuccess = 
taskResults.stream().allMatch(Boolean::booleanValue);
+        } catch (Exception e) {
+            allTaskSuccess = false;
         }
 
-        List<Boolean> taskResults = futures.stream()
-                .map((future) -> {
-                    try {
-                        return future.get();
-                    } catch (Exception e) {
-                        return false;
-                    }
-                })
-                .toList();
-
-        boolean allTaskSuccess = 
taskResults.stream().allMatch(Boolean::booleanValue);
         if (allTaskSuccess) {
             onSuccess();
         } else {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
index 7ab444f..763bf0a 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractComponentTask.java
@@ -20,7 +20,8 @@ package org.apache.bigtop.manager.server.command.task;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
 import org.apache.bigtop.manager.common.message.entity.pojo.CustomCommandInfo;
-import org.apache.bigtop.manager.common.message.entity.pojo.OSSpecificInfo;
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
+import 
org.apache.bigtop.manager.common.message.entity.pojo.PackageSpecificInfo;
 import org.apache.bigtop.manager.common.message.entity.pojo.ScriptInfo;
 import org.apache.bigtop.manager.common.utils.JsonUtils;
 import org.apache.bigtop.manager.dao.repository.HostComponentRepository;
@@ -28,7 +29,8 @@ import 
org.apache.bigtop.manager.grpc.generated.CommandRequest;
 import org.apache.bigtop.manager.grpc.generated.CommandType;
 import org.apache.bigtop.manager.server.holder.SpringContextHolder;
 import org.apache.bigtop.manager.server.model.dto.CustomCommandDTO;
-import org.apache.bigtop.manager.server.model.dto.OSSpecificDTO;
+import org.apache.bigtop.manager.server.model.dto.PackageDTO;
+import org.apache.bigtop.manager.server.model.dto.PackageSpecificDTO;
 import org.apache.bigtop.manager.server.model.dto.ScriptDTO;
 
 import java.util.ArrayList;
@@ -67,7 +69,8 @@ public abstract class AbstractComponentTask extends 
AbstractTask {
 
         commandPayload.setCustomCommands(
                 convertCustomCommandInfo((List<CustomCommandDTO>) 
properties.get("customCommands")));
-        
commandPayload.setOsSpecifics(convertOSSpecificInfo((List<OSSpecificDTO>) 
properties.get("osSpecifics")));
+        commandPayload.setPackageSpecifics(
+                convertPackageSpecificInfo((List<PackageSpecificDTO>) 
properties.get("packageSpecifics")));
         commandPayload.setCommandScript(convertScriptInfo((ScriptDTO) 
properties.get("commandScript")));
 
         CommandRequest.Builder builder = CommandRequest.newBuilder();
@@ -90,21 +93,28 @@ public abstract class AbstractComponentTask extends 
AbstractTask {
         return scriptInfo;
     }
 
-    private List<OSSpecificInfo> convertOSSpecificInfo(List<OSSpecificDTO> 
osSpecificDTOs) {
-        if (osSpecificDTOs == null) {
+    private List<PackageSpecificInfo> 
convertPackageSpecificInfo(List<PackageSpecificDTO> packageSpecificDTOList) {
+        if (packageSpecificDTOList == null) {
             return new ArrayList<>();
         }
 
-        List<OSSpecificInfo> osSpecificInfos = new ArrayList<>();
-        for (OSSpecificDTO osSpecificDTO : osSpecificDTOs) {
-            OSSpecificInfo osSpecificInfo = new OSSpecificInfo();
-            osSpecificInfo.setOs(osSpecificDTO.getOs());
-            osSpecificInfo.setArch(osSpecificDTO.getArch());
-            osSpecificInfo.setPackages(osSpecificDTO.getPackages());
-            osSpecificInfos.add(osSpecificInfo);
+        List<PackageSpecificInfo> packageSpecificInfos = new ArrayList<>();
+        for (PackageSpecificDTO packageSpecificDTO : packageSpecificDTOList) {
+            PackageSpecificInfo packageSpecificInfo = new 
PackageSpecificInfo();
+            packageSpecificInfo.setOs(packageSpecificDTO.getOs());
+            packageSpecificInfo.setArch(packageSpecificDTO.getArch());
+            List<PackageInfo> packageInfoList = new ArrayList<>();
+            for (PackageDTO packageDTO : packageSpecificDTO.getPackages()) {
+                PackageInfo packageInfo = new PackageInfo();
+                packageInfo.setName(packageDTO.getName());
+                packageInfo.setChecksum(packageDTO.getChecksum());
+                packageInfoList.add(packageInfo);
+            }
+            packageSpecificInfo.setPackages(packageInfoList);
+            packageSpecificInfos.add(packageSpecificInfo);
         }
 
-        return osSpecificInfos;
+        return packageSpecificInfos;
     }
 
     private List<CustomCommandInfo> 
convertCustomCommandInfo(List<CustomCommandDTO> customCommandDTOs) {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
index c0916ee..fc750b7 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
@@ -71,17 +71,23 @@ public abstract class AbstractTask implements Task {
 
     @Override
     public Boolean run() {
-        beforeRun();
+        boolean taskSuccess;
 
-        CommandRequest.Builder builder = 
CommandRequest.newBuilder(getCommandRequest());
-        builder.setTaskId(getTaskPO().getId());
-        commandRequest = builder.build();
+        try {
+            beforeRun();
 
-        CommandServiceGrpc.CommandServiceBlockingStub stub = 
GrpcClient.getBlockingStub(
-                taskContext.getHostname(), 
CommandServiceGrpc.CommandServiceBlockingStub.class);
-        CommandReply reply = stub.exec(commandRequest);
+            CommandRequest.Builder builder = 
CommandRequest.newBuilder(getCommandRequest());
+            builder.setTaskId(getTaskPO().getId());
+            commandRequest = builder.build();
 
-        boolean taskSuccess = reply != null && reply.getCode() == 
MessageConstants.SUCCESS_CODE;
+            CommandServiceGrpc.CommandServiceBlockingStub stub = 
GrpcClient.getBlockingStub(
+                    taskContext.getHostname(), 
CommandServiceGrpc.CommandServiceBlockingStub.class);
+            CommandReply reply = stub.exec(commandRequest);
+
+            taskSuccess = reply != null && reply.getCode() == 
MessageConstants.SUCCESS_CODE;
+        } catch (Exception e) {
+            taskSuccess = false;
+        }
 
         if (taskSuccess) {
             onSuccess();
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
index bee6a7f..320f204 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ServiceConverter.java
@@ -41,7 +41,7 @@ public interface ServiceConverter {
 
     ServiceConverter INSTANCE = Mappers.getMapper(ServiceConverter.class);
 
-    @Mapping(target = "osSpecifics", source = "osSpecifics", qualifiedByName = 
"obj2Json")
+    @Mapping(target = "packageSpecifics", source = "packageSpecifics", 
qualifiedByName = "obj2Json")
     @Mapping(target = "requiredServices", source = "requiredServices", 
qualifiedByName = "obj2Json")
     @Mapping(target = "clusterPO", expression = "java(clusterPO)")
     ServicePO fromDTO2PO(ServiceDTO serviceDTO, @Context ClusterPO clusterPO);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PackageDTO.java
similarity index 86%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PackageDTO.java
index aee938d..8cabb51 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PackageDTO.java
@@ -25,15 +25,9 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class RepoDTO {
+public class PackageDTO {
 
-    private String repoId;
+    private String name;
 
-    private String repoName;
-
-    private String baseUrl;
-
-    private String os;
-
-    private String arch;
+    private String checksum;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/OSSpecificDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PackageSpecificDTO.java
similarity index 93%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/OSSpecificDTO.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PackageSpecificDTO.java
index 4160f07..23c81a4 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/OSSpecificDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PackageSpecificDTO.java
@@ -23,11 +23,11 @@ import lombok.Data;
 import java.util.List;
 
 @Data
-public class OSSpecificDTO {
+public class PackageSpecificDTO {
 
     private List<String> os;
 
     private List<String> arch;
 
-    private List<String> packages;
+    private List<PackageDTO> packages;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
index aee938d..6683956 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
@@ -31,6 +31,8 @@ public class RepoDTO {
 
     private String repoName;
 
+    private String repoType;
+
     private String baseUrl;
 
     private String os;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
index b0c5a32..cb742ee 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ServiceDTO.java
@@ -35,7 +35,7 @@ public class ServiceDTO {
 
     private String serviceUser;
 
-    private List<OSSpecificDTO> osSpecifics;
+    private List<PackageSpecificDTO> packageSpecifics;
 
     private List<ComponentDTO> components;
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/StackDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/StackDTO.java
index a1cac07..9ad94ac 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/StackDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/StackDTO.java
@@ -29,6 +29,8 @@ public class StackDTO {
 
     private String stackVersion;
 
+    private String scope;
+
     private String root;
 
     private String userGroup;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/RepoReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/RepoReq.java
index c2d26ca..324dc97 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/RepoReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/RepoReq.java
@@ -31,6 +31,8 @@ public class RepoReq {
 
     private String repoName;
 
+    private String repoType;
+
     private String baseUrl;
 
     private String os;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/RepoVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/RepoVO.java
index ee7ca0f..5968ea0 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/RepoVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/RepoVO.java
@@ -27,6 +27,8 @@ public class RepoVO {
 
     private String repoName;
 
+    private String repoType;
+
     private String baseUrl;
 
     private String os;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/RepoVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/PackageModel.java
similarity index 75%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/RepoVO.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/PackageModel.java
index ee7ca0f..ca9b2be 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/RepoVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/PackageModel.java
@@ -16,20 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.server.stack.model;
 
 import lombok.Data;
 
-@Data
-public class RepoVO {
-
-    private String repoId;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
 
-    private String repoName;
-
-    private String baseUrl;
+@Data
+@XmlAccessorType(XmlAccessType.FIELD)
+public class PackageModel {
 
-    private String os;
+    private String name;
 
-    private String arch;
+    private String checksum;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/OSSpecificModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/PackageSpecificModel.java
similarity index 95%
rename from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/OSSpecificModel.java
rename to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/PackageSpecificModel.java
index b2dc423..a600b76 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/OSSpecificModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/PackageSpecificModel.java
@@ -29,7 +29,7 @@ import java.util.List;
 
 @Data
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OSSpecificModel {
+public class PackageSpecificModel {
 
     @XmlElementWrapper(name = "operating-systems")
     @XmlElements(@XmlElement(name = "os"))
@@ -41,5 +41,5 @@ public class OSSpecificModel {
 
     @XmlElementWrapper(name = "packages")
     @XmlElements(@XmlElement(name = "package"))
-    private List<String> packages;
+    private List<PackageModel> packages;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/RepoModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/RepoModel.java
index 3ea4887..d759e4d 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/RepoModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/RepoModel.java
@@ -38,6 +38,12 @@ public class RepoModel {
     @XmlElement(name = "repo-name")
     private String repoName;
 
+    /**
+     * Type of repositories, values can be 'binary', 'tarball'.
+     */
+    @XmlElement(name = "repo-type")
+    private String repoType;
+
     @XmlElement(name = "base-url")
     private String baseUrl;
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/ServiceModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/ServiceModel.java
index 944bb0a..00a1092 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/ServiceModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/ServiceModel.java
@@ -42,9 +42,9 @@ public class ServiceModel {
 
     private String user;
 
-    @XmlElementWrapper(name = "os-specifics")
-    @XmlElements(@XmlElement(name = "os-specific"))
-    private List<OSSpecificModel> osSpecifics;
+    @XmlElementWrapper(name = "package-specifics")
+    @XmlElements(@XmlElement(name = "package-specific"))
+    private List<PackageSpecificModel> packageSpecifics;
 
     @XmlElementWrapper(name = "components")
     @XmlElements(@XmlElement(name = "component"))
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/StackModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/StackModel.java
index 45aeb40..a896586 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/StackModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/model/StackModel.java
@@ -37,11 +37,16 @@ public class StackModel {
     @XmlElement(name = "stack-version")
     private String stackVersion;
 
-    private String root;
-
     @XmlElement(name = "user-group")
     private String userGroup;
 
+    /**
+     * The scope of the stack, should be one of 'global' or 'cluster'.
+     */
+    private String scope;
+
+    private String root;
+
     private String packages;
 
     @XmlElement(name = "repo-template")
diff --git a/bigtop-manager-server/src/main/resources/ddl/DaMeng-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/DaMeng-DDL-CREATE.sql
index f2eabdd..6e24db9 100644
--- a/bigtop-manager-server/src/main/resources/ddl/DaMeng-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/DaMeng-DDL-CREATE.sql
@@ -188,7 +188,7 @@ CREATE TABLE "bigtop_manager"."service" (
        "update_by" BIGINT NULL,
        "update_time" DATETIME NULL,
        "display_name" VARCHAR(255) NULL,
-       "os_specifics" VARCHAR(255) NULL,
+       "package_specifics" VARCHAR(255) NULL,
        "required_service" VARCHAR(255) NULL,
        "service_desc" VARCHAR(255) NULL,
        "service_group" VARCHAR(255) NULL,
diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
index 1573200..ba9147f 100644
--- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
@@ -168,6 +168,7 @@ CREATE TABLE `repo`
     `base_url`    VARCHAR(64) DEFAULT NULL,
     `repo_id`     VARCHAR(32) DEFAULT NULL,
     `repo_name`   VARCHAR(64) DEFAULT NULL,
+    `repo_type`   VARCHAR(64) DEFAULT NULL,
     `create_time` DATETIME    DEFAULT NULL,
     `update_time` DATETIME    DEFAULT NULL,
     `create_by`   BIGINT,
@@ -256,9 +257,9 @@ CREATE TABLE `service`
     `create_by`         BIGINT,
     `create_time`       DATETIME,
     `display_name`      VARCHAR(255),
-    `os_specifics`      VARCHAR(255),
+    `package_specifics` VARCHAR(1024),
     `required_services` VARCHAR(255),
-    `service_desc`      VARCHAR(255),
+    `service_desc`      VARCHAR(1024),
     `service_name`      VARCHAR(255),
     `service_user`      VARCHAR(255),
     `service_version`   VARCHAR(255),
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/metainfo.xml 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/metainfo.xml
index ea14359..53a82c3 100644
--- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/metainfo.xml
+++ b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/metainfo.xml
@@ -23,6 +23,7 @@
         <stack-name>bigtop</stack-name>
         <stack-version>3.3.0</stack-version>
         <user-group>hadoop</user-group>
+        <scope>cluster</scope>
         <root>/opt</root>
         <packages>curl,wget</packages>
         <repo-template><![CDATA[
@@ -39,23 +40,10 @@ gpgcheck=0
 ]]>
         </repo-template>
         <repos>
-            <repo>
-                <repo-id>Bigtop-3.3.0</repo-id>
-                <repo-name>Bigtop-3.3.0 for CentOS-7 x86_64</repo-name>
-                <os>centos7</os>
-                <arch>x86_64</arch>
-                
<base-url>http://123.56.2.244/bigtop/3.3.0/centos7/x86_64/</base-url>
-            </repo>
-            <repo>
-                <repo-id>Bigtop-3.3.0</repo-id>
-                <repo-name>Bigtop-3.3.0 for CentOS-7 aarch64</repo-name>
-                <os>centos7</os>
-                <arch>aarch64</arch>
-                
<base-url>https://bigtop-snapshot.s3.amazonaws.com/centos-7/$basearch</base-url>
-            </repo>
             <repo>
                 <repo-id>Bigtop-3.3.0</repo-id>
                 <repo-name>Bigtop-3.3.0 for RockyLinux-8 x86_64</repo-name>
+                <repo-type>binary</repo-type>
                 <os>rocky8</os>
                 <arch>x86_64</arch>
                 
<base-url>http://123.56.2.244/bigtop/3.3.0/rocky8/x86_64/</base-url>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
index 5598716..c62639a 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
@@ -58,8 +58,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -68,10 +68,12 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>flink_3_3_0</package>
+                    <package>
+                        <name>flink_3_3_0</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
 
         <required-services>
             <service>yarn</service>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
index 52dd1fb..5878f17 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
@@ -98,8 +98,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -108,12 +108,18 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>hadoop_3_3_0</package>
-                    <package>hadoop_3_3_0-client</package>
-                    <package>hadoop_3_3_0-libhdfs</package>
+                    <package>
+                        <name>hadoop_3_3_0</name>
+                    </package>
+                    <package>
+                        <name>hadoop_3_3_0-client</name>
+                    </package>
+                    <package>
+                        <name>hadoop_3_3_0-libhdfs</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
 
         <required-services>
             <service>zookeeper</service>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
index 93febf4..a31f99c 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
@@ -54,8 +54,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -64,10 +64,12 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>kafka_3_3_0</package>
+                    <package>
+                        <name>kafka_3_3_0</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
 
         <required-services>
             <service>zookeeper</service>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/mapred/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/mapred/metainfo.xml
index 95d6894..4ece698 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/mapred/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/mapred/metainfo.xml
@@ -58,8 +58,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -68,12 +68,18 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>hadoop_3_3_0-yarn</package>
-                    <package>hadoop_3_3_0-hdfs</package>
-                    <package>hadoop_3_3_0-mapreduce</package>
+                    <package>
+                        <name>hadoop_3_3_0-yarn</name>
+                    </package>
+                    <package>
+                        <name>hadoop_3_3_0-hdfs</name>
+                    </package>
+                    <package>
+                        <name>hadoop_3_3_0-mapreduce</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
 
         <required-services>
             <service>yarn</service>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
index 15581b2..753f5cf 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
@@ -48,8 +48,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -58,10 +58,13 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>solr_3_3_0</package>
+                    <package>
+                        <name>solr_3_3_0</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
+
         <required-services>
             <service>zookeeper</service>
         </required-services>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
index 86c9ed8..59aacf0 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
@@ -40,8 +40,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -50,10 +50,12 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>tez_3_3_0</package>
+                    <package>
+                        <name>tez_3_3_0</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
 
         <required-services>
             <service>hdfs</service>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
index f66e0ae..6ccd747 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
@@ -87,8 +87,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -97,12 +97,18 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>hadoop_3_3_0-yarn</package>
-                    <package>hadoop_3_3_0-hdfs</package>
-                    <package>hadoop_3_3_0-mapreduce</package>
+                    <package>
+                        <name>hadoop_3_3_0-yarn</name>
+                    </package>
+                    <package>
+                        <name>hadoop_3_3_0-hdfs</name>
+                    </package>
+                    <package>
+                        <name>hadoop_3_3_0-mapreduce</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
 
         <required-services>
             <service>zookeeper</service>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
index 620bf9c..df686c0 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
@@ -54,8 +54,8 @@
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -64,9 +64,11 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>zookeeper_3_3_0</package>
+                    <package>
+                        <name>zookeeper_3_3_0</name>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
+            </package-specific>
+        </package-specifics>
     </service>
 </metainfo>
\ No newline at end of file
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/metainfo.xml 
b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/metainfo.xml
new file mode 100644
index 0000000..74a38f3
--- /dev/null
+++ b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/metainfo.xml
@@ -0,0 +1,41 @@
+<?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
+  ~
+  ~    https://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>
+    <stack>
+        <stack-name>infra</stack-name>
+        <stack-version>1.0.0</stack-version>
+        <user-group>hadoop</user-group>
+        <scope>global</scope>
+        <root>/opt</root>
+        <packages>curl,wget</packages>
+        <repo-template />
+        <repos>
+            <repo>
+                <repo-id>Infra-1.0.0</repo-id>
+                <repo-name>Infra-1.0.0 for RockyLinux-8 x86_64</repo-name>
+                <repo-type>tarball</repo-type>
+                <os>rocky8</os>
+                <arch>x86_64</arch>
+                <base-url>http://123.56.2.244/infra/1.0.0/tarballs/</base-url>
+            </repo>
+        </repos>
+    </stack>
+</metainfo>
\ No newline at end of file
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/configuration/prometheus.xml
 
b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/configuration/prometheus.xml
new file mode 100644
index 0000000..03d7e8a
--- /dev/null
+++ 
b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/configuration/prometheus.xml
@@ -0,0 +1,51 @@
+<?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
+  ~
+  ~    https://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>
+    <property>
+        <name>content</name>
+        <description>This is the freemarker template for prometheus.yml 
file</description>
+        <value><![CDATA[
+global:
+  scrape_interval:     15s # By default, scrape targets every 15 seconds.
+
+  # Attach these labels to any time series or alerts when communicating with
+  # external systems (federation, remote storage, Alertmanager).
+  external_labels:
+    monitor: 'codelab-monitor'
+
+# A scrape configuration containing exactly one endpoint to scrape:
+# Here it's Prometheus itself.
+scrape_configs:
+  # The job name is added as a label `job=<job_name>` to any timeseries 
scraped from this config.
+  - job_name: 'prometheus'
+
+    # Override the global default and scrape targets from this job every 5 
seconds.
+    scrape_interval: 5s
+
+    static_configs:
+      - targets: ['localhost:9090']
+]]>
+        </value>
+        <attrs>
+            <type>longtext</type>
+        </attrs>
+    </property>
+</configuration>
\ No newline at end of file
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/metainfo.xml
similarity index 57%
copy from 
bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
copy to 
bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/metainfo.xml
index 15581b2..92b2fdd 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/metainfo.xml
@@ -17,39 +17,35 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
 -->
+
 <metainfo>
-    <schema-version>2.0</schema-version>
     <service>
-        <name>solr</name>
-        <display-name>Solr</display-name>
+        <name>prometheus</name>
+        <display-name>Prometheus</display-name>
         <desc>
-            Solr is the popular, blazing-fast, open source enterprise search 
platform built on Apache Lucene.
+            Prometheus, a Cloud Native Computing Foundation project, is a 
systems and service monitoring system. It
+            collects metrics from configured targets at given intervals, 
evaluates rule expressions, displays the
+            results, and can trigger alerts when specified conditions are 
observed.
         </desc>
-        <version>8.11.2-2</version>
-        <user>solr</user>
+        <version>2.54.0</version>
+        <user>prometheus</user>
+
         <components>
             <component>
-                <name>solr_instance</name>
-                <display-name>Solr Instance</display-name>
+                <name>prometheus_server</name>
+                <display-name>Prometheus Server</display-name>
                 <category>master</category>
                 <cardinality>1+</cardinality>
                 <command-script>
-                    
<script-id>org.apache.bigtop.manager.stack.bigtop.v3_3_0.solr.SolrServerScript</script-id>
+                    
<script-id>org.apache.bigtop.manager.stack.infra.v1_0_0.prometheus.PrometheusServerScript</script-id>
                     <script-type>java</script-type>
                     <timeout>1200</timeout>
                 </command-script>
-                <quick-link>
-                    <display-name>Solr UI</display-name>
-                    <http-port-property>solr_port</http-port-property>
-                    <http-port-default>8983</http-port-default>
-                    <https-port-property>solr_port</https-port-property>
-                    <https-port-default>8983</https-port-default>
-                </quick-link>
             </component>
         </components>
 
-        <os-specifics>
-            <os-specific>
+        <package-specifics>
+            <package-specific>
                 <operating-systems>
                     <os>centos7</os>
                     <os>rocky8</os>
@@ -58,12 +54,12 @@
                     <arch>x86_64</arch>
                 </architectures>
                 <packages>
-                    <package>solr_3_3_0</package>
+                    <package>
+                        <name>prometheus-2.54.0.linux-amd64.tar.gz</name>
+                        
<checksum>SHA-256:465e1393a0cca9705598f6ffaf96ffa78d0347808ab21386b0c6aaec2cf7aa13</checksum>
+                    </package>
                 </packages>
-            </os-specific>
-        </os-specifics>
-        <required-services>
-            <service>zookeeper</service>
-        </required-services>
+            </package-specific>
+        </package-specifics>
     </service>
-</metainfo>
+</metainfo>
\ No newline at end of file
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/order.json
 
b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/order.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ 
b/bigtop-manager-server/src/main/resources/stacks/infra/1.0.0/services/prometheus/order.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/param/BigtopParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/param/BigtopParams.java
new file mode 100644
index 0000000..8ffe694
--- /dev/null
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/param/BigtopParams.java
@@ -0,0 +1,54 @@
+/*
+ * 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
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.stack.bigtop.param;
+
+import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.core.param.BaseParams;
+
+import java.text.MessageFormat;
+
+public abstract class BigtopParams extends BaseParams {
+
+    protected BigtopParams(CommandPayload commandPayload) {
+        super(commandPayload);
+    }
+
+    public String stackBinDir() {
+        String stackName = this.commandPayload.getStackName();
+        String stackVersion = this.commandPayload.getStackVersion();
+        String root = this.commandPayload.getRoot();
+        return MessageFormat.format("{0}/{1}/{2}/usr/bin", root, 
stackName.toLowerCase(), stackVersion);
+    }
+
+    public String stackLibDir() {
+        String stackName = this.commandPayload.getStackName();
+        String stackVersion = this.commandPayload.getStackVersion();
+        String root = this.commandPayload.getRoot();
+        return MessageFormat.format("{0}/{1}/{2}/usr/lib", root, 
stackName.toLowerCase(), stackVersion);
+    }
+
+    /**
+     * service home dir
+     */
+    @Override
+    public String serviceHome() {
+        String service = this.commandPayload.getServiceName();
+        return stackLibDir() + "/" + service.toLowerCase();
+    }
+}
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkClientScript.java
index cdda767..fdfaccd 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkClientScript.java
@@ -22,7 +22,6 @@ import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,11 +30,6 @@ import lombok.extern.slf4j.Slf4j;
 @AutoService(Script.class)
 public class FlinkClientScript extends AbstractClientScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return FlinkSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkHistoryServerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkHistoryServerScript.java
index e4dc063..3466393 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkHistoryServerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkHistoryServerScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -31,11 +30,6 @@ import com.google.auto.service.AutoService;
 @AutoService(Script.class)
 public class FlinkHistoryServerScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return FlinkSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkParams.java
index 8ae12cd..6c8b0b4 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/flink/FlinkParams.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.flink;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import lombok.Getter;
@@ -31,7 +31,7 @@ import java.util.Map;
 
 @Getter
 @Slf4j
-public class FlinkParams extends BaseParams {
+public class FlinkParams extends BigtopParams {
 
     private String flinkLogDir;
     private String flinkPidDir;
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/DataNodeScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/DataNodeScript.java
index 2085834..b48090f 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/DataNodeScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/DataNodeScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -35,11 +34,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class DataNodeScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return HdfsSetup.config(params, "datanode");
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsClientScript.java
index 02262e7..455d940 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsClientScript.java
@@ -22,7 +22,6 @@ import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,11 +30,6 @@ import lombok.extern.slf4j.Slf4j;
 @AutoService(Script.class)
 public class HdfsClientScript extends AbstractClientScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return HdfsSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
index aa45a5d..df7122a 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.hdfs;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import org.apache.commons.lang3.StringUtils;
@@ -35,7 +35,7 @@ import java.util.Map;
 
 @Getter
 @Slf4j
-public class HdfsParams extends BaseParams {
+public class HdfsParams extends BigtopParams {
 
     private String hadoopLogDir = "/var/log/hadoop";
     private String hadoopPidDir = "/var/run/hadoop";
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/NameNodeScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/NameNodeScript.java
index 5f30f29..2172414 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/NameNodeScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/NameNodeScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -35,11 +34,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class NameNodeScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return HdfsSetup.config(params, "namenode");
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/SNameNodeScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/SNameNodeScript.java
index 67eba56..c92a283 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/SNameNodeScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/SNameNodeScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -35,11 +34,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class SNameNodeScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return HdfsSetup.config(params, "secondarynamenode");
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaBrokerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaBrokerScript.java
index 7cc29c4..308b102 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaBrokerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaBrokerScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -36,11 +35,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class KafkaBrokerScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return KafkaSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaParams.java
index c3c6411..faa6ea1 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/kafka/KafkaParams.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.kafka;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import lombok.Getter;
@@ -28,7 +28,7 @@ import lombok.Getter;
 import java.util.Map;
 
 @Getter
-public class KafkaParams extends BaseParams {
+public class KafkaParams extends BigtopParams {
 
     private String kafkaLogDir = "/var/log/kafka";
     private String kafkaPidDir = "/var/run/kafka";
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/HistoryServerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/HistoryServerScript.java
index 58e5b39..b07d4b9 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/HistoryServerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/HistoryServerScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -33,11 +32,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class HistoryServerScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return MapredSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/MapredClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/MapredClientScript.java
index 48429f5..1aea957 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/MapredClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/MapredClientScript.java
@@ -22,7 +22,6 @@ import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,11 +30,6 @@ import lombok.extern.slf4j.Slf4j;
 @AutoService(Script.class)
 public class MapredClientScript extends AbstractClientScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return MapredSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/Mapreduce2Params.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/Mapreduce2Params.java
index f690b09..f4491f6 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/Mapreduce2Params.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/Mapreduce2Params.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.mapred;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import lombok.Getter;
@@ -31,7 +31,7 @@ import java.util.Map;
 
 @Getter
 @Slf4j
-public class Mapreduce2Params extends BaseParams {
+public class Mapreduce2Params extends BigtopParams {
 
     private String mapredEnvContent;
     private String mapredLogDir;
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrClientScript.java
index 23320fe..e7a2b6a 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrClientScript.java
@@ -22,7 +22,6 @@ import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,11 +30,6 @@ import lombok.extern.slf4j.Slf4j;
 @AutoService(Script.class)
 public class SolrClientScript extends AbstractClientScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return SolrSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrParams.java
index 2f5a9f1..4e68b79 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrParams.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.solr;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import lombok.Getter;
@@ -32,7 +32,7 @@ import java.util.Map;
 
 @Getter
 @Slf4j
-public class SolrParams extends BaseParams {
+public class SolrParams extends BigtopParams {
 
     private String solrPort = "8983";
     private String solrLogDir = "/var/log/solr";
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrServerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrServerScript.java
index fdff7da..dd93fa7 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrServerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrServerScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -36,11 +35,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class SolrServerScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return SolrSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
index 5db7b46..832ada5 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
@@ -22,7 +22,6 @@ import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,11 +30,6 @@ import lombok.extern.slf4j.Slf4j;
 @AutoService(Script.class)
 public class TezClientScript extends AbstractClientScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return TezSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
index f74724d..261fd0e 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.tez;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import org.apache.commons.lang3.StringUtils;
@@ -33,7 +33,7 @@ import java.util.Map;
 
 @Getter
 @Slf4j
-public class TezParams extends BaseParams {
+public class TezParams extends BigtopParams {
 
     private String headDumpOpts;
     private String tezEnvContent;
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/NodeManagerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/NodeManagerScript.java
index 8f89d71..ac90d6b 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/NodeManagerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/NodeManagerScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -35,11 +34,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class NodeManagerScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return YarnSetup.config(params, "nodemanager");
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/ResourceManagerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/ResourceManagerScript.java
index 0db3b11..416b69f 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/ResourceManagerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/ResourceManagerScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -35,11 +34,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class ResourceManagerScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return YarnSetup.config(params, "resourcemanager");
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnClientScript.java
index 10e3d00..cbd29d0 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnClientScript.java
@@ -22,7 +22,6 @@ import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,11 +30,6 @@ import lombok.extern.slf4j.Slf4j;
 @AutoService(Script.class)
 public class YarnClientScript extends AbstractClientScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return YarnSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
index e92dafa..24fbb1d 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.yarn;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import lombok.Getter;
@@ -32,7 +32,7 @@ import java.util.Map;
 
 @Getter
 @Slf4j
-public class YarnParams extends BaseParams {
+public class YarnParams extends BigtopParams {
 
     private String yarnLogDir = "/var/log/hadoop-yarn";
     private String yarnPidDir = "/var/run/hadoop-yarn";
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperClientScript.java
index 067ef09..87faa20 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperClientScript.java
@@ -22,7 +22,6 @@ import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,11 +30,6 @@ import lombok.extern.slf4j.Slf4j;
 @AutoService(Script.class)
 public class ZookeeperClientScript extends AbstractClientScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return ZookeeperSetup.config(params);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperParams.java
index f74faba..05678f7 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperParams.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.zookeeper;
 
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.bigtop.param.BigtopParams;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
-import org.apache.bigtop.manager.stack.core.param.BaseParams;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import lombok.Getter;
@@ -28,7 +28,7 @@ import lombok.Getter;
 import java.util.Map;
 
 @Getter
-public class ZookeeperParams extends BaseParams {
+public class ZookeeperParams extends BigtopParams {
 
     private String zookeeperLogDir = "/var/log/zookeeper";
     private String zookeeperPidDir = "/var/run/zookeeper";
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperServerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperServerScript.java
index 4483094..0a7ed50 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperServerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/zookeeper/ZookeeperServerScript.java
@@ -23,7 +23,6 @@ import 
org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
@@ -36,11 +35,6 @@ import java.text.MessageFormat;
 @AutoService(Script.class)
 public class ZookeeperServerScript extends AbstractServerScript {
 
-    @Override
-    public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
-    }
-
     @Override
     public ShellResult configure(Params params) {
         return ZookeeperSetup.config(params);
diff --git a/bigtop-manager-stack/bigtop-manager-stack-core/pom.xml 
b/bigtop-manager-stack/bigtop-manager-stack-core/pom.xml
index 0423dce..d9591a6 100644
--- a/bigtop-manager-stack/bigtop-manager-stack-core/pom.xml
+++ b/bigtop-manager-stack/bigtop-manager-stack-core/pom.xml
@@ -49,5 +49,10 @@
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
index 49bd5ce..4a4111b 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/BaseParams.java
@@ -20,10 +20,13 @@ package org.apache.bigtop.manager.stack.core.param;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
-import org.apache.bigtop.manager.common.message.entity.pojo.OSSpecificInfo;
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
+import 
org.apache.bigtop.manager.common.message.entity.pojo.PackageSpecificInfo;
+import org.apache.bigtop.manager.common.message.entity.pojo.RepoInfo;
 import org.apache.bigtop.manager.common.utils.NetUtils;
 import org.apache.bigtop.manager.common.utils.os.OSDetection;
 import org.apache.bigtop.manager.stack.core.annotations.GlobalParams;
+import org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 
 import org.apache.commons.lang3.StringUtils;
@@ -33,6 +36,7 @@ import lombok.extern.slf4j.Slf4j;
 
 import java.lang.reflect.Method;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -72,72 +76,66 @@ public abstract class BaseParams implements Params {
         globalParamsMap.remove("content");
     }
 
-    /**
-     * get the package list according to the os and arch
-     */
-    public List<String> getPackageList() {
-        List<OSSpecificInfo> osSpecifics = 
this.commandPayload.getOsSpecifics();
-        if (osSpecifics == null) {
-            return List.of();
-        }
-
-        String os = OSDetection.getOS();
-        String arch = OSDetection.getArch();
-        for (OSSpecificInfo osSpecific : osSpecifics) {
-            List<String> pkgOS = osSpecific.getOs();
-            List<String> pkgArch = osSpecific.getArch();
-            if (pkgOS.contains(os) && pkgArch.contains(arch)) {
-                return osSpecific.getPackages();
-            }
-        }
-
-        return List.of();
-    }
-
     public String hostname() {
         return NetUtils.getHostname();
     }
 
-    public String stackBinDir() {
-        String stackName = this.commandPayload.getStackName();
-        String stackVersion = this.commandPayload.getStackVersion();
-        String root = this.commandPayload.getRoot();
-        return MessageFormat.format("{0}/{1}/{2}/usr/bin", root, 
stackName.toLowerCase(), stackVersion);
-    }
-
-    public String stackLibDir() {
-        String stackName = this.commandPayload.getStackName();
-        String stackVersion = this.commandPayload.getStackVersion();
-        String root = this.commandPayload.getRoot();
-        return MessageFormat.format("{0}/{1}/{2}/usr/lib", root, 
stackName.toLowerCase(), stackVersion);
-    }
-
-    /**
-     * service home dir
-     */
-    public String serviceHome() {
-        String service = this.commandPayload.getServiceName();
-        return stackLibDir() + "/" + service.toLowerCase();
-    }
-
     /**
      * service conf dir
      */
+    @Override
     public String confDir() {
         return "/etc/" + this.commandPayload.getServiceName().toLowerCase() + 
"/conf";
     }
 
+    @Override
     public String user() {
         return StringUtils.isNotBlank(this.commandPayload.getServiceUser())
                 ? this.commandPayload.getServiceUser()
                 : ROOT_USER;
     }
 
+    @Override
     public String group() {
         return LocalSettings.cluster().getUserGroup();
     }
 
+    @Override
+    public RepoInfo repo() {
+        return LocalSettings.repos().stream()
+                .filter(r -> OSDetection.getOS().equals(r.getOs())
+                        && OSDetection.getArch().equals(r.getArch()))
+                .findFirst()
+                .orElseThrow(() -> new StackException(
+                        "Cannot find repo for os: [{}] and arch: [{}]", 
OSDetection.getOS(), OSDetection.getArch()));
+    }
+
+    @Override
+    public List<PackageInfo> packages() {
+        RepoInfo repo = this.repo();
+        List<PackageInfo> packageInfoList = new ArrayList<>();
+        for (PackageSpecificInfo packageSpecificInfo : 
this.commandPayload.getPackageSpecifics()) {
+            if (!packageSpecificInfo.getOs().contains(repo.getOs())
+                    || 
!packageSpecificInfo.getArch().contains(repo.getArch())) {
+                continue;
+            }
+
+            packageInfoList.addAll(packageSpecificInfo.getPackages());
+        }
+
+        return packageInfoList;
+    }
+
+    @Override
     public String serviceName() {
         return this.commandPayload.getServiceName();
     }
+
+    @Override
+    public String stackHome() {
+        String stackName = this.commandPayload.getStackName();
+        String stackVersion = this.commandPayload.getStackVersion();
+        String root = this.commandPayload.getRoot();
+        return MessageFormat.format("{0}/{1}/{2}", root, 
stackName.toLowerCase(), stackVersion);
+    }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/Params.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/Params.java
index fdaf10f..1028329 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/Params.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/param/Params.java
@@ -18,19 +18,26 @@
  */
 package org.apache.bigtop.manager.stack.core.param;
 
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
+import org.apache.bigtop.manager.common.message.entity.pojo.RepoInfo;
+
 import java.util.List;
 
 public interface Params {
 
-    List<String> getPackageList();
-
-    String serviceHome();
-
     String confDir();
 
     String user();
 
     String group();
 
+    RepoInfo repo();
+
+    List<PackageInfo> packages();
+
     String serviceName();
+
+    String serviceHome();
+
+    String stackHome();
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/hook/InstallHook.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/hook/InstallHook.java
index c10279d..1015a10 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/hook/InstallHook.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/hook/InstallHook.java
@@ -75,7 +75,8 @@ public class InstallHook extends AbstractHook {
     private void writeRepo(Params params) {
         RepoInfo repo = LocalSettings.repos().stream()
                 .filter(r -> OSDetection.getOS().equals(r.getOs())
-                        && OSDetection.getArch().equals(r.getArch()))
+                        && OSDetection.getArch().equals(r.getArch())
+                        && !r.getRepoType().equals("tarball"))
                 .findFirst()
                 .orElse(null);
 
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
index 535d987..3342a3b 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
@@ -18,16 +18,64 @@
  */
 package org.apache.bigtop.manager.stack.core.spi.script;
 
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
+import org.apache.bigtop.manager.common.message.entity.pojo.RepoInfo;
 import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
+import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
+import org.apache.bigtop.manager.stack.core.utils.TarballUtils;
 
 import org.apache.commons.lang3.StringUtils;
 
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.List;
+import java.util.Properties;
+
 @Slf4j
 public abstract class AbstractScript implements Script {
 
+    public static final String REPO_TYPE_BINARY = "binary";
+    public static final String REPO_TYPE_TARBALL = "tarball";
+
+    public static final String PROPERTY_KEY_SKIP_LEVELS = "skipLevels";
+
+    @Override
+    public ShellResult install(Params params) {
+        return this.install(params, new Properties());
+    }
+
+    public ShellResult install(Params params, Properties properties) {
+        if (params.repo().getRepoType().equals(REPO_TYPE_BINARY)) {
+            return installBinary(params);
+        } else if (params.repo().getRepoType().equals(REPO_TYPE_TARBALL)) {
+            return installTarball(params, properties);
+        } else {
+            log.error("Unsupported repo type: {}", 
params.repo().getRepoType());
+            return ShellResult.fail();
+        }
+    }
+
+    private ShellResult installBinary(Params params) {
+        List<PackageInfo> packages = params.packages();
+        List<String> packageNames = 
packages.stream().map(PackageInfo::getName).toList();
+        return PackageUtils.install(packageNames);
+    }
+
+    private ShellResult installTarball(Params params, Properties properties) {
+        RepoInfo repo = params.repo();
+        List<PackageInfo> packages = params.packages();
+        String stackHome = params.stackHome();
+        String serviceHome = params.serviceHome();
+
+        for (PackageInfo packageInfo : packages) {
+            Integer skipLevels = 
Integer.parseInt(properties.getProperty(PROPERTY_KEY_SKIP_LEVELS, "0"));
+            TarballUtils.installPackage(repo.getBaseUrl(), stackHome, 
serviceHome, packageInfo, skipLevels);
+        }
+
+        return ShellResult.success();
+    }
+
     public ShellResult restart(Params params) {
         ShellResult shellResult = stop(params);
         if (shellResult.getExitCode() != 0) {
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/ChecksumValidator.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/ChecksumValidator.java
new file mode 100644
index 0000000..81b407f
--- /dev/null
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/ChecksumValidator.java
@@ -0,0 +1,55 @@
+/*
+ * 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
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.stack.core.tarball;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.security.MessageDigest;
+
+@Slf4j
+public class ChecksumValidator {
+
+    public static boolean validateChecksum(String algorithm, String value, 
File file) {
+        try {
+            MessageDigest digest = 
MessageDigest.getInstance(algorithm.toUpperCase());
+            FileInputStream fis = new FileInputStream(file);
+            byte[] byteArray = new byte[1024];
+            int bytesCount;
+
+            while ((bytesCount = fis.read(byteArray)) != -1) {
+                digest.update(byteArray, 0, bytesCount);
+            }
+            fis.close();
+
+            byte[] bytes = digest.digest();
+            StringBuilder sb = new StringBuilder();
+            for (byte b : bytes) {
+                sb.append(String.format("%02x", b));
+            }
+
+            String calculatedChecksum = sb.toString();
+            return calculatedChecksum.equalsIgnoreCase(value);
+        } catch (Exception e) {
+            log.error("Error while validating checksum", e);
+            return false;
+        }
+    }
+}
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballDownloader.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballDownloader.java
new file mode 100644
index 0000000..ace5bae
--- /dev/null
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballDownloader.java
@@ -0,0 +1,86 @@
+/*
+ * 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
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.stack.core.tarball;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+@Slf4j
+public class TarballDownloader {
+
+    @SuppressWarnings("ResultOfMethodCallIgnored")
+    public static Boolean downloadFile(String fileUrl, String saveDir) {
+        HttpURLConnection httpConn = null;
+        try {
+            URL url = new URL(fileUrl);
+            httpConn = (HttpURLConnection) url.openConnection();
+            int responseCode = httpConn.getResponseCode();
+
+            if (responseCode == HttpURLConnection.HTTP_OK) {
+                String fileName = "";
+                String disposition = 
httpConn.getHeaderField("Content-Disposition");
+
+                if (disposition != null) {
+                    int index = disposition.indexOf("filename=");
+                    if (index > 0) {
+                        fileName = disposition.substring(index + 10, 
disposition.length() - 1);
+                    }
+                } else {
+                    fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
+                }
+
+                InputStream inputStream = httpConn.getInputStream();
+                String saveFilePath = saveDir + File.separator + fileName;
+
+                if (!new File(saveDir).exists()) {
+                    new File(saveDir).mkdirs();
+                }
+
+                FileOutputStream outputStream = new 
FileOutputStream(saveFilePath);
+
+                int bytesRead = -1;
+                byte[] buffer = new byte[4096];
+                while ((bytesRead = inputStream.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, bytesRead);
+                }
+
+                outputStream.close();
+                inputStream.close();
+
+                log.info("File downloaded: {}", saveFilePath);
+                return true;
+            } else {
+                log.info("No file to download. Server replied HTTP code: {}", 
responseCode);
+                return false;
+            }
+        } catch (Exception e) {
+            log.error("Error downloading file: {}", e.getMessage());
+            return false;
+        } finally {
+            if (httpConn != null) {
+                httpConn.disconnect();
+            }
+        }
+    }
+}
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballExtractor.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballExtractor.java
new file mode 100644
index 0000000..e087028
--- /dev/null
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballExtractor.java
@@ -0,0 +1,129 @@
+/*
+ * 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
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.stack.core.tarball;
+
+import org.apache.bigtop.manager.stack.core.exception.StackException;
+
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.function.Function;
+
+@Slf4j
+public class TarballExtractor {
+
+    public static void extractTarball(String source, String dest) {
+        extractTarball(source, dest, 0);
+    }
+
+    public static void extractTarball(String source, String dest, Integer 
skipLevels) {
+        File tarball = new File(source);
+        File destDir = new File(dest);
+
+        if (isTarGz(source)) {
+            extractTarGz(tarball, tis -> extract(tis, destDir, skipLevels));
+        } else if (isTar(source)) {
+            extractTar(tarball, tis -> extract(tis, destDir, skipLevels));
+        } else {
+            log.info("Unsupported file type: {}", source);
+        }
+    }
+
+    @SuppressWarnings("ResultOfMethodCallIgnored")
+    private static Boolean extract(TarArchiveInputStream tis, File destDir, 
Integer skipLevels) {
+        try {
+            TarArchiveEntry entry;
+            while ((entry = tis.getNextEntry()) != null) {
+                String entryName = entry.getName();
+                String[] parts = entryName.split("/");
+                if (parts.length <= skipLevels) {
+                    continue; // Skip this entry
+                }
+                StringBuilder newName = new StringBuilder();
+                for (int i = skipLevels; i < parts.length; i++) {
+                    newName.append(parts[i]);
+                    if (i < parts.length - 1) {
+                        newName.append(File.separator);
+                    }
+                }
+                File outputFile = new File(destDir, newName.toString());
+
+                if (entry.isDirectory()) {
+                    if (!outputFile.exists()) {
+                        outputFile.mkdirs();
+                    }
+                } else {
+                    File parent = outputFile.getParentFile();
+                    if (!parent.exists()) {
+                        parent.mkdirs();
+                    }
+
+                    try (FileOutputStream fos = new 
FileOutputStream(outputFile)) {
+                        byte[] buffer = new byte[1024];
+                        int len;
+                        while ((len = tis.read(buffer)) != -1) {
+                            fos.write(buffer, 0, len);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.info("Error extracting tarball", e);
+            throw new StackException(e);
+        }
+
+        return true;
+    }
+
+    private static void extractTar(File tarball, 
Function<TarArchiveInputStream, Boolean> func) {
+        try (InputStream fis = Files.newInputStream(tarball.toPath());
+                TarArchiveInputStream tis = new TarArchiveInputStream(fis)) {
+            func.apply(tis);
+        } catch (Exception e) {
+            log.error("Error extracting tarball", e);
+            throw new StackException(e);
+        }
+    }
+
+    private static void extractTarGz(File tarball, 
Function<TarArchiveInputStream, Boolean> func) {
+        try (InputStream fis = Files.newInputStream(tarball.toPath());
+                GzipCompressorInputStream gis = new 
GzipCompressorInputStream(fis);
+                TarArchiveInputStream tis = new TarArchiveInputStream(gis)) {
+            func.apply(tis);
+        } catch (Exception e) {
+            log.error("Error extracting tarball", e);
+            throw new StackException(e);
+        }
+    }
+
+    private static boolean isTarGz(String filePath) {
+        return filePath.endsWith(".tar.gz");
+    }
+
+    private static boolean isTar(String filePath) {
+        return filePath.endsWith(".tar");
+    }
+}
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/TarballUtils.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/TarballUtils.java
new file mode 100644
index 0000000..cb6bf08
--- /dev/null
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/TarballUtils.java
@@ -0,0 +1,86 @@
+/*
+ * 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
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.stack.core.utils;
+
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
+import org.apache.bigtop.manager.stack.core.exception.StackException;
+import org.apache.bigtop.manager.stack.core.tarball.ChecksumValidator;
+import org.apache.bigtop.manager.stack.core.tarball.TarballDownloader;
+import org.apache.bigtop.manager.stack.core.tarball.TarballExtractor;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+
+@Slf4j
+public class TarballUtils {
+
+    @SuppressWarnings("ResultOfMethodCallIgnored")
+    public static void installPackage(
+            String repoUrl, String stackHome, String serviceHome, PackageInfo 
packageInfo, Integer skipLevels) {
+        String remoteUrl = repoUrl + File.separator + packageInfo.getName();
+        File localFile = new File(stackHome + File.separator + 
packageInfo.getName());
+        String algorithm = packageInfo.getChecksum().split(":")[0];
+        String checksum = packageInfo.getChecksum().split(":")[1];
+
+        if (localFile.exists()) {
+            log.info("File [{}] exists, validating checksum", 
localFile.getAbsolutePath());
+        } else {
+            log.info("Downloading [{}] to [{}]", remoteUrl, stackHome);
+            downloadPackage(remoteUrl, stackHome);
+        }
+
+        boolean validateChecksum = 
ChecksumValidator.validateChecksum(algorithm, checksum, localFile);
+        if (!validateChecksum) {
+            log.warn("Invalid checksum for [{}], re-downloading...", 
localFile.getAbsolutePath());
+            localFile.delete();
+            downloadPackage(remoteUrl, stackHome);
+        }
+
+        validateChecksum = ChecksumValidator.validateChecksum(algorithm, 
checksum, localFile);
+        if (!validateChecksum) {
+            log.error("Invalid checksum for [{}], exiting...", 
localFile.getAbsolutePath());
+            throw new StackException("Invalid checksum for " + 
localFile.getAbsolutePath());
+        }
+
+        log.info("Checksum validate successfully for [{}]", 
localFile.getAbsolutePath());
+        log.info("Extracting [{}] to [{}]", localFile.getAbsolutePath(), 
serviceHome);
+        TarballExtractor.extractTarball(localFile.getAbsolutePath(), 
serviceHome, skipLevels);
+        log.info("File [{}] successfully extracted to [{}]", 
localFile.getAbsolutePath(), serviceHome);
+    }
+
+    private static void downloadPackage(String remoteUrl, String saveDir) {
+        int i = 1;
+        while (true) {
+            Boolean downloaded = TarballDownloader.downloadFile(remoteUrl, 
saveDir);
+            if (downloaded) {
+                break;
+            } else {
+                if (i == 3) {
+                    log.error("Failed to download [{}], exiting...", 
remoteUrl);
+                    throw new StackException("Failed to download " + 
remoteUrl);
+                } else {
+                    log.error("Failed to download [{}], retrying...: {}", 
remoteUrl, i);
+                }
+            }
+
+            i++;
+        }
+    }
+}
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
index fcf70b2..a143afa 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
@@ -224,8 +224,8 @@ public class LinuxFileUtils {
             log.error("dirPath must not be null");
             return;
         }
-        Path path = Paths.get(dirPath);
 
+        Path path = Paths.get(dirPath);
         if (Files.isSymbolicLink(path)) {
             log.error("Directory is symbolic link: [{}]", dirPath);
             return;
@@ -233,7 +233,15 @@ public class LinuxFileUtils {
 
         try {
             log.info("Creating directory: [{}]", path);
-            Files.createDirectories(path);
+            if (Files.exists(path)) {
+                if (Files.isDirectory(path)) {
+                    log.info("Directory already exists: [{}], skip creating", 
path);
+                } else {
+                    throw new IOException("Path exists and is not a directory: 
" + path);
+                }
+            } else {
+                Files.createDirectories(path);
+            }
         } catch (IOException e) {
             log.error("Error when create directory", e);
         }
diff --git a/bigtop-manager-stack/bigtop-manager-stack-core/pom.xml 
b/bigtop-manager-stack/bigtop-manager-stack-infra/pom.xml
similarity index 70%
copy from bigtop-manager-stack/bigtop-manager-stack-core/pom.xml
copy to bigtop-manager-stack/bigtop-manager-stack-infra/pom.xml
index 0423dce..a7e0c80 100644
--- a/bigtop-manager-stack/bigtop-manager-stack-core/pom.xml
+++ b/bigtop-manager-stack/bigtop-manager-stack-infra/pom.xml
@@ -25,29 +25,15 @@
         <version>${revision}</version>
     </parent>
 
-    <artifactId>bigtop-manager-stack-core</artifactId>
+    <artifactId>bigtop-manager-stack-infra</artifactId>
     <name>${project.artifactId}</name>
-    <description>Bigtop Manager Stack Core</description>
+    <description>Bigtop Manager Stack Infra</description>
 
     <dependencies>
         <dependency>
             <groupId>org.apache.bigtop</groupId>
-            <artifactId>bigtop-manager-common</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.auto.service</groupId>
-            <artifactId>auto-service</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
+            <artifactId>bigtop-manager-stack-core</artifactId>
         </dependency>
     </dependencies>
+
 </project>
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/param/InfraParams.java
similarity index 55%
copy from 
bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
copy to 
bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/param/InfraParams.java
index c48c8b1..f78f805 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/param/InfraParams.java
@@ -16,26 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.common.message.entity.pojo;
+package org.apache.bigtop.manager.stack.infra.param;
 
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.core.param.BaseParams;
 
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class RepoInfo {
+import lombok.extern.slf4j.Slf4j;
 
-    private String repoId;
+import java.text.MessageFormat;
 
-    private String repoName;
+@Slf4j
+public abstract class InfraParams extends BaseParams {
 
-    private String baseUrl;
+    protected InfraParams(CommandPayload commandPayload) {
+        super(commandPayload);
+    }
 
-    private String os;
-
-    private String arch;
-
-    private String mirrorList;
+    /**
+     * service home dir
+     */
+    @Override
+    public String serviceHome() {
+        String service = this.commandPayload.getServiceName();
+        return MessageFormat.format("{0}/{1}", stackHome(), 
service.toLowerCase());
+    }
 }
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusParams.java
similarity index 59%
copy from 
bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
copy to 
bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusParams.java
index c48c8b1..7c96773 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/message/entity/pojo/RepoInfo.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusParams.java
@@ -16,26 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.common.message.entity.pojo;
+package org.apache.bigtop.manager.stack.infra.v1_0_0.prometheus;
 
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import org.apache.bigtop.manager.common.message.entity.payload.CommandPayload;
+import org.apache.bigtop.manager.stack.infra.param.InfraParams;
 
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class RepoInfo {
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
 
-    private String repoId;
+import java.text.MessageFormat;
 
-    private String repoName;
+@Getter
+@Slf4j
+public class PrometheusParams extends InfraParams {
 
-    private String baseUrl;
+    public PrometheusParams(CommandPayload commandPayload) {
+        super(commandPayload);
+    }
 
-    private String os;
-
-    private String arch;
-
-    private String mirrorList;
+    public String dataDir() {
+        return MessageFormat.format("{0}/data", serviceHome());
+    }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/HistoryServerScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusServerScript.java
similarity index 59%
copy from 
bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/HistoryServerScript.java
copy to 
bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusServerScript.java
index 58e5b39..581ddb6 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/mapred/HistoryServerScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusServerScript.java
@@ -16,40 +16,45 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.stack.bigtop.v3_3_0.mapred;
+package org.apache.bigtop.manager.stack.infra.v1_0_0.prometheus;
 
 import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.utils.PackageUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 
 import com.google.auto.service.AutoService;
 
 import java.text.MessageFormat;
+import java.util.Properties;
 
 @AutoService(Script.class)
-public class HistoryServerScript extends AbstractServerScript {
+public class PrometheusServerScript extends AbstractServerScript {
 
     @Override
     public ShellResult install(Params params) {
-        return PackageUtils.install(params.getPackageList());
+        Properties properties = new Properties();
+        properties.setProperty(PROPERTY_KEY_SKIP_LEVELS, "1");
+
+        return super.install(params, properties);
     }
 
     @Override
     public ShellResult configure(Params params) {
-        return MapredSetup.config(params);
+        return PrometheusSetup.config(params);
     }
 
     @Override
     public ShellResult start(Params params) {
         configure(params);
-        Mapreduce2Params mapreduce2Params = (Mapreduce2Params) params;
-        String cmd = MessageFormat.format("{0} --daemon start historyserver", 
mapreduce2Params.mapredExec());
+        PrometheusParams prometheusParams = (PrometheusParams) params;
+        String cmd = MessageFormat.format(
+                "nohup {0}/prometheus --config.file={0}/prometheus.yml 
--storage.tsdb.path={0}/data > {0}/nohup.out 2>&1 &",
+                prometheusParams.serviceHome());
         try {
-            return LinuxOSUtils.sudoExecCmd(cmd, mapreduce2Params.user());
+            return LinuxOSUtils.sudoExecCmd(cmd, prometheusParams.user());
         } catch (Exception e) {
             throw new StackException(e);
         }
@@ -57,10 +62,10 @@ public class HistoryServerScript extends 
AbstractServerScript {
 
     @Override
     public ShellResult stop(Params params) {
-        Mapreduce2Params mapreduce2Params = (Mapreduce2Params) params;
-        String cmd = MessageFormat.format("{0} --daemon stop historyserver", 
mapreduce2Params.mapredExec());
+        PrometheusParams prometheusParams = (PrometheusParams) params;
+        String cmd = "pkill -f prometheus";
         try {
-            return LinuxOSUtils.sudoExecCmd(cmd, mapreduce2Params.user());
+            return LinuxOSUtils.sudoExecCmd(cmd, prometheusParams.user());
         } catch (Exception e) {
             throw new StackException(e);
         }
@@ -68,7 +73,16 @@ public class HistoryServerScript extends 
AbstractServerScript {
 
     @Override
     public ShellResult status(Params params) {
-        Mapreduce2Params mapreduce2Params = (Mapreduce2Params) params;
-        return 
LinuxOSUtils.checkProcess(mapreduce2Params.getHistoryServerPidFile());
+        String cmd = "pgrep -f prometheus";
+        try {
+            ShellResult result = LinuxOSUtils.execCmd(cmd);
+            if (result.getExitCode() == 0) {
+                return ShellResult.success();
+            } else {
+                return new ShellResult(-1, "", "Prometheus is not running");
+            }
+        } catch (Exception e) {
+            throw new StackException(e);
+        }
     }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusSetup.java
similarity index 53%
copy from 
bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
copy to 
bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusSetup.java
index 535d987..0a1eb35 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/script/AbstractScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-infra/src/main/java/org/apache/bigtop/manager/stack/infra/v1_0_0/prometheus/PrometheusSetup.java
@@ -16,36 +16,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.stack.core.spi.script;
+package org.apache.bigtop.manager.stack.infra.v1_0_0.prometheus;
 
 import org.apache.bigtop.manager.common.shell.ShellResult;
 import org.apache.bigtop.manager.stack.core.param.Params;
+import org.apache.bigtop.manager.stack.core.utils.linux.LinuxFileUtils;
 
-import org.apache.commons.lang3.StringUtils;
-
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
+import static 
org.apache.bigtop.manager.common.constants.Constants.PERMISSION_755;
+
 @Slf4j
-public abstract class AbstractScript implements Script {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class PrometheusSetup {
 
-    public ShellResult restart(Params params) {
-        ShellResult shellResult = stop(params);
-        if (shellResult.getExitCode() != 0) {
-            return shellResult;
-        }
-        ShellResult shellResult1 = start(params);
-        if (shellResult1.getExitCode() != 0) {
-            return shellResult1;
-        }
+    public static ShellResult config(Params params) {
+        PrometheusParams prometheusParams = (PrometheusParams) params;
+        String user = prometheusParams.user();
+        String group = prometheusParams.group();
 
-        return new ShellResult(
-                0,
-                StringUtils.join(shellResult.getOutput(), 
shellResult1.getOutput()),
-                StringUtils.join(shellResult.getErrMsg(), 
shellResult1.getErrMsg()));
-    }
+        LinuxFileUtils.createDirectories(prometheusParams.serviceHome(), user, 
group, PERMISSION_755, true);
+        LinuxFileUtils.createDirectories(prometheusParams.dataDir(), user, 
group, PERMISSION_755, true);
 
-    @Override
-    public ShellResult check(Params params) {
-        return ShellResult.success();
+        return ShellResult.success("Prometheus Configure success!");
     }
 }
diff --git a/bigtop-manager-stack/pom.xml b/bigtop-manager-stack/pom.xml
index 265065f..9334c1b 100644
--- a/bigtop-manager-stack/pom.xml
+++ b/bigtop-manager-stack/pom.xml
@@ -35,6 +35,7 @@
     <modules>
         <module>bigtop-manager-stack-core</module>
         <module>bigtop-manager-stack-bigtop</module>
+        <module>bigtop-manager-stack-infra</module>
     </modules>
 
     <properties>
diff --git a/bigtop-manager-ui/src/api/repo/types.ts 
b/bigtop-manager-ui/src/api/repo/types.ts
index 46e1ce6..ade4275 100644
--- a/bigtop-manager-ui/src/api/repo/types.ts
+++ b/bigtop-manager-ui/src/api/repo/types.ts
@@ -20,6 +20,7 @@
 export interface RepoVO {
   repoId: string
   repoName: string
+  repoType: string
   baseUrl: string
   os: string
   arch: string
diff --git a/pom.xml b/pom.xml
index dfb4d99..66f14b0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -106,6 +106,12 @@
                 <version>${project.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.apache.bigtop</groupId>
+                <artifactId>bigtop-manager-stack-infra</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
             <dependency>
                 <groupId>org.apache.bigtop</groupId>
                 <artifactId>bigtop-manager-ui</artifactId>


Reply via email to