因为odps的sdk只有jdk, 也就是你必须要懂java才能在应用里使用odps,
要是用这样一个架构, 必需要有 apache-tomcat的支持, 下载地址 。
然后就是熟悉一下这个apache-tomcat的文件结构
我在这里不多说废话了, 因为说多了会有失误, 开启apache-tomcat服务十分简单, *inx用户可以执行bin里面的 startup.sh, windows用户可以执行bin里面的 startup.bat, 我们的java项目要放在webapps目这个录里面, 放的时候以目录的形式存储, 目录名就是我们的项目名。
docs, examples, host-manager, manager, ROOT 这些都是系统默认生成的目录, 我们新建的目录是 myodps,
这些初始的目录分别对应 localhost:8080/examples --- examples , localhost:8080 ----- ROOT , 所以我们建的目录对应的url是 localhost:8080/myodps
TOMCAT经过分析url后会按优先级render myodps目录里面的index.html, index.htm, index.jsp。所有前台用到的资源都放到这个目录上, 然后java后台程序放到WEB-INF里面的class目录里面(没有的话就自己创建一个)至此我们的配置告一段落了, 接下来就是写java程序来获取odps的数据。odps在用户手册上提供了怎么设置参数来达到预期的结果。 但是设置参数那一块和sql请求的那一块分别写在了不同的文档里面,略坑。
然后修改 WEB-INF里面的web.xml文件, servlet-name 可以随便填, 但是这个servlet是起着链接后台的class函数和前台的url的作用, 所以上下两个对应的servlet-name一定要一致!
因为不知道到底要引用哪个文件, 所以我把从官网下下来的所有 .jar文件都解压到classes目录里面, 引用了所有的包
import com.aliyun.odps.*;
import com.aliyun.odps.account.*;
import com.aliyun.odps.commons.transport.*;
import com.aliyun.odps.commons.util.*;
import com.aliyun.odps.counter.*;
import com.aliyun.odps.data.*;
import com.aliyun.odps.io.*;
import com.aliyun.odps.rest.*;
import com.aliyun.odps.security.*;
import com.aliyun.odps.task.*;
import com.aliyun.odps.task.copy.*;
import com.aliyun.odps.tunnel.*;
import com.aliyun.odps.tunnel.io.*;
import com.aliyun.odps.udf.*;
import com.aliyun.odps.udf.annotation.*;
import com.aliyun.odps.udf.impl.*;
import com.aliyun.odps.udf.utils.*;
import com.aliyun.odps.utils.*;
import com.aliyun.odps.volume.*;
import java.util.*;
import java.util.Map.Entry;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Myodps {
private Account account;
private Odps odps;
private ObjectOutputStream oos;
private FileOutputStream fos;
private FileWriter writer;
private FileReader reader;
public Myodps () {
account = new AliyunAccount("YourID", "YourKeys");
odps = new Odps(account);
String odpsUrl = "http://service.odps.aliyun.com/api";
odps.setEndpoint(odpsUrl);
odps.setDefaultProject("bigdata_final");
}
public String sendsql(String sql) {
String result = "";
try {
Instance instance = SQLTask.run(odps, sql);
String id = instance.getId();
instance.waitForSuccess();
Set<String> taskNames = instance.getTaskNames();
for (String name : taskNames) {
Map<String, String> results = instance.getTaskResults();
result = results.get(name);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
之后就是调用 sendsql进行和odps的交流, 以此成功告一段落。