大数据环境搭建


本文整理了 zookeeper 集群、Hadoop 集群、Spark 集群的详细搭建步骤。

0. 环境准备

本实验基于以下 8 台测试机器进行:

IP hostname
10.4.79.90 hadoop-1
10.4.79.8 hadoop-2
10.4.79.6 hadoop-3
10.4.79.58 hadoop-4
10.4.79.38 hadoop-5
10.4.79.96 hadoop-6
10.4.79.62 hadoop-7
10.4.79.92 hadoop-8

首先确认每个机器都安装了如下软件:

  • JAVA >= 1.8.x
  • SSH,并确保所有集群节点之间可互相 SSH免密登录

为集群每个节点配置 hostname:vi /etc/hosts

10.4.79.90 hadoop-1
10.4.79.8  hadoop-2
10.4.79.6  hadoop-3
10.4.79.58 hadoop-4
10.4.79.38 hadoop-5
10.4.79.96 hadoop-6
10.4.79.62 hadoop-7
10.4.79.92 hadoop-8

1. zookeeper 集群搭建

为什么要搭建 zookeeper 集群呢?这是为了保障后续 hadoop 集群的高可用性,zookeeper 可以为 hadoop 集群的主备切换控制器提供主备选举支持

我们选择 hadoop-1hadoop-2hadoop-3 这 3 个节点组建 zookeeper 集群。

本文所使用的 zookeeper 版本为:3.5.8

  1. 解压缩:

    tar -zxvf apache-zookeeper-x.x.x-bin.tar.gz
    
  2. 创建 data 文件夹用于存放 zookeeper 的数据:

    cd apache-zookeeper
    
    mkdir data
    
  3. 创建配置文件 zoo.cfg(从 zoo_sample.cfg 复制得到),zookeeper 默认以 zoo.cfg 作为配置文件启动:

    cd apache-zookeeper/conf

    cp zoo_sample.cfg zoo.cfg

  4. 修改配置文件 zoo.cfg:

    一共需要修改两处:

    第一处:修改 dataDir 为我们创建的 zookeeper/data 路径:

    dataDir=/data/apache-zookeeper/data
    

    第二处:文件末尾添加其他 zookeeper 节点的信息:

    server.1=hadoop-1:2888:3888
    server.2=hadoop-2:2888:3888
    server.3=hadoop-3:2888:3888
    

    其中 server.1 中的后缀 1 实际上为相应 zookeeper 节点的 id,例如本例中我们指定 hadoop-1 节点作为 zookeeper 集群的 1 号节点。

    如何让 hadoop-1 知道自己是 1 号节点呢?在 zookeeper/data 下创建一个文件 myid,里面写入 1 即可

    相应地,在 hadoop-2 的 zookeeper/data 下创建文件 myid,修改内容为 2,在 hadoop-3 的 zookeeper/data 下创建文件 myid,修改内容为 3。

    一般我们在一个节点配置好后,再 scp 到其他节点,那么在复制之后不要忘记修改 myid 为相应节点的编号。

  5. 启动 zookeeper:

    依次在每个节点启动 zookeeper:

    ./bin/zkServer.sh start
    

    查看每个节点在集群中的角色:

    ./bin/zkServer.sh status
    

    可以看到集群中有一个 leader 节点,其余为 follower 节点。

2. hadoop 集群搭建

本文所使用的 hadoop 版本为:2.10.0

搭建高可用 Hadoop 集群之前,我们需要对集群做一个规划,分配好每个节点在集群中扮演的角色;

