原文连接:http://sqoop.apache.org/docs/1.99.6/ClientAPI.html
Sqoop Java客户端API指南
这篇文章秒描述了额如何在外部应用中使用sqoop java 客户端API。通过客户端API可以实现sqoop命令的功能。使用Sqoop客户端API需要Sqoop 客户端Jar文件及其依赖。
提供了支持sqool操作的封装方法的主要类是:
public classSqoopClient {
...
}
Java Client API isexplained using Generic JDBC Connector example. Before executing theapplication using the sqoop client API, check whether sqoop server is running.
JAVA客户端API会被通用的 JDBC连接器实例解释。在执行使用sqoop客户端API的应用前要确认sqoop服务器已经启动了。
流程
在sqoop服务器中执行一个sqoop任务的流程如下:
1. 通过使用connectorId来建立一个LINK对象-创建Link对象并发返回linkId(lid)
2. 使用 from linkId和to linkId来创建一个JOB对象 – 创建已给Job对象并返回jobId(jid)
3. 启动指定jobId的任务。在服务器上启动任务并生成一条提交记录。
工程依赖
maven 依赖
初始化啊
First initializethe SqoopClient class with server URL as argument.
首先使用服务器URL来初始化SqoopClient类实例
String url ="http://localhost:12000/sqoop/";
SqoopClient client= new SqoopClient(url);
可以使用客户端对象的setServerUrl(String)方法来修改服务器的URL
client.setServerUrl(newUrl);
Link
连接器提供了和多个数据源进行交互的功能,因此在sqoop中用来作为在不同数据源中传输数据的方法。注册的注册器需要提供从其所代表的数据源中读取数据和写入数据的逻辑实现。连接器可以被一个或多个连接关联。Java客户端API允许用户为某个注册的 连接器创建,更新和删除一个连接。创建和更新连接要求取出针对特定连接器的连接配置。因此最开始的事情就是获取注册的连接器的列表并选择用来创建连接的连接器。然后就可以通过使用Display Config and Input Names For Connector来获取该连接器的所有配置和输入列表
保存连接
首先通过调用createLink(cid)方法,传入一个连接器ID创建一个新的 连接并返回一个MLink对象,该对象包含一个id和对应连接器未设定的 连接配置。接着使用相关输入填充配置。最后传递配置好的MLink调用saveLink方法保存连接
// create aplaceholder for link
long connectorId =1;
MLink link =client.createLink(connectorId);
link.setName("Vampire");
link.setCreationUser("Buffy");
MLinkConfiglinkConfig = link.getConnectorLinkConfig();
// fill in the linkconfig values
linkConfig.getStringInput("linkConfig.connectionString").setValue("jdbc:mysql://localhost/my");
linkConfig.getStringInput("linkConfig.jdbcDriver").setValue("com.mysql.jdbc.Driver");
linkConfig.getStringInput("linkConfig.username").setValue("root");
linkConfig.getStringInput("linkConfig.password").setValue("root");
// save the linkobject that was filled
Status status =client.saveLink(link);
if(status.canProceed()){
System.out.println("Created Link withLink Id : " + link.getPersistenceId());
} else {
System.out.println("Something went wrongcreating the link");
}
如果状态是OK或WARNING,status.canProceed()方法返回true.在发布状态之前,连接的配置会通过使用对应的验证器进行验证。
当savelink方法执行成功后,新的连接ID会分配到连接对象上,否则会抛出异常。
link.getPersistenceId()方法返回保存在sqoop仓库中的link对象的唯一标识。
用户可以通过以下方法来获取一个连接
Method |
Description |
getLink(lid) |
Returns a link by id |
getLinks() |
Returns list of links in the sqoop |
Job
一个sqoop任务包含From和To部分,将数据从From数据源传输到To数据源。From和To部分都由其对应的连接器Ids来唯一标识。如创建一个任务我们必须指定FromLinkId和ToLinkId.因此创建一个任务的先决条件就是我们上面描述的创建连接。
当From和To的连接Id给定后,连接对象相关的连接器的任务配置需要配置。可以通过连接器的DisplayConfig and Input Names For Connector来回去所有的任务配置和输入。一个连接器可以有一个或多个连接。我们使用MFromConfig和MToConfig对象分别对应于From和To连接。
除了配置From和To连接的任务配置外,我们还需要提供控制任务执行引擎环境的驱动配置。例如如果任务执行引擎是mapreduce,我们需要指定用来从From读取数据的Map的数量。
保存任务
下面是创建和保存一个任务的代码:
String url ="http://localhost:12000/sqoop/";
SqoopClient client= new SqoopClient(url);
//Creating dummyjob object
long fromLinkId =1;// for jdbc connector
long toLinkId = 2;// for HDFS connector
MJob job =client.createJob(fromLinkId, toLinkId);
job.setName("Vampire");
job.setCreationUser("Buffy");
// set the"FROM" link job config values
MFromConfigfromJobConfig = job.getFromJobConfig();
fromJobConfig.getStringInput("fromJobConfig.schemaName").setValue("sqoop");
fromJobConfig.getStringInput("fromJobConfig.tableName").setValue("sqoop");
fromJobConfig.getStringInput("fromJobConfig.partitionColumn").setValue("id");
// set the"TO" link job config values
MToConfigtoJobConfig = job.getToJobConfig();
toJobConfig.getStringInput("toJobConfig.outputDirectory").setValue("/usr/tmp");
// set the driverconfig values
MDriverConfigdriverConfig = job.getDriverConfig();
driverConfig.getStringInput("throttlingConfig.numExtractors").setValue("3");
Status status =client.saveJob(job);
if(status.canProceed()){
System.out.println("Created Job with JobId: "+ job.getPersistenceId());
} else {
System.out.println("Something went wrongcreating the job");
}
用户可以通过下面的方法来获取任务对象
Method |
Description |
getJob(jid) |
Returns a job by id |
getJobs() |
Returns list of jobs in the sqoop |
状态码列表
Function |
Description |
OK |
没有问题,没有警告 |
WARNING |
实体可以被正确的处理,没有致命错误 |
ERROR |
验证实体有验证的问题,这些问题不解决无法继续处理 |
查看错误或警告验证信息
当出现任何的警告和错误状态时,用户需要获取验证信息列表
printMessage(link.getConnectorLinkConfig().getConfigs());
private static voidprintMessage(List
for(MConfig config : configs) {
List
if (config.getValidationMessages() != null){
// print every validation message
for(Message message :config.getValidationMessages()) {
System.out.println("Configvalidation message: " + message.getMessage());
}
}
for (MInput minput : inputlist) {
if (minput.getValidationStatus() ==Status.WARNING) {
for(Message message :config.getValidationMessages()) {
System.out.println("Config InputValidation Warning: " + message.getMessage());
}
}
else if (minput.getValidationStatus() ==Status.ERROR) {
for(Message message :config.getValidationMessages()) {
System.out.println("Config InputValidation Error: " + message.getMessage());
}
}
}
}
更新连接和任务
在仓库中创建连接和任务之后,我们可以使用下面的方法来更新或删除一个连接或任务。
Method |
Description |
updateLink(link) |
通过传递link进行更新,会检查任何的错误和警告 |
deleteLink(lid) |
删除连接,只有该连接当前没有被任何任务使用时才可以删除 |
updateJob(job) |
新任务,会检查任何的错误和警告 |
deleteJob(jid) |
删除任务 |
启动任务
启动任务需要指定任务Id,成功启动之后,getStatus()方法会返回“BOOTING” or“RUNNING”.
//Job start
long jobId = 1;
MSubmissionsubmission = client.startJob(jobId);
System.out.println("JobSubmission Status : " + submission.getStatus());
if(submission.getStatus().isRunning()&& submission.getProgress() != -1) {
System.out.println("Progress : " +String.format("%.2f %%", submission.getProgress() * 100));
}
System.out.println("Hadoopjob id :" + submission.getExternalId());
System.out.println("Joblink : " + submission.getExternalLink());
Counters counters =submission.getCounters();
if(counters !=null) {
System.out.println("Counters:");
for(CounterGroup group : counters) {
System.out.print("\t");
System.out.println(group.getName());
for(Counter counter : group) {
System.out.print("\t\t");
System.out.print(counter.getName());
System.out.print(": ");
System.out.println(counter.getValue());
}
}
}
if(submission.getExceptionInfo()!= null) {
System.out.println("Exception info :" +submission.getExceptionInfo());
}
//Check job statusfor a running job
MSubmissionsubmission = client.getJobStatus(jobId);
if(submission.getStatus().isRunning()&& submission.getProgress() != -1) {
System.out.println("Progress : " +String.format("%.2f %%", submission.getProgress() * 100));
}
//Stop a runningjob
submission.stopJob(jobId);
上面的代码块中任务的启动时异步的。如果需要同步启动任务,需要调用startJob(jid,callback,pollTime)方法。如果对获取任务状态不感兴趣,可以指定callback参数为空,该方法将返回任务的最终状态。pollTime用来指定从sqoop服务器获取任务状态的时间间隔,指定的值必须大于0.如果该值较小的话,我们会频繁的连接sqoop服务器。如果同步任务中指定了非空的callback,会在成功启动时首先调用callback的submitted(MSubmission)方法,然后每隔pollTime时间调用callback的updated(MSubmission)方法,最后在任务完成时调用callback.finished(MSubmission)方法。