//step1 下载spark,我官网下载的spark2.4.4 hadoop2.7.3预编译版本 解压即可以使用
//这里需要注意一点,我本机安装了最新的openjdk13,执行sparksql的时候报错,
//解决方法修改spark-env.sh 更新JAVA_HOME=/PATH/TO/JDK8 后解决问题
//step2 使用docker 搭建自有的s3环境
docker run -p 9000:9000 --name minio1
-e "MINIO_ACCESS_KEY=minio"
-e "MINIO_SECRET_KEY=minio123"
-v /Users/student2020/data/minio/data/:/data
minio/minio server /data
//step3
//登录localhost:9000 输入minio/minion123进去,点击右下角的加号创建一个bucket名字为test
//后面备用,测试生成的数据放在test桶中
//step4 使用sparkshell 测试生成数据 重写数据 压缩数据 清理数据的全过程
//因为我本机下载的是spark2.4hadoop2.7.3预编译版本,所以下面配置hadoop-aws:2.7.3
//本机已经在/etc/profile中添加了SPARK_HOME,所以可以直接执行下面命令,否则请进入SPARK_HOME/bin
//目录下执行
spark-shell
--packages io.delta:delta-core_2.11:0.5.0,org.apache.hadoop:hadoop-aws:2.7.3
--conf spark.delta.logStore.class=org.apache.spark.sql.delta.storage.S3SingleDriverLogStore
--conf spark.hadoop.fs.s3a.access.key=minio
--conf spark.hadoop.fs.s3a.secret.key=minio123
--conf spark.hadoop.fs.s3a.endpoint=127.0.0.1:9000
--conf spark.hadoop.fs.s3a.connection.ssl.enabled=false
//因为自己搭建的minio没有启用安全认证 没使用ssl,所以最后一项需要配置好,否则执行会报错
//测试写入一些数据到s3中
//以下代码直接贴入到spark-shell窗口中回车等待即可
spark.range(500).write.format("delta").save("s3a://test/df001/")
spark.range(1500).write.format("delta").mode("overwrite").save("s3a://test/df001/")
spark.range(11500).write.format("delta").mode("overwrite").save("s3a://test/df001/")
//经过几次写入,发现文件夹s3a://test/df001/下面有数十个文件
//小文件过多是个问题,会对文件系统和查询的性能造成不良影响
/*压缩数据 根据delta lake官方文档推荐的最佳实践 */
val path="s3a://test/df001/"
spark.read
.format("delta")
.load(path)
.repartition(5)
.write
.option("dataChange", "false")
.format("delta")
.mode("overwrite")
.save(path)
//清理过期的过数 或删除过多的小文件
import io.delta.tables._
val deltaTable = DeltaTable.forPath(spark,path)
//保证在执行此操作的时候,没有insert|update|delete|optimize等操作,否则delta table数据会受损
//设置下面的配置为false,否则执行报错
spark.conf.set("spark.databricks.delta.retentionDurationCheck.enabled", false)
//默认清除的是168小时之前的数据 即7*24小时之前的数据,这里测试的时候,短时间内多项操作,保留六分钟之内写入的数据
deltaTable.vacuum(0.1)
//再次检查 s3a://test/df001/ 下面的目录 ,变成了五个