暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spark SQL 部署和测试(上)

1425

 

简介


大数据离线数仓架构,通常以 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 rsa
        ssh-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/profile
            export 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/hadoop
              chown -R hadoop.hadoop opt/apache/hadoop


              • hadoop 配置

               下面在 hadoop 用户下执行。
              配置环境变量。
                [hadoop@sfx111188 ~]$ vim ~/.bash_profile
                export HADOOP_HOME=/opt/apache/hadoop
                export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
                export 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 -format
                        2022-03-14 14:14:44,791 INFOnamenode.FSNamesystem: Retry cache on namenode is enabled
                        2022-03-14 14:14:44,792 INFOnamenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cacheentry expiry time is 600000 millis
                        2022-03-14 14:14:44,793 INFO util.GSet:Computing capacity for map NameNodeRetryCache
                        2022-03-14 14:14:44,793 INFO util.GSet: VMtype = 64-bit
                        2022-03-14 14:14:44,793 INFO util.GSet:0.029999999329447746% max memory 26.7 GB = 8.2 MB
                        2022-03-14 14:14:44,793 INFO util.GSet:capacity = 2^20 = 1048576 entries
                        Re-format filesystem in Storage Directoryroot= /data2/hdfs/dfs/name; location= null ? (Y or N) y
                        2022-03-14 14:14:57,837 INFOnamenode.FSImage: Allocated new BlockPoolId:BP-1765820763-192.168.111.188-1647238497831
                        2022-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 compression
                        2022-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 >= 0
                        2022-03-14 14:14:58,111 INFOnamenode.FSNamesystem: Stopping services started for active state
                        2022-03-14 14:14:58,111 INFOnamenode.FSNamesystem: Stopping services started for standby state
                        2022-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/5
                          sfx111188: Warning: Permanently added 'sfx111188' (ECDSA) to the listof known hosts.
                          Starting datanodes
                          Last login: Mon Mar 14 11:26:12 CST 2022 on pts/2
                          Starting secondary namenodes [sfx111188]
                          Last login: Mon Mar 14 11:26:14 CST 2022 on pts/2
                          Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8


                          通过 jps 命令可以查看启动的后台任务。
                            [hadoop@sfx111188 ~]$ jps
                            Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
                            97075 DataNode
                            128627 Jps
                            97403 SecondaryNameNode
                            159369 XMLServerLauncher
                            96890 NameNode


                            root下也可以查看监听。
                              [root@sfx111188 hadoop]# netstat -ntlp
                              Active Internet connections (only servers)
                              Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
                              tcp 0 0 0.0.0.0:9867 0.0.0.0:* LISTEN 97075/java
                              tcp 0 0 0.0.0.0:9868 0.0.0.0:* LISTEN 97403/java
                              tcp 0 0 0.0.0.0:9870 0.0.0.0:* LISTEN 96890/java
                              tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1718/rpcbind
                              tcp 0 0 127.0.0.1:13072 0.0.0.0:* LISTEN 125603/node
                              tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4629/sshd
                              tcp 0 0 127.0.0.1:32505 0.0.0.0:* LISTEN 97075/java
                              tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 5227/master
                              tcp 0 0 0.0.0.0:9864 0.0.0.0:* LISTEN 97075/java
                              tcp 0 0 192.168.111.188:9000 0.0.0.0:* LISTEN 96890/java
                              tcp 0 0 0.0.0.0:9866 0.0.0.0:* LISTEN 97075/java
                              tcp6 0 0 :::111 :::* LISTEN 1718/rpcbind
                              tcp6 0 0 :::22 :::* LISTEN 4629/sshd
                              tcp6 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/hive
                                export 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 -p
                                      create 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_profile
                                                  export SPARK_HOME=/opt/apache/spark
                                                  export 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=/sparkcache
                                                    export SPARK_DRIVER_MEMORY=16g
                                                    export SPARK_WORKER_CORES=40
                                                    export SPARK_EXECUTOR_CORES=24
                                                    export SPARK_EXECUTOR_MEMORY=16g
                                                    这里 sparkcache 我链接到一个 SSD的分区。

                                                     

                                                      [hadoop@sfx111188 ~]$ vim spark-defaults.conf


                                                      spark.eventLog.enabled true
                                                      spark.eventLog.dir hdfs://sfx111188:9000/user/hadoop/logs/spark
                                                      spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value-Dnumbers="one two three"
                                                      spark.memory.fraction=0.75
                                                      spark.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 NameNode
                                                                31057 HistoryServer
                                                                21874 SecondaryNameNode
                                                                21495 DataNode
                                                                34555 Jps
                                                                23084 NodeManager
                                                                22303 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 applicable
                                                                  2022-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-1652780127695
                                                                  spark-sql>
                                                                  spark-sql> show databases;
                                                                  default
                                                                  Time 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


                                                                    文章转载自数据库技术闲谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                    评论