写Spark代码的时候经常会遇到一些问题,然后在网上找的例子不全而且偶尔还会出现一些问题,且Spark发展迅速,各个版本的语法都存在一定的差异。经常找到的demo都是不对的,拷贝执行会遇到意想不到的问题。
于是转而查看Spark官网,接下来我们简单的看看如何查询官网。
进入Spark官网:
https://spark.apache.org/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MvxuduE1-1655341289963)(https://upload-images.jianshu.io/upload_images/2638478-23512012694d3d74.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZ3Aq5AE-1655341289965)(https://upload-images.jianshu.io/upload_images/2638478-cbbde1ed232cf453.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
选择 Programing Guides->Quick Start
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTE0fZKg-1655341289966)(https://upload-images.jianshu.io/upload_images/2638478-6cb920e1ab2c7e7b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
对应的编程语言我们选择Python
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JkzAgFyz-1655341289967)(https://upload-images.jianshu.io/upload_images/2638478-0ee06044bd0ff031.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
可以看到,如果使用Python操作Spark,我们一般是直接运行pyspark命令即可。
Python开发Spark的过程中,我们使用最多的就是Spark SQL和DataFrames。
选择 Programing Guides->SQL,DataFrames,and Datasets
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxVhgrZ4-1655341289967)(https://upload-images.jianshu.io/upload_images/2638478-50d6fe7859237f1f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
选择左边的 Getting Started
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bt2XaEI1-1655341289968)(https://upload-images.jianshu.io/upload_images/2638478-484de6fa3081c80e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
SparkSession是所有Spark程序的开始
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6PDo1z9-1655341289969)(https://upload-images.jianshu.io/upload_images/2638478-30323dea60d49919.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
创建DataFrame非常简单,Spark从支持的数据源读取的数据就是DataFrame类型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x41W7JRM-1655341289970)(https://upload-images.jianshu.io/upload_images/2638478-ee4940685094f3d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
将上一步读取到的数据的DataFrame转换为一个临时视图后,我们就可以用SQL语句愉快的操作Spark程序了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaPKhRQy-1655341289971)(https://upload-images.jianshu.io/upload_images/2638478-6ac4407b7d3daec6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
选择Data Sources
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jcKBSaie-1655341289971)(https://upload-images.jianshu.io/upload_images/2638478-863aa849e32b5e01.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
Spark支持的数据源
我们从下图可以看到,Spark支持的数据源包括:
Parquet Files
Orc Files
Json Files
Hive Tables
Jdbc
Avro Files
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7Ca3b83-1655341289971)(https://upload-images.jianshu.io/upload_images/2638478-8b7c0af82dd64b97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
虽然上面没有写出读写CSV,其实Spark是支持读写CSV
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQ6nCNTa-1655341289972)(https://upload-images.jianshu.io/upload_images/2638478-f3d463492876be21.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
读csv文件:
df = spark.read.load("examples/src/main/resources/people.csv",
format="csv", sep=":", inferSchema="true", header="true")
写csv文件:
coalesce(1)表示只写一个文件
save 表示目标文件夹的位置
df3.coalesce(1).write.format("csv").options(header='true', inferschema='true').save("hdfs://hp1:8020/user/juzhen")
读写Hive表是我们实际开发过程中经常使用到的。
一般集群的spark配置默认可以访问hive的元数据,所以spark读写hive是非常的简单。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZL7mknn-1655341289972)(https://upload-images.jianshu.io/upload_images/2638478-5e94853719f1f9ae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
读取hive表:
df = spark.sql("SELECT * FROM src")
** 写入hive表:**
spark.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) USING hive")
spark.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")
Spark读写MySQL在实际开发过程中,使用的也表多
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fmLPGGVk-1655341289976)(https://upload-images.jianshu.io/upload_images/2638478-e48c12db3f01e835.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
读MySQL数据:
df1=spark.read.format("jdbc").options(url="jdbc:mysql://host:port/databasename",
driver="com.mysql.jdbc.Driver",
dbtable="(SELECT * FROM tablename) tmp",
user="root",
password="yourpassword").load()
写MySQL数据
df1.write.format("jdbc").options(url="jdbc:mysql://host:port/databasename",
driver="com.mysql.jdbc.Driver",
dbtable="tablename",
user="root",
password="yourpassword").mode('append').save()
保存操作可以选择使用SaveMode,该SaveMode指定如何处理现有数据(如果存在)。重要的是要认识到,这些保存模式不使用任何锁定,而且不是原子的。另外,当执行Overwrite时,数据将在写入新数据之前被删除。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTQitWSS-1655341289977)(https://upload-images.jianshu.io/upload_images/2638478-6d5a70965e306046.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
https://spark.apache.org/docs/2.4.0/sql-performance-tuning.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-so1B1S45-1655341289977)(https://upload-images.jianshu.io/upload_images/2638478-85cd07b4dd0bb09e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
Spark SQL可以通过调用Spark.catalogs.cachetable (“tableName”)或dataFrame.cache()来使用内存中的柱状格式缓存表。然后,Spark SQL将只扫描所需的列,并自动调优压缩,以最小化内存使用和GC压力。你可以调用spark.catalog.uncacheTable(“tableName”)来从内存中删除这个表。
内存缓存的配置可以通过SparkSession上的setConf方法或使用SQL运行SET key=value命令来完成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHsaE8N3-1655341289978)(https://upload-images.jianshu.io/upload_images/2638478-2b0a4aa1dbb9b2be.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
以下选项还可用于调优查询执行的性能。这些选项有可能在未来的版本中被弃用,因为会自动执行更多的优化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rrqbYU6y-1655341289978)(https://upload-images.jianshu.io/upload_images/2638478-61bcf04c8c6a14b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
BROADCAST提示指导Spark在将指定的表与其他表或视图连接时广播指定的表。当Spark决定连接方法时,广播哈希连接(即BHJ)是首选的,即使统计值高于配置Spark.sql.autobroadcastjointhreshold。当连接的两端都指定时,Spark会广播统计信息较低的一端。注意Spark不保证总是选择BHJ,因为不是所有情况(例如完全外连接)都支持BHJ。当选择广播嵌套循环连接时,我们仍然尊重提示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HaAcV1Zu-1655341289979)(https://upload-images.jianshu.io/upload_images/2638478-958350099a6e2323.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
https://spark.apache.org/docs/2.4.0/sql-distributed-sql-engine.html
Spark SQL还可以使用它的JDBC/ODBC或命令行接口充当分布式查询引擎。在这种模式下,终端用户或应用程序可以直接与Spark SQL交互,运行SQL查询,而不需要编写任何代码。
这里实现的Thrift JDBC/ODBC服务器对应于Hive 1.2.1中的HiveServer2。您可以使用Spark或Hive 1.2.1附带的beeline脚本来测试JDBC服务器。
在Spark目录下执行如下命令启动JDBC/ODBC服务器。
./sbin/start-thriftserver.sh
这个脚本接受所有bin/spark-submit命令行选项,外加一个——hiveconf选项来指定Hive属性。您可以运行./sbin/start-thriftserver.sh——help获取所有可用选项的完整列表。默认情况下,服务器监听localhost:10000。你可以通过环境变量重写这个行为,例如:
export HIVE_SERVER2_THRIFT_PORT=
export HIVE_SERVER2_THRIFT_BIND_HOST=
./sbin/start-thriftserver.sh \
--master \
...
或系统配置:
./sbin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port= \
--hiveconf hive.server2.thrift.bind.host= \
--master
...
现在你可以使用beeline来测试Thrift JDBC/ODBC服务器:
./bin/beeline
直接连接JDBC/ODBC服务器:
beeline> !connect jdbc:hive2://localhost:10000
Beeline会要求你输入用户名和密码。在非安全模式下,只需在计算机上输入用户名和空白密码。为了安全模式,请遵循beeline文件中给出的说明。
Hive的配置是通过把你的Hive -site.xml, core-site.xml和hdfs-site.xml文件放在conf/中完成的。
你也可以使用Hive自带的直线脚本。
Thrift JDBC服务器还支持通过HTTP传输发送Thrift RPC消息。在系统属性或conf/的hive-site.xml文件中使用如下设置启用HTTP模式:
hive.server2.transport.mode - Set this to value: http
hive.server2.thrift.http.port - HTTP port number to listen on; default is 10001
hive.server2.http.endpoint - HTTP endpoint; default is cliservice
为了测试,使用beeline以http模式连接JDBC/ODBC服务器:
beeline> !connect jdbc:hive2://:/?hive.server2.transport.mode=http;hive.server2.thrift.http.path=
Spark SQL CLI是一个方便的本地运行Hive metastore服务的工具,用于执行命令行输入的查询。注意Spark SQL CLI不能与Thrift JDBC服务器通信。
在Spark目录下执行如下命令启动Spark SQL命令行:
./bin/spark-sql
Hive的配置是通过把你的Hive -site.xml, core-site.xml和hdfs-site.xml文件放在conf/中完成的。您可以运行./bin/spark-sql——help获取所有可用选项的完整列表。