閱讀676 返回首頁    go 技術社區[雲棲]


阿裏雲大數據利器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的客戶端:


Maxcompute(原odps)的客戶端:


是不是看起來一致。敏感的用戶發現了,為什麼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,
patientId 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,複製下來在瀏覽器中打開即可。

如圖


在瀏覽器中打開


總體上一看,非常清晰明了。任務開始時間結束時間,任務狀態,綠色進度條。很方便的獲取任務的總體情況

點擊Detail按鈕可以看更具體的調度,日誌等



點擊jsonsumary可以看到非常詳細的執行過程


那麼可以看到Maxcompute的webui還是比較友好的,方便用戶很快定位問題。調度方麵這裏也說一下是由阿裏雲統一調度,用戶無需關心優化。

⑦自定義函數的支持

hive和Maxcompute都支持自定函數。同樣是三種,udf,udtf,udaf。

代碼寫法一致。最大的區別在於數據類型的支持上。

目前Maxcompute支持的數據類型是

UDF 支持 MaxCompute SQL 的數據類型有:Bigint, String, Double, Boolean 類型 。MaxCompute 數據類型與 Java 類型的對應關係如下:

MaxCompute SQL Type Bigint String Double Boolean Decimal
Java Type Long String Double Boolean BigDecimal

注意:

  • java 中對應的數據類型以及返回值數據類型是對象,首字母請務必大寫;

  • 目前暫不支持 datetime 數據類型,建議可以轉換成 String 類型傳入處理 。

  • SQL 中的 NULL 值通過 Java 中的 NULL 引用表示,因此 Java primitive type 是不允許使用的,因為無法表示 SQL 中的 NULL 值 。

    所以不同於hive中支持各種類型。

    看代碼示例

     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還是比較友好的,方便用戶很快定位問題。調度方麵這裏也說一下是由阿裏雲統一調度,用戶無需關心優化。


    ⑧界麵化操作。

    談到界麵化的操作,阿裏雲的產品基本上都是界麵化操作,可拖拽等等,開發門檻非常低,所以也是非常適合初學大數據或者公司沒有相關開發人力的公司。

    Maxcompute的界麵化操作以及數據同步,權限控製,數據管理,和其他數據源交互,定時調度等簡單介紹下,就是阿裏雲的產品-大數據開發套件,目前是免費使用的。需要開通Maxcompute項目進入操作。等不及了直接上圖

    1,Maxcompute sql 查詢界麵化


    maxcompute mapreduce界麵化配置


    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 15:03:41

  上一篇:go  用SLF4J和Guidce記錄日誌
  下一篇:go  《Spark官方文檔》Spark Streaming編程指南(二)