阿裏雲大數據利器Maxcompute學習之-假如你使用過hive
如果您是一個大數據開發工程師並且使用過hadoop的hive框架,那麼恭喜您,阿裏雲的大數據計算服務-Maxcompute,您已經會了90%。這篇文章就來簡單對比下Maxcompute和hive的異同,來方便剛開始使用Maxcompute的用戶,從hive秒速遷移到Maxcompute的使用上。
首先,回顧下hive的概念。
1、hive是基於hadoop的,以表的形式來存儲數據,實際上數據是存儲在hdfs上,數據庫和表其實是hdfs上的兩層目錄,數據是放在表名稱目錄下的,計算還是轉換成mapreduce計算。
2、hive可以通過客戶端命令行和java api操作數據
3、hive是hql語言操作表,跟通用sql語言的語法大致相同,可能會多一些符合本身計算的函數等。hql會解析成mapreduce進行相關邏輯計算
4、hive有分區分桶的概念
5、hive可以通過命令從本地服務器來上傳下載表數據
hive可以通過外部表功能映射hbase和es等框架的數據
6、hive任務可以通過hadoop提供的webUI來查看任務進度,日誌等
7、hive支持自定義函數udf,udaf,udtf
8、hive可以通過hue界麵化操作
9、hive可以通過sqoop等工具和其他數據源交互
10、資源調度依賴於hadoop-yarn平台
那麼如果你對這些hive的功能稍微熟悉的話,現在我告訴你,Maxcompute的功能以及用法和上述hive功能基本一致。
先看下Maxcompute的組件:
MaxCompute 主要服務於批量結構化數據的存儲和計算,可以提供海量數據倉庫的解決方案以及針對大數據的分析建模服務,支持sql查詢計算,自定義函數udf實現複雜邏輯,mapreduce程序實現更具體的業務計算,支持Graph麵向迭代的圖計算處理框架,提供java api來連接操作sqltask。
是不是初步看起來MaxCompute也是和hive一樣,可以用sql,udf,mr
①文件係統對比
對比差異之前,容許我先簡單介紹下阿裏雲的基石-飛天係統,詳細的可以網上搜下。飛天係統是分布式的文件存儲和計算係統,聽起來是不是好熟悉,是不是和hadoop的味道一樣。這裏對於Maxcompute可以暫時把它當作是hadoop類似的框架,那Maxcompute就是基於飛天係統的,類似於hive基於hadoop。
hive的數據實際上是在hdfs上,元數據一般放在mysql,以表的形式展現。你可以直接到hdfs上查到具體文件。Maxcompute的數據是在飛天文件係統,對外不暴露文件係統,底層優化會自動做好。
②hive和Maxcompute客戶端
直接上圖來對比
hive的客戶端:
是不是看起來一致。敏感的用戶發現了,為什麼odps客戶端中沒出現show databases.
實際上
項目空間(Project)是 MaxCompute 的基本組織單元,它類似於傳統數據庫的Database 或 Schema 的概念,是進行多用戶隔離和訪問控製的主要邊界 。一個用戶可以同時擁有多個項目空間的權限
所以和hive客戶端區別在於odps客戶端需要在配置文件中預先指定好項目名稱(database)
配置文件如圖
在客戶端中可以執行sql和其他命令。
那麼MaxCompute除了命令行客戶端也提供了python和java的sdk來訪問。不說了直接上代碼
import java.util.List;
import com.aliyun.odps.Instance;
import com.aliyun.odps.Odps;
import com.aliyun.odps.OdpsException;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.task.SQLTask;
public class testSql {
//這裏accessId和accessKey是阿裏雲為安全設置的賬戶訪問驗證,類似於密碼,不止是在Maxcompute中使用
private static final String accessId = "";
private static final String accessKey = “”;
//這裏是的服務地址
private static final String endPoint = "https://service.odps.aliyun.com/api";
//Maxcompute的項目名稱,類似於hive的database
private static final String project = "";
private static final String sql = "select category from iris;";
public static void
main(String[] args) {
Account account = new AliyunAccount(accessId, accessKey);
Odps odps = new Odps(account);
odps.setEndpoint(endPoint);
odps.setDefaultProject(project);
Instance i;
try {
i = SQLTask.run(odps, sql);
i.waitForSuccess();
List<Record> records = SQLTask.getResult(i);
for(Record r:records){
System.out.println(r.get(0).toString());
}
} catch (OdpsException e) {
e.printStackTrace();
}
}
}
是不是覺得很親切,跟大多數數據庫的訪問方式一樣。
③odpscmd和hivesql
首先來看建表語句
hive標準建表語句:
hive> create table page_view
> (
> page_id bigint comment '頁麵ID',
> page_name string comment '頁麵名稱',
> page_url string comment '頁麵URL'
> )
> comment '頁麵視圖'
> partitioned by (ds string comment '當前時間,用於分區字段')
> row format delimited
> stored as rcfile
> location '/user/hive/test';
maxcompute建表語句:
create table page_view
(
page_id bigint comment '頁麵ID',
page_name string comment '頁麵名稱',
page_url string comment '頁麵URL'
) partitioned by (ds string comment '當前時間,用於分區字段')
從建表語句上明顯的可以感覺出來,maxcompute沒有指定分隔符,沒有指定文件存儲路徑,沒有指定文件的存儲格式。難道是默認的嗎?不。
因為maxcompute是基於阿裏雲飛天文件係統,用戶無需關心文件存儲格式,壓縮格式,存儲路徑等,
這些操作由阿裏雲來完成,用戶也不用來疲於文件存儲成本,壓縮性價比,讀寫速度等優化,可以將精力集中在業務的開發上。
另外二者的數據的上傳下載;
hive可以通過命令,比如上傳
maxcompute是通過命令工具 tunnel上傳下載,同時支持在上傳過程校驗文件格式髒數據等
④分區和分桶
分區的概念相信使用hive的同學很熟悉,其實就是在表目錄上再套一層目錄,將數據區分,目的就是提高查詢效率。那麼從上麵建表語句中可以看出maxcomoute和hive都是支持分區的,概念用法一致。
關於分桶,上麵建表語句中hive中有分桶語句,maxcompute沒有分桶的操作,實際上分桶是把一個大文件根據某個字段hash成多個小文件,適當的分桶會提高查詢效率,在maxcompute中這些優化底層已經做了。
⑤外部表功能
hive可以通過外部表的功能來操作例如hbase和es的數據。外部表功能maxcompute(2.0版本支持)中也是同樣適用,maxcompute通過外部表來映射阿裏雲的OTS和OSS兩個數據存儲產品來處理非結構化的數據,例如音頻視頻等。看下建表語句:
CREATE EXTERNAL TABLE IF NOT EXISTS ambulance_data_csv_external
(
vehicleId int,
recordId int,
patie
ntId int,
calls int,
locationLatitute double,
locationLongtitue double,
recordTime string,
direction string
)
STORED BY 'com.aliyun.odps.CsvStorageHandler' -- (2)
LOCATION 'oss://oss-cn-hangzhou-zmf.aliyuncs.com/oss-odps-test/Demo/SampleData/CSV/AmbulanceData/';
再看hive映射到hbase建表語句
CREATE EXTERNAL TABLE cofeed_info
(
rowkey string,
id string,
source string,
insert_time timestamp,
dt string
) STORED BY ‘org.apache.Hadoop.hive.hbase.HBaseStorageHandler’ WITH
SERDEPROPERTIES (“hbase.columns.mapping”=
“:key,
cf:id,
cf:source,
cf:insert_time,
cf:dt”) TBLPROPERTIES (“hbase.table.name” = “cofeed_info”);
語法基本一致,maxcompute可以自定義extractor來處理非結構化數據,可以參考https://yq.aliyun.com/articles/61567來學習
⑥webui
hive任務依賴於hadoop的hdfs和yarn提供的webui訪問。看下對比
hadoopwebui
在這裏可以通過曆史任務來查看hive任務的執行情況。個人覺得頁麵不是很友好。
那麼在Maxcompute中當然也是可以通過ui來查看任務執行狀態,進度,參數,以及任務日誌等
首先在任務執行的時候,在客戶端會打印出來一串http地址我們叫做logview,複製下來在瀏覽器中打開即可。
如圖
在瀏覽器中打開
總體上一看,非常清晰明了。任務開始時間結束時間,任務狀態,綠色進度條。很方便的獲取任務的總體情況
那麼可以看到Maxcompute的webui還是比較友好的,方便用戶很快定位問題。調度方麵這裏也說一下是由阿裏雲統一調度,用戶無需關心優化。
⑦自定義函數的支持
hive和Maxcompute都支持自定函數。同樣是三種,udf,udtf,udaf。
代碼寫法一致。最大的區別在於數據類型的支持上。
目前Maxcompute支持的數據類型是
UDF 支持 MaxCompute SQL 的數據類型有:Bigint, String, Double, Boolean 類型 。MaxCompute 數據類型與 Java 類型的對應關係如下:
注意:
java 中對應的數據類型以及返回值數據類型是對象,首字母請務必大寫;
目前暫不支持 datetime 數據類型,建議可以轉換成 String 類型傳入處理 。
SQL 中的 NULL 值通過 Java 中的 NULL 引用表示,因此 Java primitive type 是不允許使用的,因為無法表示 SQL 中的 NULL 值 。
所以不同於hive中支持各種類型。
看maxcompute代碼示例
import com.aliyun.odps.udf.UDF;
public final class Lower extends UDF {
public String evaluate(String s) {
if (s == null) { return null; }
return s.toLowerCase();
}
}
用法一致,所以使用hive的用戶基本可以直接遷移。
在此強調一下,在MaxCompute中處於安全層麵的考慮對udf和mr是有java沙箱限製的,比如在udf代碼中不能啟用其他線程等等,具體可以參考
https://help.aliyun.com/document_detail/27967.html
那麼可以看到Maxcompute的webui還是比較友好的,方便用戶很快定位問題。調度方麵這裏也說一下是由阿裏雲統一調度,用戶無需關心優化。
⑧界麵化操作。
談到界麵化的操作,阿裏雲的產品基本上都是界麵化操作,可拖拽等等,開發門檻非常低,所以也是非常適合初學大數據或者公司沒有相關開發人力的公司。
hive可以借助hue工具來操作查詢數據,但是實際上交互性不是很強。
那麼這裏就將Maxcompute的界麵化操作以及數據同步,權限控製,數據管理,和其他數據源交互,定時調度等簡單介紹下,就是阿裏雲的產品-大數據開發套件,目前是免費使用的。需要開通Maxcompute項目進入操作。等不及了直接上圖
1,Maxcompute sql 查詢界麵化
Maxcompute數據同步界麵化
hive可以通過sqoop工具和多種數據源進行數據同步。Maxcompute在大數據開發套件中也是非常方便的和其他數據源進行同步
是不是很神奇,驚不驚喜,意不意外。具體的使用還是大家親自體驗,這裏就不一一介紹了。
那最後來看下hadoop-mapreduce和Maxcompute-mapreduce的使用對比。還是用大家最喜歡的wordcount來做示例。
介紹之前還是要強調一下,1,Maxcompute-mapreduce輸入輸出都是表(或者分區)的形式,如果需要引用其他文件,需要先上傳2,Maxcompute-mapreduce也是有沙箱限製,不允許在代碼中啟用別的框架線程等。
hadoop-mr代碼就不貼了,直接上Maxcompute-mapreduce代碼
@Override
public void setup(TaskContext context) throws IOException {
word = context.createMapOutputKeyRecord();
one = context.createMapOutputValueRecord();
one.set(new Object[] { 1L });
System.out.println("TaskID:" + context.getTaskID().toString());
}
@Override
public void map(long recordNum, Record record, TaskContext context)
throws IOException {
//maxcompute中是以表中一行記錄來處理,Record
for (int i = 0; i < record.getColumnCount(); i++) {
word.set(new Object[] { record.get(i).toString() });
context.write(word, one);
}
}
}
再看job主函數配置,代碼邏輯是通用的
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: WordCount <in_table> <out_table>");
System.exit(2);
}
JobConf job = new JobConf();
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(SumCombiner.class);
job.setReducerClass(SumReducer.class);
//這裏可以直接指定map端輸出的字段
job.setMapOutputKeySchema(SchemaUtils.fromString("word:string"));
job.setMapOutputValueSchema(SchemaUtils.fromString("count:bigint"));
//這裏輸入出需要是表活著分區
InputUtils.addTable(TableInfo.builder().tableName(args[0]).build(), job);
OutputUtils.addTable(TableInfo.builder().tableName(args[1]).build(), job);
JobClient.runJob(job);
}
那麼基本上主要的功能對比差不多了,大家可以發現,如果您是一位使用過hive的開發人員可以秒遷移到maxcompute上,更加方便簡潔的來做開發,將開發人員從苦逼的加班中解放出來,實際上公司節省了大量的運維成本,開發人力成本等等,將主要精力放在業務開發。如果非要問我hive和maxcompute的性能對比,那我隻能告訴它是經曆雙十一考驗過的。
總結:如果說工業革命是將人們從體力勞動解放出來,那麼如今的互聯網革命,尤其是雲計算大數據的飛速發展是將人們從腦力中解放出來。
即使你是一個人的研發公司,阿裏雲也可以讓你有對抗世界級企業的能力。你,不是一個人在戰鬥。
最後更新:2017-05-19 21:10:40