spark2.3.2+Yarn+Carbondata Thrift Server 配置carbondata1.5

Carbondata简介

Apache Carbondata 是一种新的融合存储解决方案,利用先进的列式存储,索引,压缩和编码技术提高查询效率。

Apache Carbondata 中文文档地址: http://carbondata.iteblog.com

Apache Carbondata 英文文档: http://carbondata.apache.org/

GitHub 源码地址  https://github.com/apache/carbondata/

1.是基于CDH集成Carbondata

安装mysql

https://blog.csdn.net/nszkadrgg/article/details/78666628   tar 包的安装方式

https://blog.csdn.net/nszkadrgg/article/details/85052693   rpm 包的安装方式

https://blog.csdn.net/a774630093/article/details/79270080  yum 的安装方式

安装CDH 

https://blog.csdn.net/nszkadrgg/article/details/80022704    CDH5.10离线安装

2.编译个安装Carbondata基于CDH

https://github.com/apache/carbondata/tree/master/build   Carbondata编译文档

下载Spark2.3.2的版本

https://archive.apache.org/dist/spark/spark-2.3.2/

解压下载好的 Spark2.3.2

下载maven 配置环境变量

配置的环境变量   vim /etc/profile

记得 source /etc/profile  让配置的环境变量生效

maven环境变量是否生效的验证

jdk1.8 环境变量的配置

验证JDK1.8是否安装成功

https://blog.csdn.net/cjf_wei/article/details/78700321    安装thrift 很重要,按照里面的步骤来安装,thrift 选择0.9.3的版本,其他的组件就是文章中写的版本来安装。

Carbondata 编译

下载 Carbondata,选择branch-1.5的分支,然后Clone or download

解压 carbondata包,然后进入目录

编译命令报了如下的错误,然后 mvn clean

然后修改里面的pom.xml文件

<!--add 添加cloudera镜像源-->

    <repository>

       <id>cloudera</id>

       <name>cloudera Repository</name>

       <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>

    </repository>   

删除 然后:wq 保存退出

<presto.jdbc.url>localhost:8086</presto.jdbc.url>

<spark.hadoop.hive.metastore.uris>thrift://localhost:8086</spark.hadoop.hive.metastore.uris>

然后再次进入carbondata目录进行编译。

命令:

mvn clean package -DskipTests -Pspark-2.3 -Dspark.version=2.3.2 -Phadoop-2.8 -Phive -Phive-thriftserver -Pyarn -Dyarn.version=2.6.0-cdh5.15.2 -Dhadoop.version=2.6.0-cdh5.15.2 package -Pbuild-with-format

编译CarbonData,使用Spark 2.3.2,CDH hadoop 2.6:  别人编译通过的

mvn -DskipTests -Pspark-2.3 -Phadoop-2.8 -Pbuild-with-format -Pmv -Dspark.version=2.3.2 -Dhadoop.version=2.6.0-cdh5.15.0 clean package

[WARNING] The requested profile "hive" could not be activated because it does not exist.

[WARNING] The requested profile "hive-thriftserver" could not be activated because it does not exist.

[WARNING] The requested profile "yarn" could not be activated because it does not exist.

