天天看點

CarbonData安裝和使用1 概述2 安裝3 使用

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

,如果沒有則需要安裝:

  1. 安裝依賴
yum -y install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel openssl-devel
           
  1. 安裝 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。

CarbonData安裝和使用1 概述2 安裝3 使用

和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

CarbonData安裝和使用1 概述2 安裝3 使用

解決。 是以我們将

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檔案中的此插件添加上版本資訊

  • examples/spark2/pom.xml

    第204行
  • datamap/mv/core/pom.xml

    第132行
  • datamap/mv/plan/pom.xml

    第126行
  • integration/presto/pom.xml

    第637行
<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

    放置到

    $SPARK_HOME/carbonlib

    (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