ITPub博客

首页 > 数据库 > 数据库开发技术 > Spark SQL 部署和测试(上)

Spark SQL 部署和测试(上)

原创 数据库开发技术 作者:plvision 时间:2022-05-19 11:34:10 0 删除 编辑

 

简介


大数据离线数仓架构,通常以 HDFS 作为存储层,以 Hive 表为模型进行数据管理,并以 Spark/MR 作为计算引擎,Spark SQL/Hive/Presto 等组件作为查询分析引擎。以此构成一个完整的离线数仓数据处理链路路。
本文主要分享Hadoop 、Hive 和 SparkSQL 部署过程(参考知乎网友的文章部署,参考链接在文末),后面分享在 Spark SQL 上跑 TPC-H 过程以及 Spark SQL 使用特点。

 

Apache Spark

Apache Spark是一种快速的集群计算技术,专为快速计算而设计。它基于Hadoop MapReduce,它扩展了 MapReduce 模型,以有效地将其用于更多类型的计算,包括交互式查询和流处理。Spark 的主要特性是它的内存中集群计算,提高了应用程序的处理速度。
 
下图显示了如何在 Hadoop 上构建 Spark 的三种方式。

 

Spark 部署有三种方式,下面是简单介绍,这里选择第一种部署方式。

  • Standalone - Spark 独立部署意味着 Spark 占据 HDFS(Hadoop分布式文件系统)顶部的位置,并明确为 HDFS 分配空间。这里,Spark 和 MapReduce 将并行运行以覆盖集群上的所有 Spark 作业。

  • Hadoop Yarn - Hadoop Yarn 部署意味着,Spark 只需运行在 Yarn 上,无需任何预安装或根访问。它有助于将 Spark 集成到 Hadoop 生态系统或 Hadoop 堆栈中。它允许其他组件在堆栈顶部运行。

  • Spark in MapReduce (SIMR) - MapReduce 中的 Spark 用于在独立部署之外启动 Spark job 。使用 SIMR,用户可以启动 Spark 并使用其 shell 而无需任何管理访问。

 

Spark 包含的组件如下(不全),这里只部署 Spark SQL 。

  • Apache Spark Core

Spark Core是spark平台的基础通用执行引擎,所有其他功能都是基于。它在外部存储系统中提供内存计算和引用数据集。

  • Spark SQL

Spark SQL是SparkCore之上的一个组件,它引入了一个称为SchemaRDD的新数据抽象,它为结构化和半结构化数据提供支持。

  • Spark Streaming

Spark Streaming 利用 SparkCore 的快速调度功能来执行流式分析。它以小批量获取数据,并对这些小批量的数据执行RDD(弹性分布式数据集)转换。


 



部署


操作系统


  • 修改会话限制

vim /etc/security/limits.conf

* soft nofile 1000000* hard nofile 1000000* soft stack 32768* hard stack 32768


  • 操作系统增加用户 hadoop

useradd hadoop

 

  • SSH 配置

在hadoop用户下,打通到自身的ssh通道。

ssh-keygen -t rsassh-copy-id 192.168.111.188


JDK


直接yum 安装openJDK,版本在1.8.0 以上即可。
yum -y install java-1.8.0-openjdk.x86_64


安装完后,在 profile 文件中配置JAVA环境变量。
vim /etc/profileexport JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64

 

Hadoop


  • 软件下载

Hadoop 选择最新稳定版本 3.3.2。
官方下载地址:https://www.apache.org/dyn/closer.cgi/hadoop/common/


  • 软件安装

解压缩到目录 /opt/apache/ 下
tar zxvf hadoop-3.3.2.tar.gz -C/opt/apache/ln -s /opt/apache/hadoop-3.3.2  /opt/apache/hadoopchown -R hadoop.hadoop /opt/apache/hadoop


  • hadoop 配置

 下面在 hadoop 用户下执行。
配置环境变量。
[hadoop@sfx111188 ~]$ vim ~/.bash_profileexport HADOOP_HOME=/opt/apache/hadoopexport PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbinexport HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop


修改配置文件 $HADOOP_HOME/etc/hadoop/core-site.xml
[hadoop@sfx111188 ~]$ vim core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.111.188:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/apache/hadoop/data</value> </property> <property> <name>dfs.namenode.data.dir</name> <value>file:///${hadoop.tmp.dir}/dfs/sfx111188</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/apache/hadoop/data</value> </property><property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value></property><property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value></property></configuration>