[ERROR] Failed to execute goal on project carbondata-examples: Could not resolve dependencies for project org.apache.carbondata:carbondata-examples:jar:1.5.3-SNAPSHOT: Failed to collect dependencies at org.alluxio:alluxio-core-client-hdfs:jar:1.8.1: Failed to read artifact descriptor for org.alluxio:alluxio-core-client-hdfs:jar:1.8.1: Could not transfer artifact org.alluxio:alluxio-core-client-hdfs:pom:1.8.1 from/to alimaven (http://maven.aliyun.com/nexus/content/groups/public/): Timeout while waiting for concurrent download of /opt/repo/org/alluxio/alluxio-core-client-hdfs/1.8.1/alluxio-core-client-hdfs-1.8.1.pom.part to progress -> [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

[INFO] ------------------------------------------------------------------------

[INFO] BUILD FAILURE

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  25:22 min

[INFO] Finished at: 2019-02-23T17:35:21+08:00

[INFO] ------------------------------------------------------------------------

[WARNING] The requested profile "hive" could not be activated because it does not exist.

[WARNING] The requested profile "hive-thriftserver" could not be activated because it does not exist.

[WARNING] The requested profile "yarn" could not be activated because it does not exist.

[ERROR] Failed to execute goal org.scala-tools:maven-scala-plugin:2.15.2:compile (default) on project carbondata-examples: wrap: org.apache.commons.exec.ExecuteException: Process exited with an error: 1(Exit value: 1) -> [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-examples

[root@cdh01 carbondata-branch-1.5]# mvn clean package -DskipTests -Pspark-2.3 -Dspark.version=2.3.2 -Phadoop-2.8 -Phive -Phive-thriftserver -Pyarn -Dyarn.version=2.6.0-cdh5.15.2 -Dhadoop.version=2.6.0-cdh5.15.2 package -Pbuild-with-format

编译成功!

然后找到编译后源码包的位置

[root@cdh01 scala-2.11]#cd  /opt/software/carbondata-branch-1.5/assembly/target/scala-2.11

carbondata的部署

先到spark包的目录

[root@cdh01 software]# cd spark-2.3.2-bin-2.6.0-cdh5.15.2/

新建carbonlib包

[root@cdh01 spark-2.3.2-bin-2.6.0-cdh5.15.2]# mkdir carbonlib

已经编译好的carbondata 放入 carbonlib包中

[root@cdh01 spark-2.3.2-bin-2.6.0-cdh5.15.2]# cd carbonlib/

[root@cdh01 carbonlib]# ll

total 91344

-rw-r--r--. 1 root root 93533271 Feb 26 09:15 apache-carbondata-1.5.3-SNAPSHOT-bin-spark2.3.2-hadoop2.6.0-cdh5.15.2.jar

到spark 的conf 目录,修改参数

[root@cdh01 spark-2.3.2-bin-2.6.0-cdh5.15.2]# cd conf/

[root@cdh01 conf]# ll

total 56

-rw-r--r--. 1 root root 4094 Feb 26 09:22 carbon.properties

-rw-r--r--. 1 root root 4094 Feb 26 09:22 carbon.properties.template

-rw-rw-r--. 1 root root  996 Sep 16 20:13 docker.properties.template

-rw-rw-r--. 1 root root 1105 Sep 16 20:13 fairscheduler.xml.template

-rw-rw-r--. 1 root root 2025 Sep 16 20:13 log4j.properties.template

-rw-rw-r--. 1 root root 7801 Sep 16 20:13 metrics.properties.template

-rw-rw-r--. 1 root root  862 Feb 26 09:30 slaves.template

-rw-r--r--. 1 root root 1292 Feb 26 09:30 spark-defaults.conf

-rw-rw-r--. 1 root root 1292 Sep 16 20:13 spark-defaults.conf.template

-rwxr-xr-x. 1 root root 4298 Feb 26 09:21 spark-env.sh

-rwxrwxr-x. 1 root root 4221 Sep 16 20:13 spark-env.sh.template

复制文件

[root@cdh01 conf]# cp carbon.properties.template carbon.properties

[root@cdh01 conf]# cp spark-defaults.conf.template spark-defaults.conf

[root@cdh01 conf]# cp spark-env.sh.template spark-env.sh

添加主机名  修改后保存退出

[root@cdh01 conf]# vim slaves.template

#

# Licensed to the Apache Software Foundation (ASF) under one or more

# contributor license agreements.  See the NOTICE file distributed with

# this work for additional information regarding copyright ownership.

# The ASF licenses this file to You under the Apache License, Version 2.0

# (the "License"); you may not use this file except in compliance with

# the License.  You may obtain a copy of the License at

#

#    http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS,

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

# See the License for the specific language governing permissions and

# limitations under the License.

# A Spark Worker will be started on each of the machines listed below.

cdh01

[root@cdh01 conf]# vim spark-defaults.conf

添加如下参数

spark.master=yarn-client

spark.yarn.dist.files=/opt/spark-2.3.2-bin-2.6.0-cdh5.15.2/conf/carbon.properties

spark.yarn.dist.archives=/opt/spark-2.3.2-bin-2.6.0-cdh5.15.2/carbonlib/carbondata.tar.gz

spark.executor.extraJavaOptions="-Dcarbon.properties.filepath = carbon.properties"

spark.executor.extraClassPath=carbondata.tar.gz/carbonlib/*

spark.driver.extraClassPath=/opt/spark-2.3.2-bin-2.6.0-cdh5.15.2/carbonlib/*

spark.driver.extraJavaOptions="-Dcarbon.properties.filepath = $SPARK_HOME/conf/carbon.properties"

# 如果你的 CarbonData 实例仅用于查询,你可以在 spark 配置文件设置 spark.speculation = true 属性

spark.speculation = true

# # 这个值可以设置成 executor 核总数的 1 到 2倍。在一个聚合场景里,将这个值从 200 减少到 32,查询时间从 17 秒减少到 9 秒。

# #spark.sql.shuffle.partitions=40

spark.sql.shuffle.partitions=32

# #增加每个spark任务处理的数据量,可以减少spark的任务个数,可以减少文件数

set mapred.min.split.size=1342177280

修改carbon.properties 加入以下参数

[root@cdh01 conf]# vim carbon.properties

carbon.storelocation=hdfs://192.168.1.130:8020/user/hive/warehouse/carbon.store

carbon.task.distribution=merge_small_files

hive 的metadata db(很重要)

是把hive-site.xml 放在编译后的conf文件中吧,这个我漏了写了,是,要从cdh的配置中拷出来,放的位置/opt/spark-2.3.2-bin-2.6.0-cdh5.15.2/conf

修改 spark-env.sh   添加以下环境变量(参数都结合你资源的情况来进行调整)

export SPARK_MASTER_IP=cdh01

export SCALA_HOME=/opt/software/scala-2.11.8

export SPARK_WORKER_MEMORY=3g

export JAVA_HOME=/usr/java/jdk1.8.0_45

export HADOOP_HOME=/opt/cloudera/parcels/CDH-5.15.2-1.cdh5.15.2.p0.3/lib/hadoop

export HADOOP_CONF_DIR=/opt/cloudera/parcels/CDH-5.15.2-1.cdh5.15.2.p0.3/lib/hadoop/etc/hadoop

添加启动脚本

[root@cdh01 hadoop-hdfs]# pwd

/var/lib/hadoop-hdfs

[root@cdh01 hadoop-hdfs]# vim startup.sh

sh /opt/software/spark-2.3.2-bin-2.6.0-cdh5.15.2/bin/spark-submit \

--class org.apache.carbondata.spark.thriftserver.CarbonThriftServer \

--num-executors 2  --driver-memory 3g --executor-memory 6g --executor-cores 2 \

/opt/software/spark-2.3.2-bin-2.6.0-cdh5.15.2/carbonlib/apache-carbondata-1.5.3-SNAPSHOT-bin-spark2.3.2-hadoop2.6.0-cdh5.15.2.jar \

hdfs://192.168.137.130:8020/user/hive/warehouse/carbon.store   #carbondata元数据的位置

以上参数添加完了以后保存

chmod +x  startup.sh  执行了以后变成绿色就可以了

然后启动

[root@cdh01 hadoop-hdfs]# sh startup.sh

报了一下错误,这我们要修改cdh yarn 服务的资源

java.lang.IllegalArgumentException: Required executor memory (6144+614 MB) is above the max threshold (1041 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.

    at org.apache.spark.deploy.yarn.Client.verifyClusterResources(Client.scala:318)

    at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:166)

    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57)

    at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)

    at org.apache.spark.SparkContext.<init>(SparkContext.scala:500)

    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2493)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder$$anonfun$2.apply(CarbonSession.scala:241)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder$$anonfun$2.apply(CarbonSession.scala:233)

    at scala.Option.getOrElse(Option.scala:121)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder.getOrCreateCarbonSession(CarbonSession.scala:233)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder.getOrCreateCarbonSession(CarbonSession.scala:169)

    at org.apache.carbondata.spark.thriftserver.CarbonThriftServer$.main(CarbonThriftServer.scala:74)

    at org.apache.carbondata.spark.thriftserver.CarbonThriftServer.main(CarbonThriftServer.scala)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:497)

    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)

    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)

    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)

    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)

    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)

    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

2019-02-26 13:38:45 INFO  AbstractConnector:318 - Stopped Spark@7d3c09ec{HTTP/1.1,[http/1.1]}{0.0.0.0:4040}

2019-02-26 13:38:45 INFO  SparkUI:54 - Stopped Spark web UI at http://cdh01:4040

2019-02-26 13:38:45 WARN  YarnSchedulerBackend$YarnSchedulerEndpoint:66 - Attempted to request executors before the AM has registered!

2019-02-26 13:38:45 INFO  YarnClientSchedulerBackend:54 - Stopped

2019-02-26 13:38:45 INFO  MapOutputTrackerMasterEndpoint:54 - MapOutputTrackerMasterEndpoint stopped!

2019-02-26 13:38:45 INFO  MemoryStore:54 - MemoryStore cleared

2019-02-26 13:38:45 INFO  BlockManager:54 - BlockManager stopped

2019-02-26 13:38:45 INFO  BlockManagerMaster:54 - BlockManagerMaster stopped

2019-02-26 13:38:45 WARN  MetricsSystem:66 - Stopping a MetricsSystem that is not running

2019-02-26 13:38:45 INFO  OutputCommitCoordinator$OutputCommitCoordinatorEndpoint:54 - OutputCommitCoordinator stopped!

2019-02-26 13:38:45 INFO  SparkContext:54 - Successfully stopped SparkContext

Exception in thread "main" java.lang.IllegalArgumentException: Required executor memory (6144+614 MB) is above the max threshold (1041 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.

    at org.apache.spark.deploy.yarn.Client.verifyClusterResources(Client.scala:318)

    at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:166)

    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57)

    at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)

    at org.apache.spark.SparkContext.<init>(SparkContext.scala:500)

    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2493)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder$$anonfun$2.apply(CarbonSession.scala:241)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder$$anonfun$2.apply(CarbonSession.scala:233)

    at scala.Option.getOrElse(Option.scala:121)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder.getOrCreateCarbonSession(CarbonSession.scala:233)

    at org.apache.spark.sql.CarbonSession$CarbonBuilder.getOrCreateCarbonSession(CarbonSession.scala:169)

    at org.apache.carbondata.spark.thriftserver.CarbonThriftServer$.main(CarbonThriftServer.scala:74)

    at org.apache.carbondata.spark.thriftserver.CarbonThriftServer.main(CarbonThriftServer.scala)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:497)

    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)

    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)

    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)

    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)

    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)

    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

2019-02-26 13:38:45 INFO  ShutdownHookManager:54 - Shutdown hook called

2019-02-26 13:38:45 INFO  ShutdownHookManager:54 - Deleting directory /tmp/spark-3633c790-3350-4aab-a175-d0ee0d3a224a

2019-02-26 13:38:45 INFO  ShutdownHookManager:54 - Deleting directory /tmp/spark-5c91ab1f-a2be-405f-8a00-c48adfa050f9

 

修改hive的端口,hive的端口默认是10000,我们修改20000,carbondata Thrift Server 默认的端口是20000,这样就避免的端口的冲突。


 

点击yarn

选择配置,根据资源的情况我们给我yarn 最大6G,然后保存

修改yarn nodemanager 的内存,然后保存,然后会有提示重新启动yarn的服务,记住下一步的时候那个单选按钮一个要勾上。

然后重启yarn 。

以上是我在我自己电脑的虚拟机上配置的自己的电脑资源小,下来我用公司的电脑进行一下测试。

首先我们启动 carbondata Thrift Server

后台的启动方式nohup ~/startup.sh

查看日志  tail -f 

 

测试机集群的资源,配置的时候我使用我本地的参数安装和编译的,我本地的机器资源小,查询速度不明显。

 启动以后我们在yarn的界面查看任务,在Running中,有一个ApplicationMaster,点击进去。

 

通过beeline的方式连接carbonThriftServer,切换到hdfs用户,如果没有添加hdfs用户,用root用户也行。

连接上了,show database。

创建carbondata的hive表时,我们可以看看官网表的优化机制,可以加快查询速度。

http://carbondata.iteblog.com/data-management-on-carbondata.html   carbondata的中文文档,主要还是以英文文档为主。

在创建表中有一个使用指南。

1.字典编码设置,这个参数是需要你查询结果小于10w条记录的时候推荐使用。

TBLPROPERTIES ('DICTIONARY_INCLUDE'='column1, column2')

 

2.倒排序索引配置,默认情况下,倒排序索引是默认启用的,有可能有助于提高压缩率和查询速度,特别是对除于有利位置的低基数列。建议使用用例,对于高基数列,你可以禁用倒排序索引以提高数据加载性能,使用频率高的字段放在最后。

TBLPROPERTIES ('NO_INVERTED_INDEX'='column1, column3')


TBLPROPERTIES (
'MAJOR_COMPACTION_SIZE'='2048',  # Major compaction 大小可以使用这个参数进行配置。segments 大小总和低于此阈值的将会被合并。此值的单位为 MB
'AUTO_LOAD_MERGE'='true', # 数据加载的时候启用压缩。

'COMPACTION_LEVEL_THRESHOLD'='4,3', #该属性在 minor compaction 时使用,决定要合并多少个 segments。比如:如果将这个属性设置为 2, 3,那么每 2 个 segments 会触发一次 Level 1 的 minor compaction。每 3 个 Level 1 的 compacted segment 将会进一步压缩成新的 segment。
'COMPACTION_PRESERVE_SEGMENTS'='10', # 如果用户想防止一些 segments 被压缩,可以通过设置这个参数。比如 carbon.numberof.preserve.segments = 2,那么 2 个最新的 segments 总是被排除在压缩之外。默认没有 segments 被保留。如果用户想防止一些 segments 被压缩,可以通过设置这个参数。比如 carbon.numberof.preserve.segments = 2,那么 2 个最新的 segments 总是被排除在压缩之外。默认没有 segments 被保留。


'ALLOWED_COMPACTION_DAYS'='5', #压缩属性,在指定的天数内加载的 segment 将被合并。如果配置为 2,仅在 2 天内加载的 segment 被合并,2 天之前的 segment 不会被合并。默认没有被启用
NO_INVERTED_INDEX=' id,name,age',
'SORT_COLUMNS'='id,  #就是使用频率最高的放在最后面,最低的放在最前面,比如where后面的条件。
name,
age
'SORT_SCOPE'='GLOBAL_SORT');

'SORT_SCOPE'='GLOBAL_SORT'这会增加数据的查询性能,特别是高并发查询。如果你特别关心加载资源的隔离时使用,因为系统使用 Spark 的 GroupBy 对数据进行排序,我们可以通过 Spark 来控制资源。

这是我创建表的语句,第二张小表也是一样。

加载数据的方式 (load数据一定要放在hdfs中,在本地load 数据会提示文件不存在)

load data  inpath '/opt/20181201.csv'  into table jwdss.carbon_yw_data_detail_10 partition (driverdate='20181201') OPTIONS('GLOBAL_SORT_PARTITIONS'='2','HEADER'='false');

HEADER'='false' 解释

如果你加载不带文件头的 CSV 文件并且文件头和表的模式一致,这时候你可以在加载数据的 SQL 里面加上 'HEADER'='false',这时候用户就不需要指定文件头。默认情况下这个属性的值是 'true'。 false: CSV 文件不带文件头;true: CSV 文件带文件头。

GLOBAL_SORT_PARTITIONS=2 解释

(GLOBAL_SORT_PARTITIONS'='2')和(GLOBAL_SORT_PARTITIONS'='1')

但是load上传文件大小小于block size时,这个参数是不是就不起作用了

同样的数据量,分区多,文件肯定多。

类似spark中的repartition(4) 这样就有4个分区

也就是说,我将多个小的分区合并成大的分区,我设置成2,就是2个大的分区

比如1G文件,hdfs block size 是128M,那么就有8个分区,此时设置为2,那就会把4个分区的数据合并为1个。

导出数据的方式,(导出成csv文件)

beeline -u jdbc:hive2://192.168.1.100:10000  --showHeader=false --verbose=true --outputformat=csv2 -e "select * from test.test_6 where driverdate='20181201'">>/opt/middle_20181201_.csv

现在查询时间是15秒。

carbondata优化(数据加载完成之后在做一下的优化会生效)

CREATE TABLE 大表(
age STRING,
city STRING,
name STRING,
cost STRING,
earnings STRING)
STORED BY 'carbondata'
row format delimited fields terminated by ','
TBLPROPERTIES (
'MAJOR_COMPACTION_SIZE'='512',
'AUTO_LOAD_MERGE'='true',
'COMPACTION_LEVEL_THRESHOLD'='4,3',
'SORT_COLUMNS'='earnings,cost,name,city,age',
'NO_INVERTED_INDEX'='earnings,cost,name,city,age',
'SORT_SCOPE'='GLOBAL_SORT');

 

CREATE TABLE 小表(
id STRING,
city STRING,
name STRING,
cost STRING,
earnings STRING)
STORED BY 'carbondata'
row format delimited fields terminated by ','
TBLPROPERTIES (
'MAJOR_COMPACTION_SIZE'='512',
'AUTO_LOAD_MERGE'='true',
'COMPACTION_LEVEL_THRESHOLD'='4,3',
'SORT_COLUMNS'='earnings,cost,name,city,id',
'NO_INVERTED_INDEX'='earnings,cost,name,city,id',
'SORT_SCOPE'='GLOBAL_SORT');

以上是建表的优化

加载数据的优化

load data inpath '/opt/1.csv' into table kldss.大表 OPTIONS('GLOBAL_SORT_PARTITIONS'='1','HEADER'='false');

load data inpath '/opt/1.csv' into table kldss.小表 OPTIONS('GLOBAL_SORT_PARTITIONS'='1','HEADER'='false');

创建表完成后,load 数据完成后执行下面三个

show  segments for table  table;     #显示表中的分片  该命令用于获取CarbonData表的段
ALTER TABLE tableCOMPACT 'MAJOR';  #启动手动压缩,压缩会提高查询的速度
clean files for table table;  #删除Compacted 压缩文件

压缩

ALTER TABLE test COMPACT 'MINOR'  (有三种方式,具体的可以看文档)。

在压缩完成之后清理 segments

清理已经压缩的 segments:

CLEAN FILES FOR TABLE   test.test_6;

还有carbondata 支持update和delete

clean files for table xxx    删除数据的时候会产生很多deletedelta文件,会影响删除的速度,可以删除表的deletedelta文件。

locks文件什么时候会自动删除? 无效或被删除的segment lock才会被删除,默认是2天前的好像,在加载数据的时候会产生。

最后我新建了两张表,数据还是不变,看看查询的速度,查询速度不到两秒(大表1700W,小表4000条)

优化前的速度

优化后的查询速度。

还有一种场景,load数据和inset into table partition (date='20101212') select  cloumn from table 的查询速度是一样的,这个我做过测试。

遇到的一些问题


1.carbondata数据加载,要上传到hdfs,本地现在无法加载数据,会报文件找不到
  答:是的现在只能把csv文件上传到hdfs,才可以加载数据到carbondata的表中。

2.添加分区字段
  答:alter table carbon_yw_data_detail_4 if not exists add partition (driverdate='20180808');

3.压缩可以显着地提高查询性能,有三种类型的 Compaction ALTER TABLE [db_name.]table_name COMPACT 'MINOR/MAJOR/CUSTOM'  (具体可以看官网)  
  答:show  segments for table  test;     #显示表中的分片  该命令用于获取CarbonData表的段
     ALTER TABLE test COMPACT 'MAJOR';  #启动手动压缩,压缩会提高查询的速度
     clean files for table test;  #删除Compacted 压缩文件
4.是不是一个segment可以包含多个.carbondata文件?
  答:是的,在hdfs上可以看到,这个是的,可以多个,看node数,分区数,然后会有一个carbonindexmerge文件,这个是该segment的索引文件,一个segment可能会有多个carbondata文件,看配置和加载数据的大小。

5.carbon.compaction.level.threshold=4,3
  答:对多批次导入数据,可以做压缩,这样索引效果会更好。每4个合并一次,每4个合并后的3个再合并一次。
  insert into 50次压缩一次   连续5次在压缩一次 carbon.compaction.level.threshold=50,5
  这个y合并的是x的segment,进行5次x合并后就触发y合并,就是对原始segment达到50时进行x合并,当x的segment达到5时,触发y合并 这么理解对吗,是的。这样理解是吧,没合并前这个segment是level1,合并一次就是level2了,那个3就代表3个level2会进行合并,支持表级别和配置级别。

6.GLOBAL_SORT: 这会增加数据的查询性能,特别是高并发查询。如果你特别关心加载资源的隔离时使用,
  答:因为系统使用 Spark 的 GroupBy 对数据进行排序,我们可以通过 Spark 来控制资源。

7.物化视图,可以优化查询的速度。
  答:使用物理化视图,就是可以把where后面的条件放到dataMap中,然后where条件就不需要全表扫描,具体的类CompactionSupportGlobalSortParameterTest.scala.

8. carbondata数据导出csv文件。
  答:beeline -u jdbc:hive2://192.168.1.100:10000  --showHeader=false --verbose=true --outputformat=csv2 -e "select * from test
   where jwd=1 and driverdate=20181201">>/opt/cs1.csv.

9.carbondata数据导出csv文件,数据要上传hdfs
  答:load data inpath '/opt/20181202.csv'  into overwrite  table test partition (driverdate='20181202') OPTIONS('GLOBAL_SORT_PARTITIONS'='2','HEADER'='false');


10.删除分区的时候,在表中可以删除,show partitions test 是没有已经删除的分区,但是在hdfs中是有的。
  答:clean files for table test; 然后刷新hdfs界面就不会显示已经删除的分区了。
      删除分区的命令 ALTER TABLE test DROP PARTITION (driverdate='20181202')

11.(GLOBAL_SORT_PARTITIONS'='2')和(GLOBAL_SORT_PARTITIONS'='1')
  答:但是load上传文件大小小于block size时,这个参数是不是就不起作用了同样的数据量,分区多,文件肯定多。类似spark中的repartition(4) 这样就有4个分区也就是说,我将多个小的分区合并成大的分区,我设置成2,就是2个大的分区,是的。比如1G文件,hdfs block size 是128M,那么就有8个分区,此时设置为2,那就会把4个分区的数据合并为1个。

12. locks文件什么时候会自动删除?
  答:无效或被删除的segment lock才会被删除,默认是2天前的好像,在加载数据的时候会产生。

13.删除数据的时候会产生deletedelta
  答:clean files for table xxx; 删除表的deletedelta文件

14. carbon.compaction.level.threshold 参数针对的是segment数和分区不分区没有关系
  答:针对的是分割segment,alter table major是根据分割segment size来的,你说的那个4,如果开启自动和,当load第四次后,就会自动把前4个segment compact。

15.是不是一个segment可以包含多个.carbondata文件。
  答:是的一个segment可能会有多个carbondata文件,看配置和加载数据的大小。

16.hive 的metadata db
  答:是把hive-site.xml 放在编译后的conf文件中吧,这个我漏了写了,是,要从cdh的配置中拷出来,放的位置/opt/spark-2.3.2-bin-2.6.0-cdh5.15.2/conf

17.drop partition时,会不会同delete一样产生一些文件
  答:会的

18.clean files 与load 冲突。
  答:不会

19.carbondata 查询union all
  答:这个我测试过两张大表union all 总共8000W条数据查询速度4秒(load 加载数据和inset select 查询的速度是一致的)

20.streaming怎么部署
  答:这个问题我还没有解决。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值