安装部署Carbondata
方式一:下载官网CarbonData website现有的jar包
wget https://dist.apache.org/repos/dist/release/carbondata/2.2.0/apache-carbondata-2.2.0-bin-spark3.1.1-hadoop2.7.2.jar
方式二:按Building CarbonData 编译部署
前置条件
- Unix-like environment (Linux, Mac OS X)
- Git
- Apache Maven (Recommend version 3.3 or later)
- Oracle Java 8
- Apache Thrift 0.9.3
下载carbondata
git clone git@github.com:apache/carbondata.git
maven 编译打包
carbondata-parent-2.2.0$ mvn -DskipTests -Pspark-3.1 clean package
【注】打包过程会缺少相关依赖报错,按提示信息添加依赖至 pom.xml 即可
Yarn集群的Spark配置Carbondata
- 创建 $SPARK_HOME/carbonlib。
- 复制 ./assembly/target/scala-2.11apache-carbondata-2.2.0-bin-spark3.1.1-hadoop2.7.2.jar 到 $SPARK_HOME/carbonlib 目录。
将 ./conf/carbon.properties.template 复制到 $SPARK_HOME/conf/ 目录下并重命名为 carbon.properties。
- 压缩 carbonlib 文件生成 carbonlib.tar.gz 文件并将其移动到 carbonlib 文件夹中。
在 $SPARK_HOME/conf/spark-defaults.conf 文件中配置属性。
【注】spark.master 和spark.eventLog.dir 使用自己的配置
shell# Example: spark.master spark://ubuntu:7077 spark.yarn.dist.files /usr/local/spark/conf/carbon.properties spark.yarn.dist.archives /usr/local/spark/carbonlib/carbondata.tar.gz spark.executor.extraJavaOptions -Dcarbon.properties.filepath=carbon.properties spark.executor.extraClassPath carbondata.tar.gz/carbonlib/* spark.driver.extraClassPath /usr/local/spark/carbonlib/* spark.driver.extraJavaOptions -Dcarbon.properties.filepath=$SPARK_HOME/conf/carbon.properties # spark.eventLog.enabled true spark.eventLog.enabled true spark.eventLog.dir hdfs://localhost:9000/directory # spark.serializer org.apache.spark.serializer.KryoSerializer # spark.driver.memory 5g # spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three" spark.yarn.historyServer.address=localhost:7777 spark.history.ui.port=7777
5、验证安装
shell./bin/spark-shell \ --master yarn-client \ --driver-memory 1G \ --executor-memory 2G \ --executor-cores 2
【注】在PATH中配置了spark的bin目录后,在任意目录下可以使用spark shell等命令
Spark shell使用carbondata
# 1、使用自己编译打包的jar包 spark-shell --conf spark.sql.extensions=org.apache.spark.sql.CarbonExtensions --jars /usr/local/carbondata-parent-2.1.0/assembly/target/scala-2.11/apache-carbondata-2.1.0-bin-spark2.4.5-hadoop2.7.2.jar #2、使用官方的jar包 spark-shell --conf spark.sql.extensions=org.apache.spark.sql.CarbonExtensions --jars /usr/local/spark/carbonlib/apache-carbondata-2.1.0-bin-spark2.4.5-hadoop2.7.2.jar #两者选其一即可
【注】进入spark-shell后,由于没配置carbondata的相关变量,系统会自动在启动spark-shell的目录下创建derby.log和metastore_db.
进入Spark shell后可看到提示信息:spark shell 已经生成 Spark Context`对象 `sc`和Spark Session对象 `spark `
Spark context available as 'sc' (master = spark://ubuntu:7077, app id = app-20210804221314-0000). Spark session available as 'spark'.
如果想创建新的`SparkSession`对象可以进行如下操作:
#导入SparkSession包 import org.apache.spark.sql.SparkSession #Spark shell已经创建了一个SparkSession对象`spark`,避免warn出现,先关闭该对象再重新创建。 spark.stop() #创建新的SparkSession对象 val newSpark:SparkSession = SparkSession.builder().config(sc.getConf).enableHiveSupport.config("spark.sql.extensions","org.apache.spark.sql.CarbonExtensions").getOrCreate()
创建carbondata表
#使用内置的SparkSession对象`spark` spark.sql( s""" | CREATE TABLE IF NOT EXISTS cwikitest_table( | id string, | name string, | city string, | age Int) | STORED AS carbondata """.stripMargin) spark.sql( s""" | CREATE TABLE IF NOT EXISTS cwikitest_table( | id string, | name string, | city string, | age Int) | USING carbondata """.stripMargin)
【注1】spark里面用USING 代表的是spark datasource表;用STORED AS代表的是hive格式表。
【注2】同理会在启动spark-shell目录下创建spark-warehouse文件,该目录下会创建与cwikitest_table表名字相同的目录文件
carbondata表加载数据
# 加载本地文件数据 spark.sql("LOAD DATA INPATH 'file:///home/chen/carbondata/sample.csv' INTO TABLE cwikitest_table") # 加载hdfs文件数据 spark.sql("LOAD DATA INPATH 'hdfs://localhost:9000/user/chen/carbondata/sample.csv' INTO TABLE cwikitest_table") #默认是hdfs的路径 spark.sql("LOAD DATA INPATH '/user/chen/carbondata/sample.csv' INTO TABLE cwikitest_table")
【注】由于默认路径是hdfs加载本地路径时添加file://,另外如果是在集群中加载本地文件要确保每个节点的本地文件路径中有该文件。
执行查询语句
spark.sql("SELECT * FROM cwikitest_table").show() spark.sql( s""" | SELECT city, avg(age), sum(age) | FROM cwikitest_table | GROUP BY city """.stripMargin).show()