简单说明:
    1. fs.defaultFS 指定 Hadoop 默认访问IP和端口。
    2. hadoop.tmp.dir 指定 Hadoop 临时目录 /opt/apache/hadoop/data,这个目录我建成一个软链接,会指向一个 SSD 目录或者 BCache 目录。
    3. dfs.datanode.data.dir 指向 Hadoop 数据目录 /opt/apache/hadoop/data。同上。

 

修改配置文件 $HADOOP_HOME/etc/hadoop/hdfs-site.xml
[hadoop@sfx111188 ~]$ vim hdfs-site.xml<configuration>   <property>       <name>dfs.replication</name>       <value>1</value>   </property></configuration>


简单说明:
    1. dfs.replication 指定HDFS 的数据副本数,这里是单机测试,设置为1。

 

修改配置文件 $HADOOP_HOME/etc/hadoop/ 里的JAVA 环境变量。
[hadoop@sfx111188 ~]$ vim ~/.bash_profile export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64


  • HDFS 格式化

 

格式化HDFS 文件。
[hadoop@sfx111188 ~]$ hdfs namenode -format2022-03-14 14:14:44,791 INFOnamenode.FSNamesystem: Retry cache on namenode is enabled2022-03-14 14:14:44,792 INFOnamenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cacheentry expiry time is 600000 millis2022-03-14 14:14:44,793 INFO util.GSet:Computing capacity for map NameNodeRetryCache2022-03-14 14:14:44,793 INFO util.GSet: VMtype       = 64-bit2022-03-14 14:14:44,793 INFO util.GSet:0.029999999329447746% max memory 26.7 GB = 8.2 MB2022-03-14 14:14:44,793 INFO util.GSet:capacity      = 2^20 = 1048576 entriesRe-format filesystem in Storage Directoryroot= /data2/hdfs/dfs/name; location= null ? (Y or N) y2022-03-14 14:14:57,837 INFOnamenode.FSImage: Allocated new BlockPoolId:BP-1765820763-192.168.111.188-16472384978312022-03-14 14:14:57,838 INFO common.Storage:Will remove files: [/data2/hdfs/dfs/name/current/seen_txid,/data2/hdfs/dfs/name/current/edits_inprogress_0000000000000000003,/data2/hdfs/dfs/name/current/fsimage_0000000000000000000.md5,/data2/hdfs/dfs/name/current/VERSION, /data2/hdfs/dfs/name/current/fsimage_0000000000000000000,/data2/hdfs/dfs/name/current/edits_0000000000000000001-0000000000000000002]2022-03-14 14:14:57,846 INFOcommon.Storage: Storage directory /data2/hdfs/dfs/name has been successfullyformatted.2022-03-14 14:14:57,868 INFO namenode.FSImageFormatProtobuf:Saving image file /data2/hdfs/dfs/name/current/fsimage.ckpt_0000000000000000000using no compression2022-03-14 14:14:57,986 INFOnamenode.FSImageFormatProtobuf: Image file/data2/hdfs/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 398 bytessaved in 0 seconds .2022-03-14 14:14:57,991 INFOnamenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 02022-03-14 14:14:58,111 INFOnamenode.FSNamesystem: Stopping services started for active state2022-03-14 14:14:58,111 INFOnamenode.FSNamesystem: Stopping services started for standby state2022-03-14 14:14:58,113 INFOnamenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown.2022-03-14 14:14:58,113 INFOnamenode.NameNode: SHUTDOWN_MSG:/************************************************************SHUTDOWN_MSG: Shutting down NameNode atsfx111188/192.168.111.188************************************************************/


  • 启动Hadoop 集群

[hadoop@sfx111188 ~]$ cd $HADOOP_HOME[hadoop@sfx111188 ~]$ sbin/start-dfs.sh
Starting namenodes on [sfx111188]Last login: Mon Mar 14 09:27:54 CST 2022 from 192.168.108.15 on pts/5sfx111188: Warning: Permanently added 'sfx111188' (ECDSA) to the listof known hosts.Starting datanodesLast login: Mon Mar 14 11:26:12 CST 2022 on pts/2Starting secondary namenodes [sfx111188]Last login: Mon Mar 14 11:26:14 CST 2022 on pts/2Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8


通过 jps 命令可以查看启动的后台任务。
[hadoop@sfx111188 ~]$ jpsPicked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF897075 DataNode128627 Jps97403 SecondaryNameNode159369 XMLServerLauncher96890 NameNode


root下也可以查看监听。
[root@sfx111188 hadoop]# netstat -ntlpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program nametcp       0      0 0.0.0.0:9867            0.0.0.0:*               LISTEN      97075/javatcp       0      0 0.0.0.0:9868            0.0.0.0:*               LISTEN      97403/javatcp       0      0 0.0.0.0:9870            0.0.0.0:*               LISTEN      96890/javatcp       0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1718/rpcbindtcp       0      0 127.0.0.1:13072         0.0.0.0:*               LISTEN      125603/nodetcp       0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      4629/sshdtcp       0      0 127.0.0.1:32505         0.0.0.0:*               LISTEN      97075/javatcp       0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      5227/mastertcp       0      0 0.0.0.0:9864            0.0.0.0:*               LISTEN      97075/javatcp       0      0 192.168.111.188:9000    0.0.0.0:*               LISTEN      96890/javatcp       0      0 0.0.0.0:9866            0.0.0.0:*               LISTEN      97075/javatcp6      0      0 :::111                  :::*                    LISTEN      1718/rpcbindtcp6      0      0 :::22                   :::*                    LISTEN      4629/sshdtcp6      0      0 ::1:25                  :::*                    LISTEN      5227/master


Hive

Hive 的定位是数据仓库,通过SQL读写和管理分布式存储中的数据。这里主要是使用Hive 来维护 Spark SQL 表和分布式存储中文件的关系。

在Hive官方网站下载最新版本 3.1.3。
下载地址:https://hive.apache.org/downloads.html

 

  • 软件安装

解压缩到目录 /opt/apache/ 下直接使用。然后配置 HIVE 环境变量。
[hadoop@sfx111188 ~]$ vim ~/.bash_profile export HIVE_HOME=/opt/apache/hiveexport PATH=$PATH:$HIVE_HOME/bin


  • 安装MySQL

 

Hive 元数据存放在 MySQL 数据库里。这里选择最简单的 MySQL 安装方法。
[root@sfx111188 ~]# yum -y install mysql-server.x86_64


启动 mysql服务。
[root@sfx111188 ~]# systemctl start mysqld

 

创建 Hive 元数据库和账号。
[root@sfx111188 ~]# mysql -h127.1 -uroot -P3306 -pcreate database hivedb;create user hive identified by'hive123456';grant all privileges on hivedb.* to hive;

 

  • 参数文件

 

配置Hive连接mysql数据库的信息。
[hadoop@sfx111188 ~]$ cd $HIVE_HOME/conf[hadoop@sfx111188 ~]$ vim hive-site.xml<configuration>   <property>     <name>javax.jdo.option.ConnectionURL</name>     <value>jdbc:mysql://sfx111188:3306/hivedb?createDatabaseIfNotExist=true&amp;useSSL=false</value>   </property>   <property>     <name>javax.jdo.option.ConnectionDriverName</name>     <value>com.mysql.jdbc.Driver</value>   </property>   <property>     <name>javax.jdo.option.ConnectionUserName</name>     <value>hive</value>   </property>   <property>     <name>javax.jdo.option.ConnectionPassword</name>     <value>hive123456</value>   </property>
<property> <name>hive.metastore.warehouse.dir</name> <value>/path/to/warehouse</value> </property></configuration>


 

  • Hive MySQL 驱动

下载 mysql-connector-java 驱动,放到 $HIVE_HOME/lib 下。

 

  • 初始化Hive metastore Schema

[hadoop@sfx111188 ~]$ schematool -dbType mysql -initSchema


  • 启动 HiveMetaStore 服务

[hadoop@sfx111188 ~]$ nohup hive --service metastore > ~/hive-metastore.log2>&1 &



Spark SQL

Spark 官方提供的二进制下载版本缺少对Hive的支持,需要自己下载源码并加入Hive依赖,然后生成安装包。

 

  • 源码下载并编译

官方地址:https://spark.apache.org/downloads.html

package type 选Source Code。下载,解压。

 

修改Spark源码的 pom.xml 中 maven repo 地址,调整为国内地址源。

 

[root@sfx111188 spark-3.2.1]# vim pom.xml
<!--url>https://maven-central.storage-download.googleapis.com/maven2/</url--><url>https://maven.aliyun.com/repository/public</url>

 

编译并打包。

 