hostname NameNode JournalNode ZKFC DataNode ResourceManager NodeManager
hadoop-1 Y Y Y Y Y
hadoop-2 Y Y Y Y Y
hadoop-3 Y Y Y Y
hadoop-4 Y Y Y
hadoop-5 Y Y
hadoop-6 Y Y
hadoop-7 Y Y
hadoop-8 Y Y
  1. 解压 hadoop 安装包:

    tar -zxvf hadoop-2.10.0.tar.gz
    
  2. 编辑 /etc/profile 添加 hadoop 环境变量:

    export JAVA_HOME=/opt/jdk1.8.0_281
    export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
    export HADOOP_HOME=/opt/hadoop-2.10.0
    export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
  3. 编辑 hadoop/etc/hadoop/hadoop-env.sh,配置 JAVA_HOME

    # The java implementation to use.
    export JAVA_HOME=/opt/jdk1.8.0_281
    
  4. 验证一下 hadoop 是否安装成功:

  5. hadoop 集群的核心配置

    接着配置 hadoop 的 4 个核心配置文件:core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,分别对应 hadoop 的 4 个主要组成部分:核心包,HDFS文件系统,MapReduce模型,yarn 资源调度框架。

    如果没有相应文件,从当前目录下的模板文件复制:

    cp hadoop/etc/hadoop/xxx.site.xml.template  hadoop/etc/hadoop/xxx.site.xml
    

    core-site.xml 的配置:

    
      
        fs.defaultFS
        hdfs://mycluster
      
      
      
        hadoop.tmp.dir
        /data/hadoop
      
      
      
        ha.zookeeper.quorum
        hadoop-1:2181,hadoop-2:2181,hadoop-3:2181
      
    
    

    hdfs-site.xml的配置

    按照我们的规划,选择 hadoop-1,hadoop-2 作为 namenode,hadoop-1,hadoop-2,hadoop-3 作为 journalnode;

    
        
        
            dfs.nameservices
            mycluster
        
        
        
            dfs.ha.namenodes.mycluster
            nn1,nn2
        
        
        
            dfs.namenode.rpc-address.mycluster.nn1
            hadoop-1:9000
        
        
        
            dfs.namenode.http-address.mycluster.nn1
            hadoop-1:50070
        
        
        
            dfs.namenode.rpc-address.mycluster.nn2
            hadoop-2:9000
        
        
        
            dfs.namenode.http-address.mycluster.nn2
            hadoop-2:50070
        
        
        
            dfs.namenode.shared.edits.dir
            qjournal://hadoop-1:8485;hadoop-2:8485;hadoop-3:8485/mycluster
        
        
        
            dfs.journalnode.edits.dir
            /data/hadoop/journaldata
        
        
        
            dfs.ha.automatic-failover.enabled
            true
        
        
        
        
            dfs.client.failover.proxy.provider.mycluster
            org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
        
        
        
            dfs.ha.fencing.methods
            
                sshfence
                shell(/bin/true)
            
        
        
        
            dfs.ha.fencing.ssh.private-key-files
            /root/.ssh/id_rsa
        
        
        
            dfs.ha.fencing.ssh.connect-timeout
            30000
        
        
            dfs.permissions.enabled
            false
        
    
    

    mapred-site.xml 的配置

    
        
        
            mapreduce.framework.name
            yarn
        
        
        
            mapreduce.jobhistory.address
            hadoop-1:10020
        
        
        
            mapreduce.jobhistory.webapp.address
            hadoop-1:19888
        
    
    

    yarn-site.xml 的配置

    按照我们的规划,选择 hadoop-3,hadoop-4 作为 ResourceManager

    
        
        
            yarn.resourcemanager.ha.enabled
            true
        
        
        
            yarn.resourcemanager.cluster-id
            jyarn
        
        
        
            yarn.resourcemanager.ha.rm-ids
            rm1,rm2
        
        
        
            yarn.resourcemanager.hostname.rm1
            hadoop-3
        
        
            yarn.resourcemanager.hostname.rm2
            hadoop-4
        
        
        
            yarn.resourcemanager.zk-address
            hadoop-1:2181,hadoop-2:2181,hadoop-3:2181
        
        
        
            yarn.nodemanager.aux-services
            mapreduce_shuffle
        
        
        
            yarn.log-aggregation-enable
            true
        
        
        
            yarn.log-aggregation.retain-seconds
            
            86400
        
        
        
            yarn.resourcemanager.recovery.enabled
            true
        
        
        
            yarn.resourcemanager.store.class
            org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
        
        
            yarn.scheduler.maximum-allocation-mb
            8192
            每个任务最多可用内存,单位MB
        
        
            yarn.scheduler.minimum-allocation-mb
            4096
            每个任务最少可用内存
        
        
            yarn.nodemanager.vmem-pmem-ratio
            4
        
    
    
  6. 配置集群 master 节点:

    编辑 hadoop/etc/hadoop/master 文件,选择 hadoop-1 节点为 master:

    hadoop-1
    
  7. 配置集群 slave 节点,指定 DataNode 节点:

    编辑 hadoop/etc/hadoop/slaves 文件,配置 slave 节点,每行一个:

    hadoop-1
    hadoop-2
    hadoop-3
    hadoop-4
    hadoop-5
    hadoop-6
    hadoop-7
    hadoop-8
    

    到此,hadoop 的 master 节点配置就基本完成了,将配置好的 hadoop 从 master 节点复制到其它节点,但要保证 hadoop 在每个节点的存放路径相同同时不要忘记在各个节点配置 HADOOP 环境变量

  8. 启动 journalnode

    分别在每个 journalnode 节点(hadoop-1,hadoop-2,hadoop-3)启动 journalnode 进程:

    cd hadoop/sbin
    
    hadoop-daemon.sh start journalnode
    
  9. 格式化 HDFS 文件系统

    在第一个 namenode 节点(hadoop-1)输入以下命令格式化 HDFS 文件系统

    hadoop namenode -format
    

    出现以下结果就算成功

  10. 格式化 ZKFC

    任选一个 namenode 节点格式化 ZKFC

    hdfs zkfc -formatZK
    

    出现以下信息说明格式化成功:

  11. 启动 namenode:

    启动主 namenode(hadoop-1):

    ./sbin/hadoop-daemon.sh start namenode
    

    在备用 namenode(hadoop-2)上同步元数据:

    hadoop namenode -bootstrapStandby
    

    出现以下信息说明元数据同步成功:

  12. 启动 hdfs

    在第一个 namenode 节点(hadoop-1)启动 hdfs:

    ./sbin/start-dfs.sh
    

    执行个 hdfs 命令测试一下是否启动成功:

    hdfs dfs -ls /
    

    如果没有异常输出就代表启动成功。

  13. 启动 yarn

    在第一个 resourcemanager 节点(hadoop-3)启动 yarn:

    ./sbin/start-yarn.sh
    

    在另一个 resourcemanager 节点(hadoop-4)手动启动 resourcemanager:

    ./sbin/yarn-daemon.sh start resourcemanager
    

