CarbonData叢集模式體驗

lanyu發表於2021-09-09

官方提供了一個快速上手的 ,不過是採用spark-shell local模式的。我這裡在實際叢集環境做了下測試,並且記錄了下過程,希望對大家有所幫助。

前言

之前專門寫過一篇CarbonData的文章;。可惜礙於時間問題到現在才開始真正的嘗試。

編譯打包

截止到本文章發出,CarbonData 明確支援的Spark版本是 1.5.2(預設) 以及 1.6.1。 而相應的,hadoop版本有2.2.0 和 2.7.2,理論上大部分2.0 之後的hadoop版本應該都是相容的。

  • 下載原始碼:

git clone https://github.com/apache/incubator-carbondata.git carbondata
  • 安裝 thrift (0.9.3)

Note:
Thrift 主要是用來編譯carbon-format模組用的,裡面都是一些thrift檔案,需要生成java檔案。其他一些版本應該也是可以的,比如我用的就是0.9版本

  • 編譯打包

開啟pom.xml檔案,然後找到<profiles>標籤,然後加入

<profile>
      <id>hadoop-2.6.0</id>
      <properties>
        <hadoop.version>2.6.0</hadoop.version>
      </properties>
    </profile>

之後就可以指定hadoop 2.6.0 編譯了。不過這個是可選項,如前所述,理論上大部分版本都是相容的。

現在可以執行打包指令了:

cd carbondatamvn package -DskipTests -Pspark-1.6.1 -Phadoop-2.6.0

我編譯過很多次,都沒遇到啥問題。如果有問題,不妨留言給我。這個時候你應該得到了carbondata的jar包了:

assembly/target/scala-2.10/carbondata_2.10-0.1.0-SNAPSHOT-shade-hadoop2.6.0.jar
  • 依賴說明

