提交Sqoop任务
操作场景
该任务指导用户使用Oozie客户端提交Sqoop任务。
- Oozie使用Sqoop导入数据时不支持使用Sqoop的--create-hcatalog-table和--drop-and-create-hcatalog-table等Hcatalog的自动创建表和删除表的参数,需要提前在Oozie中创建好需要的表;如需使用自动创建表功能,请使用--hive-import方式导入数据。
- 如果集群已启用Kerberos认证(安全模式),则不支持在Oozie客户端提交Sqoop任务将数据直接导入到HBase中;如需使用,请直接使用Sqoop命令行进行数据导入或在未开启Kerberos认证的集群中进行操作。
前提条件
- Sqoop和Oozie组件及客户端已安装,并且正常运行。
- 获取Oozie服务的URL和Yarn ResourceManager的主节点IP地址和端口号:
- Oozie服务的URL为“https://oozie实例的主机IP:端口号/oozie”,用于指定运行Sqoop任务的Oozie服务器,例如:https://10.1.130.11:21003/oozie。
可登录FusionInsight Manager,选择“集群 > 服务 > Oozie > 实例”,即可获取任一oozie实例的IP地址;单击“配置”,在搜索框中搜索“OOZIE_HTTPS_PORT”,即可查看使用的端口号。
- Yarn ResourceManager的主节点IP和端口用于修改“job.properties”文件的“resourceManager”参数,格式为“主ResourceManagerIP地址:端口号”,例如:10.1.130.11:8032。
可登录FusionInsight Manager,选择“集群 > 服务 > Yarn > 实例”,即可获取主ResourceManager实例的IP地址;单击“配置”,在搜索框中搜索“yarn.resourcemanager.port”,即可查看使用的端口号。
- Oozie服务的URL为“https://oozie实例的主机IP:端口号/oozie”,用于指定运行Sqoop任务的Oozie服务器,例如:https://10.1.130.11:21003/oozie。
- 上传关系型数据库对应版本的JDBC驱动Jar包(例如MySQL驱动包“mysql-connector-java-5.1.47.jar”)到HDFS的“/user/oozie/share/lib/sqoopclient/”目录中,并修改权限、用户组与该目录中其他Jar包保持一致,再执行以下两种操作的任意一种刷新Jar包依赖即可:
- 已获取关系型数据库对应版本的JDBC驱动Jar包,例如MySQL驱动包“mysql-connector-java-5.1.47.jar”。
- 已准备好相应的Sqoop命令,具体操作请参见相关章节。
操作步骤
- 创建用于访问Oozie服务的人机用户(若已存在具有相关权限的用户则跳过该操作)。
- 登录FusionInsight Manager,选择“系统 > 权限”。
- 选择“角色 > 添加角色”,配置以下参数并单击“确定”,创建具有Oozie管理员权限的角色。
- 角色名称:输入角色名称,例如:oozieadmin。
- 配置资源权限:在“配置资源权限”列表选择“待操作的集群名称 > Oozie”,勾选“管理员权限”。
- 选择“用户 > 添加用户”,配置以下参数并单击“确定”,创建一个人机用户:
- 用户名:输入用户名称,例如:oozieuser。
- 用户类型:选择“人机”用户。
- “密码”和“确认新密码”输入该用户的密码。
- 用户组:加入“hadoop”、“supergroup”和“hive”用户组。
- 角色:单击“添加”,绑定“manager_viewer”和1.b新增的具有Oozie管理员权限的角色(例如:oozieadmin)。
- 使用新建的人机用户重新登录FusionInsight Manager,并修改该用户的初始密码。
- 以客户端安装用户,登录安装了户端的节点。
- 执行以下命令,配置环境变量。其中“/opt/client”为客户端安装路径,该操作的客户端目录只是举例,请根据实际安装目录修改。
source /opt/client/bigdata_env
- 判断集群认证模式。
- 集群已开启Kerberos认证,执行kinit命令进行用户认证。
例如,使用oozieuser用户进行认证:
kinit oozieuser
- 集群未开启Kerberos认证,执行5。
- 集群已开启Kerberos认证,执行kinit命令进行用户认证。
- 执行以下命令,进入Sqoop样例目录:
cd /opt/client/Oozie/oozie-client-*/examples/apps/sqoopclient/
- Sqoop包含sqoopclient和sqoopclient-freeform两种方式编写Workflow,区别只是“workflow.xml”里填入Sqoop命令参数的形式不同。
- 本章节使用sqoopclient作为举例,sqoopclient-freeform的操作步骤一致。
- 如果Sqoop命令中的实参中有空格,请使用“/opt/client/Oozie/oozie-client-*/examples/apps/sqoopclient-freeform”样例,详细说明请参见该路径下的“workflow.xml”。
例如,Sqoop命令中包含参数:--query 'select TT.I, TT.S from TT where $CONDITIONS' ,该命令的select语句中包含空格。
- 执行以下命令修改“job.properties”文件:
vim job.properties
修改如下内容:
- 修改“resourceManager”的参数值为Yarn主ResourceManager节点的IP地址和端口,例如“resourceManager=10.1.130.11:8032”。
- 修改“userName”的参数值为提交任务的人机用户名,即为1创建的用户名,例如“userName=oozieuser”。该参数将用于拼接Oozie Job使用的HDFS用户路径。
- 修改“user.name”,参数值为提交任务的人机用户名,即为1创建的用户名,例如“user.name=oozieuser”。该参数用于指定提交任务的用户。
- 如果是多集群环境,执行时需要修改“nameNode”的参数值为对应集群Oozie服务“fs.defaultFS”参数的值,否则保持不变。
示例如下,主要修改了“resourceManager”、“userName”和“user.name”参数,其他保持默认即可:
nameNode=hdfs://hacluster resourceManager=10.1.130.11:8032 queueName=default examplesRoot=examples userName=oozieuser user.name=oozieuser oozie.use.system.libpath=true oozie.wf.application.path=${nameNode}/user/${userName}/${examplesRoot}/apps/sqoop
- 修改“workflow.xml”文件。
- 集群未启用Kerberos认证(普通模式)
vim workflow.xml
以MySQL导入Hive举例,需修改的内容示例如下(主要修改了加粗部分):
<workflow-app xmlns="uri:oozie:workflow:1.0" name="sqoopclient-wf"> <start to="sqoopclient-node"/> <action name="sqoopclient-node"> <sqoopclient xmlns="uri:oozie:sqoopclient-action:1.0"> <resource-manager>${resourceManager}</resource-manager> <name-node>${nameNode}</name-node> <prepare> <delete path="${nameNode}/user/${userName}/${examplesRoot}/output-data/sqoopclient"/> <mkdir path="${nameNode}/user/${userName}/${examplesRoot}/output-data"/> </prepare> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <!-- 指定具体的Sqoop命令。注意命令最前面不加“sqoop”,不能写为“sqoop import”,数据库密码不能使用单引号或双引号引用 --> <command>import --connect jdbc:mysql://mysql_host_ip:3306/database --username xxx --password xxx --table xxx --hive-import --hive-table xxx --delete-target-dir --fields-terminated-by "," -m 1 --as-textfile</command> <!-- 指定使用的HDFS上的配置文件。无特殊情况的话默认可不指定--> <file>/user/oozie/share/lib/sqoopclient/hive-site.xml#hive-site.xml</file> </sqoopclient> <ok to="end"/> <error to="fail"/> </action> <kill name="fail"> <message>Sqoop client failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <end name="end"/> </workflow-app>
- 集群已启用Kerberos认证(安全模式)
cp workflow.xml.security workflow.xml
vim workflow.xml
以MySQL导入Hive举例,需修改的内容示例如下(主要修改了加粗部分):<workflow-app xmlns="uri:oozie:workflow:1.0" name="sqoopclient-wf"> <credentials> <credential name='hcat_auth' type='hcat'> <property> <name>hcat.metastore.uri</name> <!-- 该配置的值可通过hive-site.xml的配置hive.metastore.uris获取。例如可在“客户端安装目录/Hive/config/hive-site.xml”中获取--> <value>thrift://172.19.xxx.xxx:9083,thrift://172.xxx.xxx.xxx:9083</value> </property> <property> <name>hcat.metastore.principal</name> <!-- 该配置的值可通过hive-site.xml的配置hive.metastore.kerberos.principal获取。例如可在“客户端安装目录/Hive/config/hive-site.xml”中获取--> <value>hive/hadoop.xxx.com@XXX_XXX_XXX_XXX_XXX.COM</value> </property> </credential> </credentials> <start to="sqoopclient-node"/> <action name="sqoopclient-node" cred='hcat_auth'> <sqoopclient xmlns="uri:oozie:sqoopclient-action:1.0"> <resource-manager>${resourceManager}</resource-manager> <name-node>${nameNode}</name-node> <prepare> <delete path="${nameNode}/user/${userName}/${examplesRoot}/output-data/sqoopclient"/> <mkdir path="${nameNode}/user/${userName}/${examplesRoot}/output-data"/> </prepare> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <!-- 指定具体的Sqoop命令。注意命令最前面不加“sqoop”,不能写为“sqoop import”,数据库密码不能使用单引号或双引号引用 --> <command>import --connect jdbc:mysql://mysql_host_ip:3306/database --username xxx --password xxx --table xxx --hive-import --hive-table xxx --delete-target-dir --fields-terminated-by "," -m 1 --as-textfile</command> <!-- 指定使用的HDFS上的配置文件。无特殊情况的话默认可不指定--> <file>/user/oozie/share/lib/sqoopclient/hive-site.xml#hive-site.xml</file> </sqoopclient> <ok to="end"/> <error to="fail"/> </action> <kill name="fail"> <message>Sqoop client failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <end name="end"/> </workflow-app>
- 集群未启用Kerberos认证(普通模式)
- 将“workflow.xml”文件上传至“job.properties” 文件中“oozie.wf.application.path”参数配置的HDFS路径下,例如:
hadoop fs -put -f workflow.xml /user/oozieuser/examples/apps/sqoopclient
- 执行oozie job命令,运行工作流文件。
oozie job -oozie https://oozie实例的主机IP:端口号/oozie/ -config job.properties -run
- 命令参数解释如下:
- -oozie:实际执行Sqoop任务的Oozie服务器的URL。
- -config:工作流属性文件。
- -run:运行工作流。
- 执行完工作流文件,显示job id表示提交成功,例如:
job: 0000021-140222101051722-oozie-omm-W
可登录Oozie管理页面,查看运行情况:
使用oozieuser用户,登录Oozie WebUI页面:https://oozie角色的ip地址:21003/oozie 。
Oozie的WebUI界面中,可在页面表格根据job id查看已提交的工作流信息。
- 命令参数解释如下: