Apache CarbonData | GitHub | 文檔
1 概述
CarbonData是一個開源的用于快速資料分析的新型BigData檔案格式,這個項目是華為公司在2016年開源的類Parquet的列式存儲,也僅僅用了不到一年的時間就成為了Apache的頂級項目。
CarbonData是一種高性能資料解決方案,支援各種資料分析方案,包括BI分析,臨時SQL查詢,詳細記錄快速過濾查找,流分析等。CarbonData已經部署在許多企業生産環境中,在最大的場景之一中,它支援在具有3PB資料(超過5萬億條記錄)的單個表上進行查詢,響應時間少于3秒!
CarbonData檔案格式是HDFS中的一個列式存儲,它具有許多現代列式格式的功能,如可拆分、壓縮模式、複雜資料類型等,并且CarbonData具有以下獨特功能:
- 将資料與索引一起存儲:它可以顯着提高查詢性能并減少 I/O 掃描和CPU資源(查詢中有過濾器)。CarbonData索引由多級索引組成,處理架構可以利用此索引來減少排程和處理所需的任務,并且還可以在任務端掃描中以更精細的粒度機關(稱為blocklet)跳過掃描而不是掃描整個檔案。
- 可操作的編碼資料:通過支援高效壓縮和全局編碼方案,可以查詢壓縮/編碼資料,可以在将結果傳回給使用者之前轉換資料,這是“後期實作的”。
- 支援單一資料格式的各種用例:如互動式OLAP樣式查詢,順序通路(大掃描),随機通路(窄掃描)。
2 安裝
2.1 要求
- 類Unix環境(Linux、Mac OS X)
- Git
- Apache Maven(推薦3.3版本或者更高)
- Java 7 或者 Java 8
- Apache Thrift 0.9.3
其它安裝我這裡直接跳過。可以檢視下環境的thrift:
thrift -version
,如果沒有則需要安裝:
- 安裝依賴
yum -y install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel openssl-devel
- 安裝 thrift
wget http://archive.apache.org/dist/thrift/0.9.3/thrift-0.9.3.tar.gz
tar -zxf thrift-0.9.3.tar.gz
cd thrift-0.9.3/
./configure --with-boost=/usr/local
make -j24
make install
# 驗證
thrift -version
錯誤一:如果在編譯時報如下錯誤:
g++: error: /usr/local/lib64/libboost_unit_test_framework.a: No such file or directory
make[5]: *** [processor_test] Error 1
make[5]: *** Waiting for unfinished jobs....
make[5]: Leaving directory `/opt/thrift-0.9.3/lib/cpp/test'
make[4]: *** [all] Error 2
make[4]: Leaving directory `/opt/thrift-0.9.3/lib/cpp/test'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/opt/thrift-0.9.3/lib/cpp'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/opt/thrift-0.9.3/lib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/opt/thrift-0.9.3'
make: *** [all] Error 2
出現上面的錯誤是因為
./configure
的時候是預設編譯32位的,不會在
lib64/
下産生檔案,可以先查找
libboost_unit_test_framework.a
檔案,再在提示的目錄下建立一個軟連接配接。
find / -name libboost_unit_test_framework.a
# 将/usr/local/lib/libboost_unit_test_framework.a軟連到lib64下
ln -s /usr/local/lib/libboost_unit_test_framework.a /usr/local/lib64/libboost_unit_test_framework.a
錯誤二:
libboost_unit_test_framework.a
找不到時,則需要手動安裝boost庫。然後在建立64位的軟連接配接。
# https://www.boost.org/
wget https://dl.bintray.com/boostorg/release/1.71.0/source/boost_1_71_0.tar.gz
tar zxf boost_1_71_0.tar.gz
cd boost_1_71_0/
./bootstrap.sh
./b2 install
ln -s /usr/local/lib/libboost_unit_test_framework.a /usr/local/lib64/libboost_unit_test_framework.a
錯誤三:問題解決後再次
make install
,此時可能還會遇到如下的錯誤:
collect2: error: ld returned 1 exit status
make[4]: *** [processor_test] Error 1
make[4]: Leaving directory `/opt/thrift-0.9.3/lib/cpp/test'
make[3]: *** [install] Error 2
make[3]: Leaving directory `/opt/thrift-0.9.3/lib/cpp/test'
make[2]: *** [install-recursive] Error 1
make[2]: Leaving directory `/opt/thrift-0.9.3/lib/cpp'
make[1]: *** [install-recursive] Error 1
make[1]: Leaving directory `/opt/thrift-0.9.3/lib'
make: *** [install-recursive] Error 1
安裝libevent,然後再次安裝thrift
wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
tar -zxf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure --prefix=/usr
make
sudo make install
2.2 擷取CarbonData
2.2.1 下載下傳二進制包
在CarbonData釋出1.6.0之後進行編譯中提示有個包缺失(carbondata-core),然後在Maven中央倉庫中查找是也缺失沒有這個依賴包,最新的版本顯示的是 1.5.4。
和Spark內建比較簡單,官方已經提供了這個編譯後的jar包,是以可以直接下載下傳官方提供的
apache-carbondata-1.6.0-bin-spark2.3.2-hadoop2.7.2.jar
包:carbondata/1.6.0
是以這次直接下載下傳官方已經打好的二進制jar包。
wget https://dist.apache.org/repos/dist/release/carbondata/1.6.0/apache-carbondata-1.6.0-bin-spark2.3.2-hadoop2.7.2.jar
2.2.2 編譯方式
又過了段之間,發現Maven中央倉庫終于同步上了,我們這次從頭開始編譯,本想着會順利,不過依然出現了一些問題,這裡也提供了我的解決方法供大家參考。
本次編譯我們将源碼的Hadoop版本修改為3.1.2進行編譯。編譯過程如下:
# 1 clone源碼
# 也可以直接下載下傳對應版本的源碼包
# wget http://archive.apache.org/dist/carbondata/1.6.0/apache-carbondata-1.6.0-source-release.zip
# unzip apache-carbondata-1.6.0-source-release.zip
# cd carbondata-parent-1.6.0/
git clone https://github.com/apache/carbondata.git
cd carbondata/
# 2 選擇版本。這裡選擇最新的CarbonData-1.6.0
git tag
git checkout tags/apache-CarbonData-1.6.0-rc3
# 3 編譯。指定Spark版本為2.3.4,Hadoop版本為 3.1.2
mvn -DskipTests -Pspark-2.3 -Dspark.version=2.3.4 -Dhadoop.version=3.1.2 clean package
編譯過程可能會出現如下的問題:
問題1:依賴擷取失敗
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project carbondata-hive: Could not resolve dependencies for project org.apache.carbondata:carbondata-hive:jar:1.6.0: Could not transfer artifact org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde from/to conjars (http://conjars.org/repo): conjars.org: Name or service not known: Unknown host conjars.org: Name or service not known -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <goals> -rf :carbondata-hive
解決:我們直接下載下傳依賴包,手動導入本地Maven倉庫。執行如下指令。
wget https://repo.spring.io/plugins-release/org/pentaho/pentaho-aggdesigner-algorithm/5.1.5-jhyde/pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar
# 手動導入jar包到本地倉庫
mvn install:install-file -DgroupId=org.pentaho -DartifactId=pentaho-aggdesigner-algorithm -Dversion=5.1.5-jhyde -Dpackaging=jar -Dfile=pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar
為題2:
org.apache.htrace.fasterxml.jackson.core.type
不存在
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project carbondata-processing: Compilation failure: Compilation failure:
[ERROR] /root/apache/carbondata/processing/src/main/java/org/apache/carbondata/processing/loading/parser/impl/JsonRowParser.java:[34,53] package org.apache.htrace.fasterxml.jackson.core.type does not exist
[ERROR] /root/apache/carbondata/processing/src/main/java/org/apache/carbondata/processing/loading/parser/impl/JsonRowParser.java:[35,52] package org.apache.htrace.fasterxml.jackson.databind does not exist
[ERROR] /root/apache/carbondata/processing/src/main/java/org/apache/carbondata/processing/loading/parser/impl/JsonRowParser.java:[55,5] cannot find symbol
[ERROR] symbol: class ObjectMapper
[ERROR] location: class org.apache.carbondata.processing.loading.parser.impl.JsonRowParser
[ERROR] /root/apache/carbondata/processing/src/main/java/org/apache/carbondata/processing/loading/parser/impl/JsonRowParser.java:[55,37] cannot find symbol
[ERROR] symbol: class ObjectMapper
[ERROR] location: class org.apache.carbondata.processing.loading.parser.impl.JsonRowParser
[ERROR] /root/apache/carbondata/carbondata3/processing/src/main/java/org/apache/carbondata/processing/loading/parser/impl/JsonRowParser.java:[58,50] cannot find symbol
[ERROR] symbol: class TypeReference
[ERROR] location: class org.apache.carbondata.processing.loading.parser.impl.JsonRowParser
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <goals> -rf :carbondata-processing
分析。可以看到源碼中processing子產品中使用的對象不存在,通過源碼分析,報錯的部分引用的包來自于
htrace-core
依賴,而這個包有繼承自
hadoop-hdfs
。我的的Hadoop的版本從2.7改為了
3.1.2
其中的
htrace-core
依賴
也發生了改變,是以檢視這個依賴的代碼,發現
TypeReference
的包名由
org.apache.htrace.fasterxml.jackson.core.type.TypeReference
改為了
org.apache.htrace.shaded.fasterxml.jackson.core.type.TypeReference
、
ObjectMapper
的包名由
import org.apache.htrace.fasterxml.jackson.databind.ObjectMapper
改為了
org.apache.htrace.shaded.fasterxml.jackson.databind.ObjectMapper
。
解決。 是以我們将
processing/src/main/java/org/apache/carbondata/processing/loading/parser/impl/JsonRowParser.java
代碼中注釋掉第34、35行,導入新的包名,如下:
34 //import org.apache.htrace.fasterxml.jackson.core.type.TypeReference;
35 //import org.apache.htrace.fasterxml.jackson.databind.ObjectMapper;
36 import org.apache.htrace.shaded.fasterxml.jackson.core.type.TypeReference;
37 import org.apache.htrace.shaded.fasterxml.jackson.databind.ObjectMapper;
問題3:
findbugs-maven-plugin
檢查項目時有一個Bug
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:findbugs-maven-plugin:3.0.4:check (analyze-compile) on project carbondata-core: failed with 1 bugs and 0 errors -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <goals> -rf :carbondata-core
解決(第①步):通過IDEA工具打開源碼發現項目中
maven-duplicate-finder-plugin
的版本無法識别,是以進行如下修改,将報錯的如下四個子產品的pom檔案中的此插件添加上版本資訊
-
第204行examples/spark2/pom.xml
-
第132行datamap/mv/core/pom.xml
-
第126行datamap/mv/plan/pom.xml
-
第637行integration/presto/pom.xml
<plugin>
<groupId>com.ning.maven.plugins</groupId>
<artifactId>maven-duplicate-finder-plugin</artifactId>
<!-- 這裡添加上版本,1.0.9 -->
<version>1.0.9</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
解決(第②步):因為我們修改了Spark和Hadoop的版本,這裡就不進行嚴格的分析工作,是以分析工作的等級。
修改父級pom檔案,大概在390多行,添加如下設定。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.4</version>
<configuration>
<!-- 設定分析工作的等級,可以為Min、Default和Max -->
<effort>Low</effort>
<!-- Low、Medium和High (Low最嚴格) -->
<threshold>High</threshold>
<excludeFilterFile>${dev.path}/findbugs-exclude.xml</excludeFilterFile>
<failOnError>true</failOnError>
<findbugsXmlOutput>true</findbugsXmlOutput>
<xmlOutput>true</xmlOutput>
<effort>Max</effort>
</configuration>
<executions>
<execution>
<id>analyze-compile</id>
<phase>compile</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
編譯成功。上面的問題解決後,再次編譯,編譯成功後顯示如下資訊:
[INFO] Reactor Summary for Apache CarbonData :: Parent 1.6.0:
[INFO]
[INFO] Apache CarbonData :: Parent ........................ SUCCESS [ 2.343 s]
[INFO] Apache CarbonData :: Common ........................ SUCCESS [ 8.144 s]
[INFO] Apache CarbonData :: Core .......................... SUCCESS [ 35.548 s]
[INFO] Apache CarbonData :: Processing .................... SUCCESS [ 16.732 s]
[INFO] Apache CarbonData :: Hadoop ........................ SUCCESS [ 8.838 s]
[INFO] Apache CarbonData :: Hive .......................... SUCCESS [ 36.953 s]
[INFO] Apache CarbonData :: Streaming ..................... SUCCESS [ 20.272 s]
[INFO] Apache CarbonData :: Store SDK ..................... SUCCESS [01:11 min]
[INFO] Apache CarbonData :: Spark Datasource .............. SUCCESS [ 41.440 s]
[INFO] Apache CarbonData :: Spark Common .................. SUCCESS [01:05 min]
[INFO] Apache CarbonData :: CLI ........................... SUCCESS [ 33.643 s]
[INFO] Apache CarbonData :: Lucene Index DataMap .......... SUCCESS [ 9.463 s]
[INFO] Apache CarbonData :: Bloom Index DataMap ........... SUCCESS [ 7.759 s]
[INFO] Apache CarbonData :: Spark2 ........................ SUCCESS [01:46 min]
[INFO] Apache CarbonData :: Spark Common Test ............. SUCCESS [ 57.039 s]
[INFO] Apache CarbonData :: DataMap Examples .............. SUCCESS [ 2.454 s]
[INFO] Apache CarbonData :: Materialized View Plan ........ SUCCESS [ 40.615 s]
[INFO] Apache CarbonData :: Materialized View Core ........ SUCCESS [ 40.122 s]
[INFO] Apache CarbonData :: Assembly ...................... SUCCESS [ 31.297 s]
[INFO] Apache CarbonData :: Examples ...................... SUCCESS [ 30.754 s]
[INFO] Apache CarbonData :: presto ........................ SUCCESS [ 44.017 s]
[INFO] Apache CarbonData :: Flink Examples ................ SUCCESS [ 3.032 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:54 min
[INFO] Finished at: 2019-09-15T10:19:59+08:00
[INFO] ------------------------------------------------------------------------
2.3 和Spark內建
下載下傳安裝Spark 2.3.2,最好下載下傳帶Hadoop的tgz包。可以Standalone模式搭建。安裝部分可以參考官網文檔Spark Standalone Mode
- 将上一步下載下傳獲得的
放置到apache-carbondata-1.6.0-bin-spark2.3.2-hadoop2.7.2.jar
(carbonlib檔案夾需要手動建立)下。$SPARK_HOME/carbonlib
- 在Spark類路徑中添加carbonlib檔案夾路徑
# $SPARK_HOME/conf/spark-env.sh,配置或添加
SPARK_CLASSPATH=$SPARK_HOME/carbonlib/*
- 複制GitHub對應版本的配置檔案carbon.properties.template 到檔案
夾并将檔案重命名為$SPARK_HOME/conf/
。carbon.properties
- 将上面幾步添加的包和配置檔案同樣的方式複制到Spark其它節點上
- 在Spark節點master節點中,配置
檔案中下表中提到的屬性$SPARK_HOME/conf/spark-defaults.conf
#CarbonData配置項
## 要傳遞給驅動程式的一串額外JVM選項。例如,GC設定或其他日志記錄。
spark.driver.extraJavaOptions -Dcarbon.properties.filepath=$SPARK_HOME/conf/carbon.properties
## 要傳遞給執行程式的一串額外JVM選項。例如,GC設定或其他日志記錄。注意:您可以輸入以空格分隔的多個值。
spark.executor.extraJavaOptions -Dcarbon.properties.filepath=$SPARK_HOME/conf/carbon.properties
- 在
檔案中添加以下屬性:$SPARK_HOME/conf/carbon.properties
carbon.storelocation=hdfs://cdh6:8020/app/CarbonStore
2.4 先決條件
- 安裝并運作Hadoop HDFS和YARN
- 運作Spark
- CarbonData使用者有權限通路HDFS
2.5 準備資料
$SPARK_HOME的檔案結構如下(carbonlib為自己建立的)
[[email protected] spark-2.3.2-bin-hadoop2.7]# tree -C -L 1 ./
./
├── bin
├── carbonlib
├── conf
├── data
├── examples
├── jars
├── kubernetes
├── LICENSE
├── licenses
├── logs
├── NOTICE
├── pids
├── python
├── R
├── README.md
├── RELEASE
├── sample.csv
├── sbin
├── work
└── yarn
15 directories, 5 files
在上面的目錄下寫入資料到 sample.csv:
# 例如在$SPARK_HOME(/opt/spark-2.3.2-bin-hadoop2.7)下
cat > sample.csv << EOF
id,name,city,age
1,david,shenzhen,31
2,eason,shenzhen,27
3,jarry,wuhan,35
EOF
然後将資料上傳到HDFS的
/home/carbondata/
下
hadoop fs -mkdir -p /home/carbondata
hadoop fs -put sample.csv /home/carbondata/
3 使用
重新開機Spark,然後執行:
$SPARK_HOME/bin/spark-shell \
--master spark://cdh6:7077 \
--total-executor-cores 2 \
--executor-memory 2G \
--jars file:///$SPARK_HOME/carbonlib/apache-carbondata-1.6.0-bin-spark2.3.2-hadoop2.7.2.jar
在
spark-shell
中執行:
# 1 導入如下包
scala> import org.apache.spark.sql.SparkSession
scala> import org.apache.spark.sql.CarbonSession._
# 2 建立 CarbonSession
scala> val carbon = SparkSession.builder().config(sc.getConf).getOrCreateCarbonSession("hdfs://cdh6:8020/carbon/data/store")
# 3 建立表。這一步會在上面getOrCreateCarbonSession指定HDFS路徑/carbon/data/store建立出來
# 注意這裡STORED AS carbondata,存儲格式使用 carbondata
scala> carbon.sql(
s"""
| CREATE TABLE IF NOT EXISTS test_table(
| id string,
| name string,
| city string,
| age Int)
| STORED AS carbondata
""".stripMargin)
# 4 檢視表。不僅可以看到我們剛建立出來的表test_table,還可以看到Hive表依然可以檢視到
scala> carbon.sql("SHOW TABLES").show()
+--------+----------+-----------+
|database| tableName|isTemporary|
+--------+----------+-----------+
| default| movie| false|
| default| person| false|
| default|test_table| false|
+--------+----------+-----------+
# 5 加載資料
scala> carbon.sql("LOAD DATA INPATH '/home/carbondata/sample.csv' INTO TABLE test_table")
# 6 查詢表資料
scala> carbon.sql("SELECT * FROM test_table").show()
+---+-----+--------+---+
| id| name| city|age|
+---+-----+--------+---+
| 1|david|shenzhen| 31|
| 2|eason|shenzhen| 27|
| 3|jarry| wuhan| 35|
+---+-----+--------+---+
# 7 統計相同城市的平均年齡
scala> carbon.sql(
s"""
| SELECT city, avg(age), sum(age)
| FROM test_table
| GROUP BY city
""".stripMargin).show()
+--------+--------+--------+
| city|avg(age)|sum(age)|
+--------+--------+--------+
| wuhan| 35.0| 35|
|shenzhen| 29.0| 58|
+--------+--------+--------+
# 8 插入一條資料。show()是一個執行算子,僅用作執行這個sql(一個Job)
scala> carbon.sql(
s"""
| INSERT INTO test_table VALUES("4", "Yore", "BeiJin", 20)
""".stripMargin).show()
## 再次查詢資料,可以看到資料已經插入到表中。
scala> carbon.sql("SELECT * FROM test_table").show()
+---+-------+--------+---+
| id| name| city|age|
+---+-------+--------+---+
| 1| david|shenzhen| 31|
| 2| eason|shenzhen| 27|
| 3| jarry| wuhan| 35|
| 4| Yore| BeiJin| 20|
+---+-------+--------+---+
# 9 修改一條資料
scala> carbon.sql(
s"""
| UPDATE test_table SET (age)=(18) WHERE id='4'
""".stripMargin).show()
## 再次查詢資料,可以看id為4的年齡已經更改為18歲啦。
scala> carbon.sql("SELECT * FROM test_table").show()
+---+-------+--------+---+
| id| name| city|age|
+---+-------+--------+---+
| 1| david|shenzhen| 31|
| 2| eason|shenzhen| 27|
| 3| jarry| wuhan| 35|
| 4| Yore| BeiJin| 18|
+---+-------+--------+---+
# 删除一條資料
scala> carbon.sql(
s"""
| DELETE FROM test_table WHERE id='2'
""".stripMargin).show()
## 再次查詢資料,可以看id為1的那條資料已經被删除。
scala> carbon.sql("SELECT * FROM test_table").show()
+---+-------+--------+---+
| id| name| city|age|
+---+-------+--------+---+
| 2| eason|shenzhen| 27|
| 3| jarry| wuhan| 35|
| 4| Yore| BeiJin| 18|
+---+-------+--------+---+
推薦一個官方文檔的一個PDF資料:CarbonData Spark Integration And Carbon Query Flow