天天看點

雲小課|MRS基礎原理之CarbonData入門

作者:華為雲開發者聯盟
本文分享自華為雲社群《【雲小課】EI第40課 MRS基礎原理之CarbonData入門》,作者:Hello EI。
雲小課|MRS基礎原理之CarbonData入門

CarbonData是一種新型的Apache Hadoop本地檔案格式,使用先進的列式存儲、索引、壓縮和編碼技術,以提高計算效率,有助于加速超過PB數量級的資料查詢,可用于更快的互動查詢。同時,CarbonData也是一種将資料源與Spark內建的高性能分析引擎。

雲小課|MRS基礎原理之CarbonData入門

使用CarbonData的目的是對大資料即席查詢提供超快速響應。從根本上說,CarbonData是一個OLAP引擎,采用類似于RDBMS中的表來存儲資料。使用者可将大量(10TB以上)的資料導入以CarbonData格式建立的表中,CarbonData将以壓縮的多元索引列格式自動組織和存儲資料。資料被加載到CarbonData後,就可以執行即席查詢,CarbonData将對資料查詢提供秒級響應。

雲小課|MRS基礎原理之CarbonData入門

CarbonData将資料源內建到Spark生态系統,使用者可使用Spark SQL執行資料查詢和分析。也可以使用Spark提供的第三方工具JDBCServer連接配接到Spark SQL。

本文以從CSV檔案加載資料到CarbonData Table為例,介紹建立CarbonData table、加載資料,以及查詢資料的快速入門流程。

使用CarbonData需要安裝Spark2x元件,并安裝Spark2x的用戶端。

  • MRS叢集的建立可參考建立叢集,例如購買一個MRS 3.1.0版本叢集。
  • 安裝Spark2x用戶端,可參考安裝用戶端,例如用戶端安裝目錄為:“/opt/client”。
  • 對于安全模式的叢集(開啟了Kerberos認證),在使用CarbonData時,需要建立一個具有通路CarbonData權限的使用者,可參考建立使用者,使用者組選擇hadoop和hive,主組選擇hadoop,例如建立人機使用者“testuser”。

準備CSV檔案

準備加載到CarbonData Table的CSV檔案。

  1. 在本地準備CSV檔案,檔案名為:test.csv。13418592122,1001,MAC位址,2017-10-23 15:32:30,2017-10-24 15:32:30,62.50,74.56 13418592123,1002,MAC位址,2017-10-23 16:32:30,2017-10-24 16:32:30,17.80,76.28 13418592124,1003,MAC位址,2017-10-23 17:32:30,2017-10-24 17:32:30,20.40,92.94 13418592125,1004,MAC位址,2017-10-23 18:32:30,2017-10-24 18:32:30,73.84,8.58 13418592126,1005,MAC位址,2017-10-23 19:32:30,2017-10-24 19:32:30,80.50,88.02 13418592127,1006,MAC位址,2017-10-23 20:32:30,2017-10-24 20:32:30,65.77,71.24 13418592128,1007,MAC位址,2017-10-23 21:32:30,2017-10-24 21:32:30,75.21,76.04 13418592129,1008,MAC位址,2017-10-23 22:32:30,2017-10-24 22:32:30,63.30,94.40 13418592130,1009,MAC位址,2017-10-23 23:32:30,2017-10-24 23:32:30,95.51,50.17 13418592131,1010,MAC位址,2017-10-24 00:32:30,2017-10-25 00:32:30,39.62,99.13
  2. 将CSV檔案導入用戶端所在節點,例如“/opt”目錄下。
  3. 進入用戶端目錄,上傳CSV檔案到HDFS的“/data”目錄。cd /opt/client source ./bigdata_env source ./Spark2x/component_env kinit sparkuser hdfs dfs -put /opt/test.csv /data/

連接配接到CarbonData

在對CarbonData進行任何一種操作之前,首先需要連接配接到CarbonData。

  • 使用Spark SQL或Spark shell連接配接到Spark并執行Spark SQL指令。
  • 開啟JDBCServer并使用JDBC用戶端(例如,Spark Beeline)連接配接。cd /opt/client/Spark2x/spark/bin ./spark-beeline

建立CarbonData Table

在Spark Beeline被連接配接到JDBCServer之後,需要建立一個CarbonData table用于加載資料和執行查詢操作。

例如下面是建立一個簡單的表的指令:

create table  x1 (imei string, deviceInformationId int, mac string, productdate timestamp, updatetime timestamp, gamePointId double, contractNumber double) STORED AS carbondata TBLPROPERTIES ('SORT_COLUMNS'='imei,mac');           

指令執行結果如下:

+---------+
| Result  |
+---------+
+---------+
No rows selected (1.093 seconds)           

加載資料到CarbonData Table

建立CarbonData table之後,可以從CSV檔案加載資料到所建立的表中。

表的列名需要與CSV檔案的列名比對。

LOAD DATA inpath 'hdfs://hacluster/data/test.csv' into table x1 options('DELIMITER'=',', 'QUOTECHAR'='"','FILEHEADER'='imei, deviceinformationid,mac, productdate,updatetime, gamepointid,contractnumber');           

其中,“test.csv”為準備的CSV檔案,“x1”為示例的表名。

指令執行結果如下:

+------------+
|Segment ID  |
+------------+
|0           |
+------------+
No rows selected (3.039 seconds)           

在CarbonData中查詢資料

建立CarbonData table并加載資料之後,可以執行所需的資料查詢操作。以下為一些查詢操作舉例。

擷取記錄數

為了擷取在CarbonData table中的記錄數,可以運作以下指令。

select count(*) from x1;           

使用Groupby查詢

為了擷取不重複的deviceinformationid記錄數,可以運作以下指令。

select deviceinformationid,count (distinct deviceinformationid) from x1 group by deviceinformationid;           

用Filter查詢

為了擷取特定deviceinformationid的記錄,可以運作以下指令。

select * from x1 where deviceinformationid='1010';           

在執行資料查詢操作後,如果查詢結果中某一列的結果含有中文字等非英文字元,會導緻查詢結果中的列不能對齊,這是由于不同語言的字元在顯示時所占的字寬不盡相同。

在Spark-shell上使用CarbonData

建立CarbonData table并加載資料之後,可以執行所需的查詢操作,例如filters,groupby等。

使用者若需要在Spark-shell上使用CarbonData,需通過如下方式建立CarbonData Table,加載資料到CarbonData Table和在CarbonData中查詢資料的操作。

spark.sql("CREATE TABLE x2(imei string, deviceInformationId int, mac string, productdate timestamp, updatetime timestamp, gamePointId double, contractNumber double) STORED AS carbondata")
spark.sql("LOAD DATA inpath 'hdfs://hacluster/data/x1_without_header.csv' into table x2 options('DELIMITER'=',', 'QUOTECHAR'='\"','FILEHEADER'='imei, deviceinformationid,mac, productdate,updatetime, gamepointid,contractnumber')")
spark.sql("SELECT * FROM x2").show()           

關注我,第一時間了解華為雲新鮮技術~

繼續閱讀