大数据环境搭建
本文整理了 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-1,hadoop-2,hadoop-3 这 3 个节点组建 zookeeper 集群。
本文所使用的 zookeeper 版本为:3.5.8
-
解压缩:
tar -zxvf apache-zookeeper-x.x.x-bin.tar.gz
-
创建 data 文件夹用于存放 zookeeper 的数据:
cd apache-zookeeper mkdir data
-
创建配置文件 zoo.cfg(从 zoo_sample.cfg 复制得到),zookeeper 默认以 zoo.cfg 作为配置文件启动:
cd apache-zookeeper/conf
cp zoo_sample.cfg zoo.cfg
-
修改配置文件 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 为相应节点的编号。
-
启动 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 |
-
解压 hadoop 安装包:
tar -zxvf hadoop-2.10.0.tar.gz
-
编辑 /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
-
编辑 hadoop/etc/hadoop/hadoop-env.sh,配置 JAVA_HOME
# The java implementation to use. export JAVA_HOME=/opt/jdk1.8.0_281
-
验证一下 hadoop 是否安装成功:
-
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 -
配置集群 master 节点:
编辑 hadoop/etc/hadoop/master 文件,选择 hadoop-1 节点为 master:
hadoop-1
-
配置集群 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 环境变量。
-
启动 journalnode
分别在每个 journalnode 节点(hadoop-1,hadoop-2,hadoop-3)启动 journalnode 进程:
cd hadoop/sbin hadoop-daemon.sh start journalnode
-
格式化 HDFS 文件系统
在第一个 namenode 节点(hadoop-1)输入以下命令格式化 HDFS 文件系统
hadoop namenode -format
出现以下结果就算成功
-
格式化 ZKFC
任选一个 namenode 节点格式化 ZKFC
hdfs zkfc -formatZK
出现以下信息说明格式化成功:
-
启动 namenode:
启动主 namenode(hadoop-1):
./sbin/hadoop-daemon.sh start namenode
在备用 namenode(hadoop-2)上同步元数据:
hadoop namenode -bootstrapStandby
出现以下信息说明元数据同步成功:
-
启动 hdfs
在第一个 namenode 节点(hadoop-1)启动 hdfs:
./sbin/start-dfs.sh
执行个 hdfs 命令测试一下是否启动成功:
hdfs dfs -ls /
如果没有异常输出就代表启动成功。
-
启动 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
-
配置 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
-
配置 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 -
将 mysql 驱动拷贝到 hive/lib 目录下
-
初始化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
-
配置环境变量:
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
-
修改配置文件:
编辑 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
-
将配置好的 spark scp 到其他各个节点
-
启动 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.xml 和 hdfs-site.xml 放到 Spark 的配置目录下。
我们不是向 hive/lib 目录上传了一个 mysql 驱动嘛,还需要再把这个驱动程序拷贝到 spark/jars 目录下,否则会抛出找不到驱动程序的异常。
-
启动Thirftserver:
./sbin/start-thriftserver.sh
如果启动成功,默认会监听10000端口:
-
使用 beeline 连接试试看:
-
部署 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
日志中无异常信息抛出则代表启动成功: