在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 的镜像里面默认的目录是没有写权限的,会导致包下载失败。

comments powered by Disqus