3. hive

本文所使用的 zookeeper 版本为:2.3.5

安装 hive 的三个前提条件为:

  • JDK

  • hadoop

  • MySql

  1. 配置 hive-env.sh

    文件末尾添加:

    export JAVA_HOME=/opt/jdk1.8.0_281
    export HADOOP_HOME=/opt/hadoop-2.10.0
    export HIVE_HOME=/opt/apache-hive-2.3.5-bin
    
  2. 配置 hive-site.xml

    
      
        javax.jdo.option.ConnectionURL
        jdbc:mysql://10.4.53.180:3306/hive?createDatabaseIfNotExist=true&serverTimezone=GMT%2B8&useSSL=false
      
      
        javax.jdo.option.ConnectionDriverName
        com.mysql.jdbc.Driver
      
      
        javax.jdo.option.ConnectionUserName
        root
      
      
        javax.jdo.option.ConnectionPassword
        aaa123+-*/
      
      
        hive.querylog.location
        /data/hive/tmp
      
      
        hive.exec.local.scratchdir
        /data/hive/tmp
      
      
        hive.downloaded.resources.dir
        /data/hive/tmp
      
      
        hive.metastore.warehouse.dir
        hdfs://mycluster/user/spark/spark-sql-warehouse
      
      
        spark.sql.warehouse.dir
        hdfs://mycluster/user/spark/spark-sql-warehouse
      
    
    
  3. 将 mysql 驱动拷贝到 hive/lib 目录下

  4. 初始化Hive元数据库

    ./bin/schematool -initSchema -dbType mysql -userName root -passWord abc123+-*/
    

    出现以下信息则代表数据库初始化成功:

    成功后可以在 mysql 中看到创建的 hive 数据库和相关表:

    mysql> use hive;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +---------------------------+
    | Tables_in_hive            |
    +---------------------------+
    | AUX_TABLE                 |
    | BUCKETING_COLS            |
    | CDS                       |
    | COLUMNS_V2                |
    | COMPACTION_QUEUE          |
    | DATABASE_PARAMS           |
    | VERSION                   |
    | ...                       |
    +---------------------------+
    57 rows in set (0.00 sec)
    

