1.配置minio
minio安装
第一步,进入/opt 目录,创建minio文件夹
cd /opt
mkdir minio
第二步,wget下载安装包:
命令 :wget https://dl.minio.io/server/minio/release/linux-amd64/minio
第三步,进入minio文件夹创建log文件
cd /minio
touch minio.log
第四步,赋予minio文件执行权限
chmod 777 minio
第五步,编辑minio
vim /etc/profile
添加
set minio environment
export MINIO_ROOT_USER=fileadmin
export MINIO_ROOT_PASSWORD=fileadmin
生效:source /etc/profile;
第六步,设置minio后台启动(指定端口)
vim start.sh
nohup ./minio server /opt/minio/data --console-address :9090 --address :9001 > /opt/minio/minio.log 2>&1 &
('2>&1’表示现在标准输出直接输入到/opt/minio/minio.log 中,而2>&1是将标准错误重定向到标准输出,‘nohup’和末尾’&'组合使用表示脱离终端后继续执行)
启动start.sh文件 命令: sh start.sh
注:要开放9090和9001端口,可以更改这个端口,然后验证浏览器ip:9090即可 ,如果正常登录进去,账号密码fileadmin
基于zeppelin 配置minio
现在zeppelin 创建%spark.conf
如果当前node是运行的。需要重启
重启后,重新执行环境参数。如果你不想每次那么麻烦,你就设置全局变量
val rdd = sc.textFile("s3a://bat/aa.txt")
rdd.foreach(println)
执行代码后报错:
ava.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2667) at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3431) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3466) at org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:174) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3574) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3521) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:540) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:365) at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:275) at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:244) at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:332) at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:205) at org.apache.spark.rdd.RDD.$anonfun$partitions$2(RDD.scala:300) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.rdd.RDD.partitions(RDD.scala:296) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49)
这个是因为缺少两个包:spark 连接s3,如果有hadoop 可以在hadoop里面改,如果没有,需要加载aws的包。
wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.2.0/hadoop-aws-3.2.0.jar
wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.375/aws-java-sdk-bundle-1.11.375.jar
mv aws-java-sdk-bundle-1.11.375.jar ./jars
mv hadoop-aws-3.2.0.jar ./jars放到spark 的lib下面
在spark 的defalut.xml 配置如下:
spark.hadoop.fs.s3a.access.key=fileadmin
spark.hadoop.fs.s3a.secret.key=fileadmin
spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.endpoint=http://192.168.2.114:9001
折腾一天还是不行,最后用spark-shell
spark-shell \
--packages io.delta:delta-core_2.12:2.2.0,org.apache.hadoop:hadoop-aws:3.2.0 \
--conf spark.delta.logStore.class=org.apache.spark.sql.delta.storage.S3SingleDriverLogStore \
--conf spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider \
--conf spark.hadoop.fs.s3a.access.key=fileadmin \
--conf spark.hadoop.fs.s3a.secret.key=fileadmin \
--conf spark.hadoop.fs.s3a.endpoint=http://192.168.2.114:9001\
--conf spark.hadoop.fs.s3a.connection.ssl.enabled=false
加上 参数:
spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider
不知道这个参数是干嘛的,但是加上就可以了。
delta 的配置:
bin/spark-sql --packages io.delta:delta-core_2.12:2.0.0 --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
针对版本不一样,造成各种问题 ,基于spark 3.2.4 的版本,hadoop-aws:3.3.1 , 要不然就写入不了数据,这个对版本匹配不是很友好,delta 的版本只能是2.0.0
spark-shell \
--packages io.delta:delta-core_2.12:2.0.0,org.apache.hadoop:hadoop-aws:3.3.1 \
--conf spark.delta.logStore.class=org.apache.spark.sql.delta.storage.S3SingleDriverLogStore \
--conf spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider \
--conf spark.hadoop.fs.s3a.access.key=fileadmin \
--conf spark.hadoop.fs.s3a.secret.key=fileadmin \
--conf spark.hadoop.fs.s3a.endpoint=http://192.168.2.114:9001 \
--conf spark.hadoop.fs.s3a.connection.ssl.enabled=false \
--conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
zeppelin 整合minio+delta
接下来在zeppelin 配置,记得spark.conf 需要重新刷新配置
接下来:用spark编辑器,%spark
spark.range(500).write.format("delta").save("s3a://bat/bb")
接下来,通过查询语句:
%spark
spark.read.format("delta").load("s3a://bat/aa").show()
总结:
通过zeppelin 可以实现在minio 对象存储上面进行spark操作,可以操作各种文件,同时也可以支持数据湖delta 的开发,为啥选择delta ,没有选择hudi和iceberg ,原因是hudi 配置太多,目前社区吧hudi做成数据库,脱离了数据湖的概念,bug比较多,iceberg 是开放格式,可以当标准,但是发展比较慢,delta性能优化比较好,并且使用公司比较多,大家都选稳定版本的。