• 一、确定您的安装环境
  • 二、精简版Linkis环境准备
    • a. 基础软件安装
    • b. 创建用户
    • c. 安装包准备
  • 三、简单版Linkis环境准备
    • a. 基础软件安装
    • b. 创建用户
    • c. SSH免密配置(分布式模式必须)
    • d. 安装包准备
  • 四、标准版Linkis环境准备
    • a. 基础软件安装
    • b. 创建用户
    • c. SSH免密配置(分布式模式必须)
    • d. 安装包准备
  • 五、安装和使用
    • 1. 执行安装脚本:
    • 2. 安装步骤
    • 3. 是否安装成功:
    • 4. 快速启动Linkis
      • (1)、启动服务:
      • (2)、查看是否启动成功
    • 5. 快速使用Linkis
      • (1)、概述
      • (2)、 快速运行
      • (3)、 快速实现
        • 5.3.1 maven依赖
      • 5.3.2 参考实现

    一、确定您的安装环境

            Linkis根据安装的难易程度,提供了以下三种安装环境的准备方式,其区别如下:


    1. 精简版

            最少环境依赖,单节点安装模式,只包含Python引擎,只需要用户Linux环境支持Python即可。

            请注意:精简版只允许用户提交Python脚本。

            点我进入精简版Linkis环境准备


    1. 简单版

            依赖Python、Hadoop和Hive,分布式安装模式,包含Python引擎和Hive引擎,需要用户的Linux环境先安装好了Hadoop和Hive。

            简单版允许用户提交HiveQL和Python脚本。

            点我进入简单版Linkis环境准备


    1. 标准版

            依赖Python、Hadoop、Hive和Spark,分布式安装模式,包含Python引擎、Hive引擎和Spark引擎,需要用户的Linux环境先安装好了Hadoop、Hive和Spark。

            标准版允许用户提交Spark脚本(包含SparkSQL、Pyspark和Scala)、HiveQL和Python脚本。 请注意:安装标准版需要机器内存在10G以上 如果机器内存不够,需要修改每个服务的启动脚本的默认内存,如:linkis-ujes-spark-engineManager/bin/start-spark-enginemanager.sh修改DWS_ENGINE_MANAGER_HEAP_SIZE的默认大小

            点我进入标准版Linkis环境准备


    二、精简版Linkis环境准备

    a. 基础软件安装

            下面的软件必装:

    • MySQL (5.5+),如何安装MySQL
    • JDK (1.8.0_141以上),如何安装JDK
    • Python(2.x和3.x都支持),如何安装Python

    b. 创建用户

            例如: 部署用户是hadoop账号

    1. 在部署机器上创建部署用户,用于安装
    1. sudo useradd hadoop
    1. 因为Linkis的服务是以 sudo -u ${linux-user} 方式来切换引擎,从而执行作业,所以部署用户需要有 sudo 权限,而且是免密的。
    1. vi /etc/sudoers
    1. hadoop ALL=(ALL) NOPASSWD: NOPASSWD: ALL
    1. 如果您的Python想拥有画图功能,则还需在安装节点,安装画图模块。命令如下:
    1. python -m pip install matplotlib

    c. 安装包准备

            从Linkis已发布的release中(点击这里进入下载页面),下载最新安装包。

            先解压安装包到安装目录,并对解压后的文件进行配置修改。

    1. tar -xvf wedatasphere-linkis-x.x.x-dist.tar.gz

    (1)修改基础配置

    1. vi conf/config.sh
    1. deployUser=hadoop #指定部署用户
    2. LINKIS_INSTALL_HOME=/appcom/Install/Linkis # 指定安装目录
    3. WORKSPACE_USER_ROOT_PATH=file:///tmp/hadoop # 指定用户根目录,一般用于存储用户的脚本文件和日志文件等,是用户的工作空间。
    4. RESULT_SET_ROOT_PATH=file:///tmp/linkis # 结果集文件路径,用于存储Job的结果集文件

    (2)修改数据库配置

    1. vi conf/db.sh
    1. # 设置数据库的连接信息
    2. # 包括IP地址、数据库名称、用户名、端口
    3. # 主要用于存储用户的自定义变量、配置参数、UDF和小函数,以及提供JobHistory的底层存储
    4. MYSQL_HOST=
    5. MYSQL_PORT=
    6. MYSQL_DB=
    7. MYSQL_USER=
    8. MYSQL_PASSWORD=

            环境准备完毕,点我进入 五、安装和使用

    三、简单版Linkis环境准备

    a. 基础软件安装

            下面的软件必装:

    • MySQL (5.5+),如何安装MySQL
    • JDK (1.8.0_141以上),如何安装JDK
    • Python(2.x和3.x都支持),如何安装Python
    • Hadoop(社区版和CDH3.0以下版本都支持)
    • Hive(1.2.1,2.0和2.0以上版本,可能存在兼容性问题)

    b. 创建用户

            例如: 部署用户是hadoop账号

    1. 在所有需要部署的机器上创建部署用户,用于安装
    1. sudo useradd hadoop
    1. 因为Linkis的服务是以 sudo -u ${linux-user} 方式来切换引擎,从而执行作业,所以部署用户需要有 sudo 权限,而且是免密的。
    1. vi /etc/sudoers
    1. hadoop ALL=(ALL) NOPASSWD: NOPASSWD: ALL
    1. 在每台安装节点设置如下的全局环境变量,以便Linkis能正常使用Hadoop和Hive

            修改安装用户的.bash_rc,命令如下:

    1. vim /home/hadoop/.bash_rc
    1. 下方为环境变量示例:
    1. #JDK
    2. export JAVA_HOME=/nemo/jdk1.8.0_141
    3. #HADOOP
    4. export HADOOP_HOME=/appcom/Install/hadoop
    5. export HADOOP_CONF_DIR=/appcom/config/hadoop-config
    6. #Hive
    7. export HIVE_HOME=/appcom/Install/hive
    8. export HIVE_CONF_DIR=/appcom/config/hive-config

    c. SSH免密配置(分布式模式必须)

            如果您的Linkis都部署在同一台服务器上, 本步骤可以跳过。

            如果您的Linkis部署在多台服务器上,那么您还需要为这些服务器配置ssh免密登陆。

            如何配置SSH免密登陆

    d. 安装包准备

            从Linkis已发布的release中(点击这里进入下载页面),下载最新安装包。

            先解压安装包到安装目录,并对解压后的文件进行配置修改。

    1. tar -xvf wedatasphere-linkis-x.x.x-dist.tar.gz

    (1)修改基础配置

    1. vi /conf/config.sh
    1. deployUser=hadoop #指定部署用户
    2. LINKIS_INSTALL_HOME=/appcom/Install/Linkis # 指定安装目录
    3. WORKSPACE_USER_ROOT_PATH=file:///tmp/hadoop # 指定用户根目录,一般用于存储用户的脚本文件和日志文件等,是用户的工作空间。
    4. HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis # 指定用户的HDFS根目录,一般用于存储Job的结果集文件
    5. # 如果您想配合Scriptis一起使用,CDH版的Hive,还需要配置如下参数(社区版Hive可忽略该配置)
    6. HIVE_META_URL=jdbc://... # HiveMeta元数据库的URL
    7. HIVE_META_USER= # HiveMeta元数据库的用户
    8. HIVE_META_PASSWORD= # HiveMeta元数据库的密码

    (2)修改数据库配置

    1. vi conf/db.sh
    1. # 设置数据库的连接信息
    2. # 包括IP地址、数据库名称、用户名、端口
    3. # 主要用于存储用户的自定义变量、配置参数、UDF和小函数,以及提供JobHistory的底层存储
    4. MYSQL_HOST=
    5. MYSQL_PORT=
    6. MYSQL_DB=
    7. MYSQL_USER=
    8. MYSQL_PASSWORD=

           环境准备完毕,点我进入 五、安装和使用

    四、标准版Linkis环境准备

    a. 基础软件安装

            下面的软件必装:

    • MySQL (5.5+),如何安装MySQL
    • JDK (1.8.0_141以上),如何安装JDK
    • Python(2.x和3.x都支持),如何安装Python
    • Hadoop(社区版和CDH3.0以下版本都支持)
    • Hive(1.2.1,2.0和2.0以上版本,可能存在兼容性问题)
    • Spark(Linkis release0.7.0开始,支持Spark2.0以上所有版本)

    b. 创建用户

            例如: 部署用户是hadoop账号

    1. 在所有需要部署的机器上创建部署用户,用于安装
    1. sudo useradd hadoop
    1. 因为Linkis的服务是以 sudo -u ${linux-user} 方式来切换引擎,从而执行作业,所以部署用户需要有 sudo 权限,而且是免密的。
    1. vi /etc/sudoers
    1. hadoop ALL=(ALL) NOPASSWD: NOPASSWD: ALL
    1. 在每台安装节点设置如下的全局环境变量,以便Linkis能正常使用Hadoop、Hive和Spark

      修改安装用户的.bash_rc,命令如下:

    1. vim /home/hadoop/.bash_rc
    1. 下方为环境变量示例:
    1. #JDK
    2. export JAVA_HOME=/nemo/jdk1.8.0_141
    3. #HADOOP
    4. export HADOOP_HOME=/appcom/Install/hadoop
    5. export HADOOP_CONF_DIR=/appcom/config/hadoop-config
    6. #Hive
    7. export HIVE_HOME=/appcom/Install/hive
    8. export HIVE_CONF_DIR=/appcom/config/hive-config
    9. #Spark
    10. export SPARK_HOME=/appcom/Install/spark
    11. export SPARK_CONF_DIR=/appcom/config/spark-config/spark-submit
    12. export PYSPARK_ALLOW_INSECURE_GATEWAY=1 # Pyspark必须加的参数
    1. 如果您的Pyspark想拥有画图功能,则还需在所有安装节点,安装画图模块。命令如下:
    1. python -m pip install matplotlib

    c. SSH免密配置(分布式模式必须)

            如果您的Linkis都部署在同一台服务器上, 本步骤可以跳过。

            如果您的Linkis部署在多台服务器上,那么您还需要为这些服务器配置ssh免密登陆。

            如何配置SSH免密登陆

    d. 安装包准备

            从Linkis已发布的release中(点击这里进入下载页面),下载最新安装包。

            先解压安装包到安装目录,并对解压后的文件进行配置修改。

    1. tar -xvf wedatasphere-linkis-x.x.0-dist.tar.gz

    (1)修改基础配置

    1. vi conf/config.sh
    1. deployUser=hadoop #指定部署用户
    2. LINKIS_INSTALL_HOME=/appcom/Install/Linkis # 指定安装目录
    3. WORKSPACE_USER_ROOT_PATH=file:///tmp/hadoop # 指定用户根目录,一般用于存储用户的脚本文件和日志文件等,是用户的工作空间。
    4. HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis # 指定用户的HDFS根目录,一般用于存储Job的结果集文件
    5. # 如果您想配合Scriptis一起使用,CDH版的Hive,还需要配置如下参数(社区版Hive可忽略该配置)
    6. HIVE_META_URL=jdbc://... # HiveMeta元数据库的URL
    7. HIVE_META_USER= # HiveMeta元数据库的用户
    8. HIVE_META_PASSWORD= # HiveMeta元数据库的密码

    (2)修改数据库配置

    1. vi conf/db.sh
    1. # 设置数据库的连接信息
    2. # 包括IP地址、数据库名称、用户名、端口
    3. # 主要用于存储用户的自定义变量、配置参数、UDF和小函数,以及提供JobHistory的底层存储
    4. MYSQL_HOST=
    5. MYSQL_PORT=
    6. MYSQL_DB=
    7. MYSQL_USER=
    8. MYSQL_PASSWORD=

    五、安装和使用

    1. 执行安装脚本:

    1. sh bin/install.sh

    2. 安装步骤

    • install.sh脚本会询问您安装模式。

         安装模式就是精简模式、简单模式或标准模式,请根据您准备的环境情况,选择合适的安装模式。

    • install.sh脚本会询问您是否需要初始化数据库并导入元数据。

         因为担心用户重复执行install.sh脚本,把数据库中的用户数据清空,所以在install.sh执行时,会询问用户是否需要初始化数据库并导入元数据。

         第一次安装必须选是。

    3. 是否安装成功:

            通过查看控制台打印的日志信息查看是否安装成功。

            如果有错误信息,可以查看具体报错原因。

            您也可以通过查看我们的常见问题,获取问题的解答。

    4. 快速启动Linkis

    (1)、启动服务:

    在安装目录执行以下命令,启动所有服务:

    1. ./bin/start-all.sh > start.log 2>start_error.log

    (2)、查看是否启动成功

    可以在Eureka界面查看服务启动成功情况,查看方法:

    使用http://${EUREKA_INSTALL_IP}:${EUREKA_PORT}, 在浏览器中打开,查看服务是否注册成功。

    如果您没有在config.sh指定EUREKA_INSTALL_IP和EUREKA_INSTALL_IP,则HTTP地址为:http://127.0.0.1:20303

    如下图,如您的Eureka主页出现以下微服务,则表示服务都启动成功,可以正常对外提供服务了:

    Eureka

    5. 快速使用Linkis

    (1)、概述

            Linkis为用户提供了Java客户端的实现,用户可以使用UJESClient对Linkis后台服务实现快速访问。

    (2)、 快速运行

            我们在ujes/client/src/test模块下,提供了UJESClient的两个测试类:

    1. com.webank.wedatasphere.linkis.ujes.client.UJESClientImplTestJ # 基于Java实现的测试类
    2. com.webank.wedatasphere.linkis.ujes.client.UJESClientImplTest # 基于Scala实现的测试类

            如果您clone了Linkis的源代码,可以直接运行这两个测试类。

    (3)、 快速实现

            下面具体介绍如何快速实现一次对Linkis的代码提交执行。

    5.3.1 maven依赖
    1. <dependency>
    2. <groupId>com.webank.wedatasphere.Linkis</groupId>
    3. <artifactId>Linkis-ujes-client</artifactId>
    4. <version>0.6.0</version>
    5. </dependency>

    5.3.2 参考实现

    • JAVA
    1. package com.webank.bdp.dataworkcloud.ujes.client;
    2. import com.webank.wedatasphere.Linkis.common.utils.Utils;
    3. import com.webank.wedatasphere.Linkis.httpclient.dws.authentication.StaticAuthenticationStrategy;
    4. import com.webank.wedatasphere.Linkis.httpclient.dws.config.DWSClientConfig;
    5. import com.webank.wedatasphere.Linkis.httpclient.dws.config.DWSClientConfigBuilder;
    6. import com.webank.wedatasphere.Linkis.ujes.client.UJESClient;
    7. import com.webank.wedatasphere.Linkis.ujes.client.UJESClientImpl;
    8. import com.webank.wedatasphere.Linkis.ujes.client.request.JobExecuteAction;
    9. import com.webank.wedatasphere.Linkis.ujes.client.request.ResultSetAction;
    10. import com.webank.wedatasphere.Linkis.ujes.client.response.JobExecuteResult;
    11. import com.webank.wedatasphere.Linkis.ujes.client.response.JobInfoResult;
    12. import com.webank.wedatasphere.Linkis.ujes.client.response.JobProgressResult;
    13. import com.webank.wedatasphere.Linkis.ujes.client.response.JobStatusResult;
    14. import org.apache.commons.io.IOUtils;
    15. import java.util.concurrent.TimeUnit;
    16. public class UJESClientImplTestJ{
    17. public static void main(String[] args){
    18. // 1. 配置DWSClientBuilder,通过DWSClientBuilder获取一个DWSClientConfig
    19. DWSClientConfig clientConfig = ((DWSClientConfigBuilder) (DWSClientConfigBuilder.newBuilder()
    20. .addUJESServerUrl("http://${ip}:${port}") //指定ServerUrl,Linkis服务器端网关的地址,如http://{ip}:{port}
    21. .connectionTimeout(30000) //connectionTimeOut 客户端连接超时时间
    22. .discoveryEnabled(true).discoveryFrequency(1, TimeUnit.MINUTES) //是否启用注册发现,如果启用,会自动发现新启动的Gateway
    23. .loadbalancerEnabled(true) // 是否启用负载均衡,如果不启用注册发现,则负载均衡没有意义
    24. .maxConnectionSize(5) //指定最大连接数,即最大并发数
    25. .retryEnabled(false).readTimeout(30000) //执行失败,是否允许重试
    26. .setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy Linkis认证方式
    27. .setAuthTokenKey("johnnwang").setAuthTokenValue("Abcd1234"))) //认证key,一般为用户名; 认证value,一般为用户名对应的密码
    28. .setDWSVersion("v1").build(); //Linkis后台协议的版本,当前版本为v1
    29. // 2. 通过DWSClientConfig获取一个UJESClient
    30. UJESClient client = new UJESClientImpl(clientConfig);
    31. // 3. 开始执行代码
    32. JobExecuteResult jobExecuteResult = client.execute(JobExecuteAction.builder()
    33. .setCreator("LinkisClient-Test") //creator,请求Linkis的客户端的系统名,用于做系统级隔离
    34. .addExecuteCode("show tables") //ExecutionCode 请求执行的代码
    35. .setEngineType(JobExecuteAction.EngineType$.MODULE$.HIVE()) // 希望请求的Linkis的执行引擎类型,如Spark hive等
    36. .setUser("johnnwang") //User,请求用户;用于做用户级多租户隔离
    37. .build());
    38. System.out.println("execId: " + jobExecuteResult.getExecID() + ", taskId: " + jobExecuteResult.taskID());
    39. // 4. 获取脚本的执行状态
    40. JobStatusResult status = client.status(jobExecuteResult);
    41. while(!status.isCompleted()) {
    42. // 5. 获取脚本的执行进度
    43. JobProgressResult progress = client.progress(jobExecuteResult);
    44. Utils.sleepQuietly(500);
    45. status = client.status(jobExecuteResult);
    46. }
    47. // 6. 获取脚本的Job信息
    48. JobInfoResult jobInfo = client.getJobInfo(jobExecuteResult);
    49. // 7. 获取结果集列表(如果用户一次提交多个SQL,会产生多个结果集)
    50. String resultSet = jobInfo.getResultSetList(client)[0];
    51. // 8. 通过一个结果集信息,获取具体的结果集
    52. Object fileContents = client.resultSet(ResultSetAction.builder().setPath(resultSet).setUser(jobExecuteResult.getUser()).build()).getFileContent();
    53. System.out.println("fileContents: " + fileContents);
    54. IOUtils.closeQuietly(client);
    55. }
    56. }
    • SCALA
    1. import java.util.concurrent.TimeUnit
    2. import com.webank.wedatasphere.Linkis.common.utils.Utils
    3. import com.webank.wedatasphere.Linkis.httpclient.dws.authentication.StaticAuthenticationStrategy
    4. import com.webank.wedatasphere.Linkis.httpclient.dws.config.DWSClientConfigBuilder
    5. import com.webank.wedatasphere.Linkis.ujes.client.request.JobExecuteAction.EngineType
    6. import com.webank.wedatasphere.Linkis.ujes.client.request.{JobExecuteAction, ResultSetAction}
    7. import org.apache.commons.io.IOUtils
    8. object UJESClientImplTest extends App {
    9. // 1. 配置DWSClientBuilder,通过DWSClientBuilder获取一个DWSClientConfig
    10. val clientConfig = DWSClientConfigBuilder.newBuilder()
    11. .addUJESServerUrl("http://${ip}:${port}") //指定ServerUrl,Linkis服务器端网关的地址,如http://{ip}:{port}
    12. .connectionTimeout(30000) //connectionTimeOut 客户端连接超时时间
    13. .discoveryEnabled(true).discoveryFrequency(1, TimeUnit.MINUTES) //是否启用注册发现,如果启用,会自动发现新启动的Gateway
    14. .loadbalancerEnabled(true) // 是否启用负载均衡,如果不启用注册发现,则负载均衡没有意义
    15. .maxConnectionSize(5) //指定最大连接数,即最大并发数
    16. .retryEnabled(false).readTimeout(30000) //执行失败,是否允许重试
    17. .setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy Linkis认证方式
    18. .setAuthTokenKey("${username}").setAuthTokenValue("${password}") //认证key,一般为用户名; 认证value,一般为用户名对应的密码
    19. .setDWSVersion("v1").build() //Linkis后台协议的版本,当前版本为v1
    20. // 2. 通过DWSClientConfig获取一个UJESClient
    21. val client = UJESClient(clientConfig)
    22. // 3. 开始执行代码
    23. val jobExecuteResult = client.execute(JobExecuteAction.builder()
    24. .setCreator("LinkisClient-Test") //creator,请求Linkis的客户端的系统名,用于做系统级隔离
    25. .addExecuteCode("show tables") //ExecutionCode 请求执行的代码
    26. .setEngineType(EngineType.SPARK) // 希望请求的Linkis的执行引擎类型,如Spark hive等
    27. .setUser("${username}").build()) //User,请求用户;用于做用户级多租户隔离
    28. println("execId: " + jobExecuteResult.getExecID + ", taskId: " + jobExecuteResult.taskID)
    29. // 4. 获取脚本的执行状态
    30. var status = client.status(jobExecuteResult)
    31. while(!status.isCompleted) {
    32. // 5. 获取脚本的执行进度
    33. val progress = client.progress(jobExecuteResult)
    34. val progressInfo = if(progress.getProgressInfo != null) progress.getProgressInfo.toList else List.empty
    35. println("progress: " + progress.getProgress + ", progressInfo: " + progressInfo)
    36. Utils.sleepQuietly(500)
    37. status = client.status(jobExecuteResult)
    38. }
    39. // 6. 获取脚本的Job信息
    40. val jobInfo = client.getJobInfo(jobExecuteResult)
    41. // 7. 获取结果集列表(如果用户一次提交多个SQL,会产生多个结果集)
    42. val resultSet = jobInfo.getResultSetList(client).head
    43. // 8. 通过一个结果集信息,获取具体的结果集
    44. val fileContents = client.resultSet(ResultSetAction.builder().setPath(resultSet).setUser(jobExecuteResult.getUser).build()).getFileContent
    45. println("fileContents: " + fileContents)
    46. IOUtils.closeQuietly(client)
    47. }