CarbonData 現階段依賴於Kettle 以及 Hive Metastore。 依賴於Kettle 是因為一些資料處理邏輯Kettle已經有實現(譬如多執行緒等),而使用Hive Metastore 則是因為用Hive的人多。後面考慮會去除這些依賴,當前要體驗的話,需要額外做些配置。

  • Kettle plugins

 cd carbondata 
 cp -r processing/carbonplugins/*  carbondata-kettle
 tar czvf carbondata-kettle.tar.gz carbondata-kettle

接著將這個包分發到各個Slave節點上(hadoop叢集上),假定最後的目錄是:

/data/soft/lib/java/carbondata-kettle

配置完成後檢查下,確保carbondata-kettle下有個.kettle 的隱藏目錄,該目錄有kettle.properties檔案。各個Slave節點都會載入該配置檔案

  • Hive MetaStore 配置

首先下載一個,放到你準備提交Spark任務的機器上(有SPARK_HOME的機器上)的某個目錄,比如我這裡是:

  /Users/allwefantasy/Softwares/spark-1.6.1-bin-hadoop2.6/lib/mysql-connector-java-6.0.3.jar

然後將你的Hive 的hive-site.xml 檔案複製到你的SPAKR_HOME/conf 目錄下。conf 目錄會被自動打包傳送到叢集上。另外一種選擇是在提交的時候透過--files 指定hive-site.xml檔案也是OK的,我們推薦第一種方式。

hive-site.xml檔案一般會配置兩個目錄:

hive.exec.scratchdirhive.metastore.warehouse.dir

你需要確保你之後需要執行的程式對著兩個目錄相應的許可權。如果許可權不足,程式會較為明顯的告訴你問題所在,所以關注下命令列的輸出即可。

執行CarbonData

在 SPARK_HOME/lib 下還有三個datanucleus開頭的包,我們也透過--jars 引數加上

./bin/spark-shell   
--master yarn-client 
--num-executors 10 
--executor-cores 3 
--executor-memory 5G 
--driver-memory 3G 
--jars /Users/allwefantasy/CSDNWorkSpace/incubator-carbondata/assembly/target/scala-2.10/carbondata_2.10-0.1.0-SNAPSHOT-shade-hadoop2.6.0.jar,/Users/allwefantasy/Softwares/spark-1.6.1-bin-hadoop2.6/lib/datanucleus-api-jdo-3.2.6.jar,/Users/allwefantasy/Softwares/spark-1.6.1-bin-hadoop2.6/lib/datanucleus-core-3.2.10.jar,/Users/allwefantasy/Softwares/spark-1.6.1-bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar,/Users/allwefantasy/Softwares/spark-1.6.1-bin-hadoop2.6/lib/mysql-connector-java-5.1.35.jar

所以--jars 一共有五個包:

  1. 我們編譯好的carbondata_2.10-0.1.0-SNAPSHOT-shade-hadoop2.6.0.jar

  2. 我們下載的 mysql-connector-java-5.1.35.jar

  3. SPARK_HOME/lib/datanucleus-api-jdo-3.2.6.jar

  4. SPARK_HOME/lib/datanucleus-core-3.2.10.jar

  5. SPARK_HOME/lib/datanucleus-rdbms-3.2.9.jar

然後就執行起來了,進入spark shell。

構建CarbonContext 物件

import org.apache.spark.sql.CarbonContextimport java.io.Fileimport org.apache.hadoop.hive.conf.HiveConf

val cc = new CarbonContext(sc, "hdfs://xxx/data/carbondata01/store")

CarbonContext 的第二個引數是主儲存路徑,確保你設定的目錄,spark-shell 啟動賬號是具有寫入許可權。通常我會做如下操作:

hdfs dfs -chmod 777  /data/carbondata01/store

一些表資訊,索引資訊都是存在該目錄的。如果寫入許可權不足,load資料的時候,會出現如下的異常:

ERROR 05-07 13:42:49,783 - table:williamtable02 column:bkup generate global dictionary file failed
ERROR 05-07 13:42:49,783 - table:williamtable02 column:bc generate global dictionary file failed
ERROR 05-07 13:42:49,783 - table:williamtable02 column:bid generate global dictionary file failed
ERROR 05-07 13:42:49,783 - generate global dictionary files failed
ERROR 05-07 13:42:49,783 - generate global dictionary failed
ERROR 05-07 13:42:49,783 - main
java.lang.Exception: Failed to generate global dictionary files
    at org.carbondata.spark.util.GlobalDictionaryUtil$.org$carbondata$spark$util$GlobalDictionaryUtil$$checkStatus(GlobalDictionaryUtil.scala:441)
    at org.carbondata.spark.util.GlobalDictionaryUtil$.generateGlobalDictionary(GlobalDictionaryUtil.scala:485)

如果下次你在啟動spark-shell或者提交新的應用時,需要保持這個路徑(storePath)的不變,否則會出現表不存在的問題。類似:

AUDIT 05-07 16:12:10,889 - [allwefantasy][allwefantasy][Thread-1]Table Not Found: williamtable02
org.spark-project.guava.util.concurrent.UncheckedExecutionException: org.apache.spark.sql.catalyst.analysis.NoSuchTableException
    at org.spark-project.guava.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4882)
    at org.spark-project.guava.cache.LocalCache$LocalLoadingCache.apply(LocalCache.java:4898)
    at org.apache.spark.sql.hive.HiveMetastoreCatalog.lookupRelation(HiveMetastoreCatalog.scala:394)
    at

設定Kettle 相關

因為引入了Kettle的庫,而該庫需要在執行的伺服器上讀取一些配置檔案(如kettle.properties),所以需要做一個配置。我們前面已經將kettle 分發到各個節點了,現在把路徑要告訴Carbon,透過如下的方式:

cc.setConf("carbon.kettle.home","/data/soft/lib/java/carbondata-kettle")

如果這個目錄在Slave節點不存在,你進入Spark 各個節點(Executor)的日誌,可以看到很明顯的錯誤,提示 kettle.properties 找不到。 而更明顯的現象是,資料載入會不成功。

Hive  相關配置

理論上hive-site.xml的配置裡已經有這些資訊了,不過也可以顯示設定下。

cc.setConf("hive.metastore.warehouse.dir", "hdfs://cdncluster/user/hive/warehouse")
cc.setConf(HiveConf.ConfVars.HIVECHECKFILEFORMAT.varname, "false")

生產資料

到目前為止 CarbonContext 已經設定完畢,可以往裡面裝載資料了。現階段,CarbonData 支援CSV資料直接裝載進CarbonData。

如果你已經有或者可以自己產生csv相關的資料,則可以忽略本節。

另外其實CarbonData 也提供了標準的Spark SQL API(Datasource)方便你匯入資料,參看。內部本質也是幫你把資料轉化成csv然後再匯入的:

def saveAsCarbonFile(parameters: Map[String, String] = Map()): Unit = {      // To avoid derby problem, dataframe need to be writen and read using CarbonContext
      require(dataFrame.sqlContext.isInstanceOf[CarbonContext],        "Error in saving dataframe to carbon file, must use CarbonContext to save dataframe"
      )

      val storePath = dataFrame.sqlContext.asInstanceOf[CarbonContext].storePath
      val options = new CarbonOption(parameters)
      val dbName = options.dbName
      val tableName = options.tableName      // temporary solution: write to csv file, then load the csv into carbon
      val tempCSVFolder = s"$storePath/$dbName/$tableName/tempCSV"
      dataFrame.write
        .format(csvPackage)
        .option("header", "true")
        .mode(SaveMode.Overwrite)
        .save(tempCSVFolder)

這裡也介紹另外一種方式,以從ES匯出資料為csv為例:

  • 下載一個配置檔案,根據裡面的要求進行修改

並且將修改後的配置上傳到hdfs上。假設路徑是:

hdfs://cluster/tmp/test.json
  • 下載一個jar包:

連結:  密碼: kf5y
  • 提交到叢集

./bin/spark-submit   
--class streaming.core.StreamingApp   
--name "es匯出成csv檔案"  
--master yarn-cluster   
--executor-memory 2G   
--driver-memory 6G   
--conf "spark.locality.wait=10ms"   
--num-executors 35   
--executor-cores 3  \/Users/allwefantasy/CSDNWorkSpace/streamingpro/target/streamingpro-0.2.0-SNAPSHOT-online-1.6.1.jar  
-streaming.name estocsvn 
-streaming.job.file.path hdfs://cluster/tmp/test.json -streaming.platform spark

這樣你就生成了一個csv格式的資料

建立表

cc.sql("create table if not exists williamtable04 (sid string,  r double,time string,domain string,month Int,day Int,mid string) STORED BY 'org.apache.carbondata.format'")

貌似不支援float,需要用double型別。

裝載CSV資料

cc.sql(s"load data inpath 'hdfs://cluster/tmp/csv-table1/part-00001.csv' into table williamtable04")

csv檔案需要是.csv 為字尾,並且需要帶有header。當然,如果你生成的csv檔案沒有header,也可以透過在load data時指定FIELDHEADER來完成。

查詢

cc.sql("select count(*) from williamtable04").show

後話

因為現階段CarbonData 依賴於Hive/Kettle,所以需要做一些額外配置,自身的配置已經足夠簡單,只需要個storePath。在叢集環境裡,我們還需要注意許可權相關的問題。



作者:祝威廉
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2035/viewspace-2819002/,如需轉載,請註明出處,否則將追究法律責任。

相關文章