4. Spark 集群搭建

本文所使用的 Spark 版本为:spark-2.4.5-bin-hadoop2.7

  1. 配置环境变量:

    export JAVA_HOME=/opt/jdk1.8.0_281
    export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
    export HADOOP_HOME=/opt/hadoop-2.10.0
    export SPARK_HOME=/opt/spark-2.4.5-bin-hadoop2.7
    export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SPARK_HOME/bin:$SPARK_HOME/sbin
    
  2. 修改配置文件:

    编辑 spark/conf/spark-env.sh:

    export JAVA_HOME=/opt/jdk1.8.0_281
    export SPARK_MASTER_IP=hadoop-1
    export SPARK_WORKER_MEMORY=1024m
    export SPARK_WORKER_CORES=1
    export HADOOP_CONF_DIR=/opt/hadoop-2.10.0/etc/hadoop
    

    编辑 spark-defaults.conf

    spark.master                       spark://hadoop-1:7077
    

    编辑 slaves 文件配置 worker 节点:

    hadoop-2
    hadoop-3
    hadoop-4
    hadoop-5
    hadoop-6
    hadoop-7
    hadoop-8
    
  3. 将配置好的 spark scp 到其他各个节点

  4. 启动 spark 集群:

    ./sbin/start-all.sh
    

5. Spark、Hadoop 和 Hive 的整合

现在一般 Spark 应用程序会部署到 Hadoop 的 Yarn 上进行调度,虽然 Spark 本身也提供了 standalone 的部署模式。

而在使用Spark SQL时,因为大部分数据一般都是保存在 HDFS 上,而 Hive 本身就是操作 HDFS 上的数据,因此一般会将 Spark SQL 和 Hive 整合使用,元数据信息是使用Hive表的,而真正处理数据时使用的计算引擎是 Spark 的。

当希望通过 Java JDBC 的方式使用 Spark SQL 的能力时,就可以使用 Spark Thrift JDBCServer,并且其本身也是可以和 Hive 整合使用。

官方文档关于这部分的说明:

Configuration of Hive is done by placing your hive-site.xml, core-site.xml and hdfs-site.xml files in conf/.

其实也就是将 Hive 的配置文件 hive-site.xml,Hadoop 的配置文件 core-site.xmlhdfs-site.xml 放到 Spark 的配置目录下。

我们不是向 hive/lib 目录上传了一个 mysql 驱动嘛,还需要再把这个驱动程序拷贝到 spark/jars 目录下,否则会抛出找不到驱动程序的异常。

  1. 启动Thirftserver:

    ./sbin/start-thriftserver.sh
    

    如果启动成功,默认会监听10000端口:

  2. 使用 beeline 连接试试看:

  3. 部署 thrift-server 到 yarn

    编辑 spark/conf/spark-env.sh(从 spark-env.sh.template 复制而来)

    文件末尾添加:

    export JAVA_HOME=/opt/jdk1.8.0_281
    export SPARK_MASTER_IP=hadoop-1
    export SPARK_WORKER_MEMORY=1024m
    export SPARK_WORKER_CORES=1
    export HADOOP_CONF_DIR=/opt/hadoop-2.10.0/etc/hadoop
    

    编辑 spark/conf/slaves(从 slaves.template 复制而来),配置 worker 节点信息:

    hadoop-2
    hadoop-3
    hadoop-4
    hadoop-5
    hadoop-6
    hadoop-7
    hadoop-8
    

    配置完成后,将 spark 复制到集群中的每一台节点。

    启动:

    ./start-thriftserver.sh --master yarn
    

    日志中无异常信息抛出则代表启动成功:

相关