开发一个Shell脚本
本章节介绍如何在数据开发模块上开发一个Shell脚本示例。
环境准备
- 已开通弹性云服务器,并创建ECS,ECS主机名为“ecs-dgc”。
本示例主机选择“CentOS 8.0 64bit with ARM(40GB)”的公共镜像,并且使用ECS自带的Shell环境,您可登录主机后使用shell命令确认服务器的Shell环境。

- 已开通数据集成增量包,CDM集群名为“cdm-dlfpython”,提供数据开发模块与ECS主机通信的代理。
- 请确保ECS主机与CDM集群网络互通,互通需满足如下条件:
约束限制
- Shell节点支持脚本参数和作业参数。
- Shell注释不能以"#{"开头,与数据开发内置的EL表达式用法冲突。
建立主机数据连接
开发Python脚本前,我们需要建立一个到弹性云服务器ECS的连接。
- 登录DataArts Studio管理控制台。
详情请参考访问DataArts Studio实例控制台。
- 在DataArts Studio控制台首页,选择对应工作空间的“管理中心”模块,进入管理中心页面。
- 在管理中心页面,单击“数据连接”,进入数据连接页面并单击“创建数据连接”。
- 参见表1配置相关参数,创建主机连接名称为“ecs”的数据连接,如图1所示。
表1 主机连接 参数
是否必选
说明
数据连接类型
是
主机连接固定选择为主机连接。
数据连接名称
是
数据连接的名称,只能包含字母、数字、下划线和中划线,且长度不超过100个字符。
描述
否
为更好地识别数据连接,此处加以描述信息,长度不能超过100个字符。
标签
否
标识数据连接的属性。设置标签后,便于统一管理。说明:标签的名称,只能包含中文、英文字母、数字和下划线,不能以下划线开头,且长度不能超过100个字符。
适用组件
是
选择此连接适用的组件。勾选组件后,才能在相应组件内使用本连接。
基础与网络连通配置
主机地址
是
Linux操作系统主机的IP地址。
请参考查看云服务器详细信息获取。
绑定Agent
是
选择CDM集群,CDM集群提供Agent。如果没有可用的CDM集群,请参考创建CDM集群进行创建。
说明:-
CDM集群作为管理中心数据连接Agent时,单集群的并发活动线程最大为200。即当多个数据连接共用同一Agent时,通过这些数据连接提交SQL脚本、Shell脚本、Python脚本等任务的同时运行上限为200,超出的任务将排队等待。建议您按照业务量情况规划多个Agent分担压力。
- 在调度Shell、Python脚本时,Agent会访问ECS主机,如果Shell、Python脚本的调度频率很高,ECS主机会将Agent的内网IP加入黑名单。为了保障作业的正常调度,强烈建议您使用ECS主机的root用户将绑定Agent(即CDM集群)的内网IP加到/etc/hosts.allow文件里面。
CDM集群的内网IP获取方式请参见查看集群信息并修改配置。
端口
是
主机的SSH端口号。
Linux操作系统主机的默认登录端口为22,如有修改可通过主机路径“/etc/ssh/sshd_config”文件中的port字段确认端口号。
KMS加密密钥
是
通过KMS加解密数据源认证信息,选择KMS中的任一默认密钥或自定义密钥即可。说明:- 第一次通过DataArts Studio或KPS使用KMS加密时,会自动生成默认密钥dlf/default或kps/default。关于默认密钥的更多信息,请参见什么是默认密钥章节。
- 仅支持通过对称密钥加密,暂不支持非对称密钥。
数据源认证及其他功能配置
用户名
是
主机的登录用户名。
登录方式
是
选择主机的登录方式:
- 密钥对
- 密码
密钥对
是
“登录方式”为“密钥对”时,显示该配置项。
主机的登录方式为密钥对时,您需要获取并上传其私钥文件至OBS,在此处选择对应的OBS路径(OBS路径中不能存在中文字符)。
说明:此处上传的私钥文件应和主机上配置的公钥是一个密钥对,详情请参见密钥对使用场景介绍。
密钥对密码
否
如果密钥对未设置密码,则不需要填写该配置项。
密码
是
“登录方式”为“密码”时,显示该配置项。
主机的登录方式为密码时,填写主机的登录密码。
-
- 单击“测试”,测试数据连接的连通性。如果无法连通,数据连接将无法创建。
- 测试通过后,单击“确定”,创建数据连接。
开发Shell脚本
- 在“数据开发 > 脚本开发”模块中创建一个Shell脚本,脚本名称为“shell_test”。
- 选择已创建好的主机连接ecs。
- 编写Shell脚本并保存脚本。编写以下内容。下面是个示例。
#!/bin/bash # 获取传递的参数 OUTPUT_PATH=$1 LOCAL_OUTPUT_FILE=$2 # 检查参数是否传递 if [ -z "$OUTPUT_PATH" ] || [ -z "$LOCAL_OUTPUT_FILE" ]; then echo "Usage: $0 <output_path> <local_output_file>" exit 1 fi # 从HDFS中读取文件(假设Hadoop环境已配置) hadoop fs -getmerge $OUTPUT_PATH $LOCAL_OUTPUT_FILE # 检查文件是否成功下载 if [ $? -eq 0 ]; then echo "文件已成功下载到 $LOCAL_OUTPUT_FILE" else echo "文件下载失败" fi # 交互式输入 read -p "请输入一个确认信息: " confirmation echo "您输入的确认信息是: $confirmation" - 使脚本可执行。 更改脚本权限。
- 打开终端,导航到脚本所在的目录。
- 使用chmod命令使脚本可执行。
chmod +x shell_test.sh
- 运行脚本。
运行脚本并传递参数。
在终端中运行脚本,并传递两个参数。例如:./shell_test.sh /user/your_username/hive_output /path/to/local/output/file
- 脚本运行结果。
假设HDFS路径/user/your_username/hive_output中有文件,并且本地路径/path/to/local/output/file可写,脚本的运行结果可能如下:
文件已成功下载到/path/to/local/output/file 请输入一个确认信息: 确认 您输入的确认信息是: 确认
详细步骤总结如下:
- 创建脚本文件:
- 使用文本编辑器创建shell_test.sh文件。
- 编写脚本内容,包括参数传递和交互式输入。
- 使脚本可执行:
- 使用chmod命令使脚本可执行。
- 运行脚本:
- 在终端中运行脚本,并传递两个参数。
- 观察脚本的运行结果,确保文件成功下载并记录用户输入的确认信息。
脚本详细解释如下:
- 参数传递:
- OUTPUT_PATH=$1:获取第一个参数,表示HDFS输出路径。
- LOCAL_OUTPUT_FILE=$2:获取第二个参数,表示本地输出文件路径。
- 参数检查:
- if [ -z "$OUTPUT_PATH" ] || [ -z "$LOCAL_OUTPUT_FILE" ]; then:检查参数是否为空,如果为空则输出使用说明并退出脚本。
- 从HDFS中读取文件:
- hadoop fs -getmerge $OUTPUT_PATH $LOCAL_OUTPUT_FILE:使用Hadoop命令从HDFS中读取文件并合并到本地文件。
- 检查文件是否成功下载:
- if [ $? -eq 0 ]; then:检查上一条命令的退出状态,如果为0表示成功,否则表示失败。
- 交互式输入:
- read -p "请输入一个确认信息: " confirmation:提示用户输入确认信息。
- echo "您输入的确认信息是: $confirmation":输出用户输入的确认信息。
通过以上步骤,你可以在本地环境中编写并运行一个包含参数和交互式输入的Shell脚本,并查看其运行结果。
