CarbonData叢集模式體驗
官方提供了一個快速上手的 ,不過是採用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 一共有五個包:
我們編譯好的carbondata_2.10-0.1.0-SNAPSHOT-shade-hadoop2.6.0.jar
我們下載的 mysql-connector-java-5.1.35.jar
SPARK_HOME/lib/datanucleus-api-jdo-3.2.6.jar
SPARK_HOME/lib/datanucleus-core-3.2.10.jar
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis系列:搭建Redis叢集(叢集模式)Redis模式
- redis偽叢集配置Cluster叢集模式Redis模式
- Redis Cluster叢集模式部署Redis模式
- influxDB叢集模式實踐UX模式
- rocketMq叢集master模式搭建MQAST模式
- Redis三種叢集模式Redis模式
- docker初體驗:docker部署nginx負載均衡叢集DockerNginx負載
- Redis Cluster叢集模式部署XRedis模式
- RabbitMQ 雙機 映象叢集模式MQ模式
- Spring quartz 叢集模式的坑Springquartz模式
- Redis安裝之叢集-哨兵模式(sentinel)模式Redis模式
- 部署spark2.2叢集(standalone模式)Spark模式
- 部署Spark2.2叢集(on Yarn模式)SparkYarn模式
- MySQL MGR 叢集搭建(單主模式)MySql模式
- Hadoop叢集之淺析安全模式Hadoop模式
- 大資料Spark叢集模式配置大資料Spark模式
- Spring Boot整合Redis叢集(Cluster模式)Spring BootRedis模式
- 邊緣計算k8s叢集SuperEdge初體驗K8S
- Oracle叢集軟體管理-新增和刪除叢集節點Oracle
- Spark3.0.1各種叢集模式搭建Spark模式
- Redis學習筆記八:叢集模式Redis筆記模式
- Zookeeper叢集 + Kafka叢集Kafka
- Redis叢集模式和常用資料結構Redis模式資料結構
- redis Cluster模式叢集 多機器 docker 部署Redis模式Docker
- 安裝配置 zookeeper (單機非叢集模式)模式
- 搭建zookeeper叢集(偽叢集)
- Centos7安裝Nacos單機模式以及叢集模式(包含nignx安裝以及實現叢集)的相關配置CentOS模式
- 以一致的體驗交付和管理雲原生多叢集應用
- zookeeper叢集及kafka叢集搭建Kafka
- Redis三種高可用模式:主從、哨兵、叢集Redis模式
- Spring Boot(十三):整合Redis哨兵,叢集模式實踐Spring BootRedis模式
- Hadoop框架:叢集模式下分散式環境搭建Hadoop框架模式分散式
- linux系統——Redis叢集搭建(主從+哨兵模式)LinuxRedis模式
- 叢集,lvs負載均衡的四種工作模式負載模式
- Zookeeper原始碼分析(四) —– 叢集模式(replicated)執行原始碼模式
- azkaban叢集模式安裝與execute-as-user配置模式
- Zookeeper原始碼分析(四) ----- 叢集模式(replicated)執行原始碼模式
- 5分鐘實現用docker搭建Redis叢集模式和哨兵模式DockerRedis模式