[root@sfx111188 spark-3.2.1]# ./dev/make-distribution.sh --namehadoop-3.3.2-hive-3.1.3 --tgz -Pyarn -Dhadoop.version=3.3.2 -Phive-Phive-thriftserver -DskipTests


这一步会下载依赖的源码包,时间非常长(30-40分钟左右)。

 

打包结束后会生成一个发行包文件:apache-hive-3.1.3-bin.tar.gz。可以解压缩后直接使用。

 

  • 配置环境变量

 

[hadoop@sfx111188 ~]$ vim ~/.bash_profileexport SPARK_HOME=/opt/apache/sparkexport PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin


  • 配置文件

有多个配置文件可以影响 spark 行为。

 

[hadoop@sfx111188 ~]$ cd $SPARK_HOME/conf[hadoop@sfx111188 ~]$ vim spark-env.sh修改下面参数为实际值。export SPARK_LOCAL_DIRS=/sparkcacheexport SPARK_DRIVER_MEMORY=16gexport SPARK_WORKER_CORES=40export SPARK_EXECUTOR_CORES=24export SPARK_EXECUTOR_MEMORY=16g
这里 /sparkcache 我链接到一个 SSD的分区。

 

[hadoop@sfx111188 ~]$ vim spark-defaults.conf
spark.eventLog.enabled truespark.eventLog.dir hdfs://sfx111188:9000/user/hadoop/logs/sparkspark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value-Dnumbers="one two three"spark.memory.fraction=0.75spark.driver.maxResultSize=4g
spark.eventLog.dir 会保存每次Spark 作业信息,通过 History Web Server 查看。

 

Spark 访问 hive-meta 服务可以通过JDBC 协议,也可以通过 HiveMetastore Server 中转。这里使用后者。所以还需要新建Hive配置文件。

 

[hadoop@sfx111188 ~]$ vim hive-site.xml
<?xml version="1.0" encoding="UTF-8"standalone="no"?><?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hadoop/warehouse</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://sfx111188:9083</value> </property></configuration>

 

Spark SQL里数据库和表的文件会放在Hadoop中,具体是 hive.metastore.warehouse.dir 。

所以需要先在 HDFS 中建好这个目录。
[hadoop@sfx111188 ~]$ hdfs dfs -mkdir -p /user/hadoop/warehouse


然后查看目录。
[hadoop@sfx111188 ~]$ hdfs dfs -ls /user/hadoop/warehouse

 

  • 启动Spark History 服务

 

[hadoop@sfx111188 ~]$ start-history-server.sh

 

  • 测试Spark SQL 连接。

请先确保Hadoop服务,Hive的metastore服务,以及 Hive 依赖的 mysqld 服务都启动了。可以通过jps 命令查看启动的服务。

 

[hadoop@sfx111188 ~]$ jps 20049 NameNode31057 HistoryServer21874 SecondaryNameNode21495 DataNode34555 Jps23084 NodeManager22303 ResourceManager


然后通过 spark-sql 命令连接。
[hadoop@sfx111188 ~]$ spark-sql Setting default log level to"WARN".To adjust logging level usesc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).2022-05-17 17:35:25,473 WARNutil.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using builtin-java classes where applicable2022-05-17 17:35:27,561 WARN util.Utils:Service 'SparkUI' could not bind on port 4040. Attempting port 4041.Spark master: local[*], Application Id:local-1652780127695spark-sql>spark-sql> show databases;defaultTime taken: 3.794 seconds, Fetched 1 row(s)spark-sql>


Spark 连接成功时会启动服务SparkUI,监听端口默认是4040。如果有其他spark-sql命令同时在本机运行,会自动尝试新的端口(在原有端口上加1)。

 

[hadoop@sfx111188 ~]$ netstat -ntlp |grep 4041 (Not all processes could be identified,non-owned process info willnot be shown, you would have to be root to see it all.)tcp6      0      0 :::4041                 :::*                    LISTEN      15986/java[hadoop@sfx111188 ~]$

 

至此,Spark SQL就部署好了。
下一篇介绍在 Spark 上跑 TPC-H 测试。

 


参考

  • Spark 介绍_w3cschool 

    https://www.w3cschool.cn/spark_sql/spark_introduction.html

  • 从零搭建 Spark SQL + Hive 开发环境 - 知乎 (zhihu.com)

    https://zhuanlan.zhihu.com/p/360945733


原文作者:数据库技术闲谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-11-02

  • 博文量
    156
  • 访问量
    96832