Hadoop分布式集群搭建
Linux基础环境配置
hostname更改
配置三台服务器的主机名,便于识别,修改之后重新连接终端即可:1
2
3hostnamectl set-hostname master //在master上运行
hostnamectl set-hostname slave1 //在slave1上运行
hostnamectl set-hostname slave2 //在slave2上运行
ssh免密
在master的机器上运行(具体IP需要根据实际情况修改):1
2
3
4ssh-keygen #生成SSH公/私匙,默认使用rsa
ssh-copy-id root@192.168.1.1 #均需要输入三台主机的root账户密码
ssh-copy-id root@192.168.1.2
ssh-copy-id root@192.168.1.3
免密登陆测试:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[root@master ~]# ssh root@localhost
Last login: Fri Jul 17 11:31:48 2020 from 42.230.242.170
Welcome to Alibaba Cloud Elastic Compute Service !
[root@master ~]# exit
登出
Connection to localhost closed.
[root@master ~]# ssh root@172.17.78.177
Last login: Fri Jul 17 11:31:44 2020 from 42.230.242.170
Welcome to Alibaba Cloud Elastic Compute Service !
[root@slave1 ~]# exit
登出
Connection to 172.17.78.177 closed.
[root@master ~]# ssh root@172.17.78.178
Last login: Fri Jul 17 11:31:40 2020 from 42.230.242.170
Welcome to Alibaba Cloud Elastic Compute Service !
[root@slave2 ~]# exit
登出
Connection to 172.17.78.178 closed.
hosts更改
在master主机上运行vim /etc/hosts
后添加(具体IP需要根据实际情况修改):1
2
3192.168.1.1 master
192.168.1.2 slave1
192.168.1.3 slave2
接着将hosts文件传输到slave1和slave2:1
2scp -r /etc/hosts root@192.168.1.2:/etc
scp -r /etc/hosts root@192.168.1.1:/etc
现在我们可以使用master,slave1,slave2来代替上述IP了,使用ping master
,ping slave1
,ping slave2
即可测试
防火墙关闭
在master,slave1,slave2上均运行:1
2systemctl stop firewalld.service //停止防火墙
systemctl disable firewalld.service //禁止防火墙开机自启
ntp
- 在master上安装ntpd服务:使用
rpm -qa|grep ntpd
检查安装,使用yum -y install ntpd
进行在线安装。 修改master的ntp.conf,使用
vim /etc/ntp.conf
:- 添加如下内容:
1
restrict master mask 255.255.255.0 nomodify notrap
- 注释掉:
1
2
3
4#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
#server 3.centos.pool.ntp.org - 取消注释:
1
2server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
- 添加如下内容:
- 硬件时间同步,在/etc/sysconfig/ntpd后添加
SYNC_HWCLOCK=yes
- 启动ntpd服务,设置开机自启:
1
2service ntpd start
chkconfig ntpd on - 在slave1与slave2上使用
ntpdata master
同步时间 - 在slave1与slave2上配置定时任务:
crontab -e
后加入* * * * * /usr/sbin/ntpdate master
,每分钟同步一次时间。
注:
- *:取值范围内的所有数字;
- /:每过多少数字;
- -:取值范围;
- ,:散列数字;
- 例如:3,15 8-11 /2 * myCommand意为每两天上午8点到11点的第3与15分钟执行。
生态软件配置
注意:
善用Tab补全文件名与路径
所有安装包(Hadoop,JDK,Zookeeper,MySQL,Hive,Python)默认已解压到/root/software,如未下载请执行:
wget https://hadoop-software.oss-cn-beijing.aliyuncs.com/software.zip
。unzip
如未安装,请使用yum install unzip
进行在线安装。
JDK
1 | cd /root/software #进入软件目录 |
Hadoop
HDFS
- 安装并配置基础环境
1
2
3
4
5
6
7cd /root/software
tar -zxvf hadoop-2.7.3.tar.gz #解压
mv hadoop-2.7.3 hadoop #将原目录更名为hadoop
echo -e 'export HADOOP_HOME=/root/software/hadoop\nexport PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> /etc/profile #将Hadoop路径加入环境变量
source /etc/profile
cd /root/software/hadoop/etc/hadoop
echo "export JAVA_HOME=$JAVA_HOME" >> hadoop-env.sh #将Java路径加入hadoop-env中去 - 配置集群,使用
core-site.xml
,在configuration中添加:1
2
3
4
5
6
7
8
9
10
11<!-- HDFS集群中NameNode的URI(包括协议、主机名称、端口号),默认为 file:/// -->
<property>
<name>fs.defaultFS</name>
<!-- 用于指定NameNode的地址 -->
<value>hdfs://master:9000</value>
</property>
<!-- Hadoop运行时产生文件的临时存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoopData/temp</value>
</property> - 配置文件系统 使用
vim hdfs-site.xml
,在configuration中添加:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<!-- NameNode在本地文件系统中持久存储命名空间和事务日志的路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoopData/name</value>
</property>
<!-- DataNode在本地文件系统中存放块的路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoopData/data</value>
</property>
<!-- 数据块副本的数量,默认为3 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
YARN
- 复制模板
1
2cd /root/software/hadoop/etc/hadoop
cp mapred-site.xml.template mapred-site.xml - 配置
mapred-site.xml
,在configuration中添加:1
2
3
4
5<!-- 指定使用 YARN 运行 MapReduce 程序,默认为 local -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property> - 配置
yarn-site.xml
,在configuration中添加:1
2
3
4
5
6
7
8
9
10<!-- NodeManager上运行的附属服务,也可以理解为 reduce 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property> - 配置主从机:
1
echo -e "slave1\nslave2" slaves
- 复制配置文件:
1
2
3cd /root/software/hadoop
scp hadoop/etc/hadoop/* slave1:/root/software/hadoop/etc/hadoop/
scp hadoop/etc/hadoop/* slave2:/root/software/hadoop/etc/hadoop - 启动与管理:
- 在master上对HDFS进行格式化:
hdfs namenode -format
- 在master上启动全部dfs节点:
start-dfs.sh
- 在master上启动全部yarn节点:
start-yarn.sh
- 使用
jps
查看当前运行的Java进程
- 在master上对HDFS进行格式化:
ZooKeeper
- 安装并配置环境变量:
1
2
3
4
5
6
7tar -zxvf zookeeper-3.4.10.tar.gz
mv zookeeper-3.4.10 zoo
echo -e "export ZOOKEEPER_HOME=/root/software/zoo\nexport PATH=.:$PATH:$ZOOKEEPER_HOME/bin" >> /etc/profile
source /etc/profile
cd zoo && mkdir data #新建data目录
cd conf
cp zoo_sample.cfg zoo.cfg - 在zoo.cfg中配置:
1
2
3
4dataDir=/root/software/zoo/data
server.0=master:2888:3888
server.1=slave1:2888:3888
server.2=slave2:2888:3888 - 进入data目录配置id:
- master上:echo 0 >>myid
- slave1上:echo 1 >>myid
- slave2上:echo 2 >>myid
- 启动与管理(需要在每台主机上启动):
1
2
3zkServer.sh start #启动zookeeper服务器
zkServer.sh status #查看服务器状态,follower/leader
zkCli.sh #启动zookeeper客户端
最终效果
MySQL
MySQL仅安装在master上
- 安装MySQL: 如遇报错
1
2
3
4
5
6
7
8
9rpm -qa|grep mariadb
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm--initialize specified but the data directory has files in it. Aborting.
,请清空/etc/my.cnf中datadir对应的目录(/var/lib/mysql),如下:
如遇报错:请使用1
2
3
4
5警告:mysql-community-server-5.7.29-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
错误:依赖检测失败:
libaio.so.1()(64bit) 被 mysql-community-server-5.7.29-1.el7.x86_64 需要
libaio.so.1(LIBAIO_0.1)(64bit) 被 mysql-community-server-5.7.29-1.el7.x86_64 需要
libaio.so.1(LIBAIO_0.4)(64bit) 被 mysql-community-server-5.7.29-1.el7.x86_64 需要yum install libaio
安装libaio依赖。 - 数据库初始化与开启:
1
2/usr/sbin/mysqld --initialize-insecure --user=mysql
/usr/sbin/mysqld --user=mysql & 配置MySQL信息,使用
mysql -uroot
进入MySQL Client:1
2
3
4
5mysql> alter user 'root'@'localhost' identified by '123456';
mysql> use mysql; # 切换成mysql数据库
mysql> select user,host from user; # 查询用户信息
mysql> update user set host='%' where host='localhost'; # 设置远程登录权限
mysql> flush privileges; # 刷新配置信息退出登录后使用
mysql -uroot -p123456
进行测试。
Hive
Hive仅安装在master上
- 解压并配置HIVE环境变量与mysql的jar包:
1
2
3
4
5
6
7cd /root/software
tar -zxvf apache-hive-2.1.1-bin.tar.gz
mv apache-hive-2.1.1-bin hive
echo -e "export HIVE_HOME=/root/software/hive\nexport PATH=$PATH:$HIVE_HOME/bin" >> /etc/profile
source /etc/profile
cp mysql-connector-java-5.1.47-bin.jar hive/lib/
cd hive/conf/ - 配置hive-env. sh:
1
2cp hive-env.sh.template hive-env.sh
vim hive-env.sh - 然后在hive-env.sh中配置HADOOP_HOME、HIVE_CONF_DIR 以及HIVE_AUX_JARS_PATH 参数:
1
2
3
4
5
6
7
8# 配置Hadoop安装路径
HADOOP_HOME=/root/software/hadoop
# 配置Hive配置文件存放路径
export HIVE_CONF_DIR=/root/software/hive/conf
# 配置Hive运行资源库路径
export HIVE_AUX_JARS_PATH=/root/software/hive/lib - 配置hive-site.xml:
1
2cp hive-default.xml.template hive-site.xml
vim hive-site.xml - 在hive-site.xml的configuration中添加:
1
2
3
4
5
6
7
8<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property> - 在hive-site.xml中修改(注意不是直接添加,否则默认值将覆盖修改值):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<!--连接元数据库的链接信息 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<!--连接数据库驱动 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<!--连接数据库用户名称 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<!--连接数据库用户密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property> - 数据库初始化:
schematool -initSchema -dbType mysql
- 连接测试:
hive
常见错误
修改后的配置文件需要同步到slave1与slave2上
格式化后无法启动namenode,查看logs/hadoop-root-namenode-master.log:
1
2020-07-17 20:05:05,892 WARN org.apache.hadoop.hdfs.server.common.Util: Path /root/hadoopData/name should be specified as a URI in configuration files. Please update hdfs configuration.
解决方法:
在hdfs-site.xml中,将/root/hadoopData/name改为file:/root/hadoopData/name即可。
hive无法启动,报错:
1
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
解决方法:
在hive-site.xml的configuration中添加:1
2
3
4
5
6
7
8<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>- 检查端口占用情况,使用
netstat -tpnl
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@master ~]# netstat -tpnl
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:2181 0.0.0.0:* LISTEN 23498/java
tcp 0 0 172.17.78.176:9000 0.0.0.0:* LISTEN 837/java
tcp 0 0 0.0.0.0:50090 0.0.0.0:* LISTEN 1208/java
tcp 0 0 172.17.78.176:3888 0.0.0.0:* LISTEN 23498/java
tcp 0 0 0.0.0.0:50070 0.0.0.0:* LISTEN 837/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1031/sshd
tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 19456/java
tcp 0 0 0.0.0.0:40634 0.0.0.0:* LISTEN 23498/java
tcp 0 0 0.0.0.0:8030 0.0.0.0:* LISTEN 19456/java
tcp 0 0 0.0.0.0:8031 0.0.0.0:* LISTEN 19456/java
tcp 0 0 0.0.0.0:8032 0.0.0.0:* LISTEN 19456/java
tcp 0 0 0.0.0.0:8033 0.0.0.0:* LISTEN 19456/java
tcp6 0 0 :::3306 :::* LISTEN 13962/mysqld 初始化Hive时,报错
schematool -dbType mysql -initSchema
:1
2
3
4
5
6
7
8
9
10
11
12SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:derby:;databaseName=metastore_db;create=true
Metastore Connection Driver : org.apache.derby.jdbc.EmbeddedDriver
Metastore connection User: APP
Starting metastore schema initialization to 2.1.0
Initialization script hive-schema-2.1.0.mysql.sql
Error: Syntax error: Encountered "<EOF>" at line 1, column 64. (state=42X01,code=30000)
org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!
Underlying cause: java.io.IOException : Schema script failed, errorcode 2
Use --verbose for detailed stacktrace.
*** schemaTool failed ***解决办法:
hive-default.xml.template
需要更名为hive-site.xml
,请注意hive-default.xml.template
头部的警告信息:- 在hive-site.xml中修改而非增加数据库连接信息,否则默认值将会覆盖修改值。
- 删除所有目录下的metastore_db目录,如下:
1
2
3/usr/local/apache-hive-2.1.1-bin/bin
/usr/local/apache-hive-2.1.1-bin/conf
/usr/local/apache-hive-2.1.1-bin/scripts/metastore/upgrade/mysql`
MySQL安装时报错
--initialize specified but the data directory has files in it. Aborting.
,请清空/etc/my.cnf中datadir对应的目录(/var/lib/mysql),如下:关于vim的使用:
- 启动vim后进入一般模式,按i插入,o在当前行后插入
- 在一般模式下,输入
/string
便可在文件中查找string,按下n查找下一个 - 一般模式下,按u撤销操作;dd删除当前行
- 一般模式下yy复制当前行,p粘贴到当前行
- 一般模式下,G跳转到文件末尾,gg跳转到文件开头
- 如需批量注释文件,可以按下
Ctrl+V
进入可视乎编辑,上下方向键雪中需要注释的行,Shift+I
在行首插入,输入#
后按esc返回即可
参考文档
Hadoop 完全分布式(Fully Distributed)安装
本文标题:Hadoop分布式集群搭建
文章作者:Raincorn
发布时间:2020-07-17
最后更新:2020-07-28
原始链接:https://blog.raincorn.top/2020/07/17/Hadoop_Stepup/
版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可