在Kubernetes中使用Spark
Spark官方的Kubernetes部署文档感觉很复杂,不能快速上手。
通过不断尝试,实现了K8S上安装Spark,然后将Cassandra的数据导入到Postgres数据中,过程记录如下:
安装Spark#
helm install test-spark bitnami/spark
bitnami spark 默认会安装1个 master,2个 worker
按照文档的说法,安装后可以通过 spark-submit 程序直接连接 K8S 提交应用,不过更简单的方式是登录到 master 上用 master 的 spark-submit 程序提交应用。
测试 Spark Shell#
如果想要使用 Spark Shell,可以直接登录到 Spark master 上使用:
kubectl exec -it test-spark-master-0 bash
使用上面的命令登录后,直接输入:spark-shell 就可以了
简单的pyspark程序#
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("SimpleApp").getOrCreate()
spark.conf.set("spark.sql.catalog.myCatalog", "com.datastax.spark.connector.datasource.CassandraCatalog")
cassandra_table = spark.read.table("myCatalog.cassandra_keyspace.cassandra_table_name")
cassandra_table.write.mode("append") \
.format("jdbc") \
.option("url", "jdbc:postgresql://server_host/db_name") \
.option("dbtable", "schema_name.pg_table_name") \
.option("user", "db_user") \
.option("password", "db_password") \
.option("driver", "org.postgresql.Driver") \
.save()
spark.stop()
虽说是简单的程序,但还是需要说明一下:程序先启动 SparkSession,然后配置 Cassandra 数据源,再读取 Cassandra 一个表格的数据,最后将数据写入到 Postgresql 的一个表格中。
这里面用到了 Cassandra 和 PostgreSQL 的功能,需要在 submit 时指定对应的包,另外 Cassandra 的认证是在 submit 时提供的。
提交应用#
先将python程序保存到文件,然后拷贝到 spark master 的临时目录中:
kubectl cp hellospark.py test-spark-master-0:/tmp/
然后提交应用,这里使用 kubectl exec 连接到 spark master 的 shell 中执行对应的命令:
kubectl exec -it test-spark-master-0 -- spark-submit --master spark://test-spark-master-svc:7077 \
--conf spark.jars.ivy=/tmp/ivy \
--packages com.datastax.spark:spark-cassandra-connector_2.12:3.1.0,org.postgresql:postgresql:42.3.1 \
--conf spark.sql.extensions=com.datastax.spark.connector.CassandraSparkExtensions \
--conf spark.cassandra.connection.host=cassandra-host \
--conf spark.cassandra.auth.username=cassandra_user \
--conf spark.cassandra.auth.password=cassandra_password \
/tmp/hellospark.py
在 packages 参数中增加了访问 Cassandra 和 Postgresql 的包。
设置 spark.jars.ivy 目录是因为 bitnami spark 的镜像里面默认的目录是没有写权限的,会导致包下载失败。