Featured image of post Linux 下的 Hadoop 配置

Linux 下的 Hadoop 配置

Hadoop 完全分布式集群配置教程(JDK、网络、免密登录、环境变量、本地/伪分布/完全分布模式)

1. 基本配置

一切操作都是基于 root 用户下。

一、需要下载的工具

  • net-tools(获取 IP 的工具)
    yum -y install net-tools(需要配置网络后)

  • openssh-server(免密登录所需)
    yum -y install openssh-server(需要配置网络后)

  • jdk(Java 环境)

  • hadoop(集群环境)

二、需要更改的配置

连接网络

  • 如果是最小化安装,一开始没有 IP。
    ip addr(查看网卡名称,如 ens33
    进入 /etc/sysconfig/network-scripts/
    vi ifcfg-ens33(编辑你的网卡信息)
    ONBOOT=no 改为 ONBOOT=yes(启用网卡开机自启)
    ifup ens33(因为之前网卡没自启,启用网卡)
    systemctl restart network(重启网络,也可 service network restart
    尝试 ping 外网:ping www.baidu.com 看是否成功。
虚拟机内 ping 不通的排查
  1. ping 127.0.0.1 不通 → 网卡问题
  2. 检查网卡设置是否正确
  3. 桥接网络静态 IP 可能有问题;NAT 模式检查主机的 VMware NAT Service / VMware DHCP Server 服务是否开启
  4. 如果是复制的虚拟机,记得修改 MAC 地址:ip addr 查看,先在虚拟机设置中刷新 MAC,再修改 HWADDR=
  5. UUID 是否要改?可用 uuidgen ens33 生成新的 UUID。

关闭防火墙

1
2
3
4
systemctl stop firewalld          # 关闭防火墙
systemctl disable firewalld       # 禁用防火墙开机自启
# 关闭 SELinux
vi /etc/selinux/config            # 将 SELINUX=enforcing 改为 SELINUX=disabled

免密登录

1
2
3
ssh localhost                     # 生成 .ssh 目录(记得退出)
ssh-keygen -t rsa                 # 生成 RSA 公私钥
ssh-copy-id hostname@ip           # 将公钥发送给要免密登录的主机(包括自己 localhost)

配置 JAVA 环境变量

  • (全部用户)在 /etc/profile.d/ 中创建一个 .sh 文件(例如 java_env.sh)。/etc/profile 会自动遍历该目录下所有 .sh 文件。
  • (单个用户,推荐)在 ~/.bashrc 中添加环境变量。
1
2
3
# JAVA_HOME
export JAVA_HOME=/opt/software/jdk1.8.0   # 你的 JDK 路径
export PATH=$PATH:$JAVA_HOME/bin

之后执行 source java_env.shsource ~/.bashrc,再运行 java -version 测试是否成功。

配置 hadoop 环境变量

1
2
3
4
# HADOOP_HOME
export HADOOP_HOME=/opt/software/hadoop   # 你的 Hadoop 路径
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

同样添加到 hadoop_env.sh~/.bashrcsource 后运行 hadoop 查看是否有显示。

三、可选的配置更改

静态 IP

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33   # 最后为你的网卡名

修改内容:

1
2
3
4
5
BOOTPROTO=static                    # 改为 static
IPADDR=192.168.37.101               # 你要的 IP
NETMASK=255.255.255.0               # 子网掩码,也可用 PREFIX=24
GATEWAY=192.168.37.2                # 网关(VMware 虚拟网络编辑器 → VMnet8 查看)
DNS1=192.168.37.2                   # 与网关相同

yum 换源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 备份默认源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下载阿里云源(CentOS 7 示例)
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 清除缓存并生成新缓存
yum clean all
yum makecache
yum update

2. Hadoop 运行

1. 本地模式

  • 单机运行,一般只演示官方案例。
  • 不配置文件

2. 伪分布模式

  • 也是单机运行,但具备 Hadoop 集群的所有功能,一台机器模拟分布式环境。一般用于测试,实际项目中不用。

需要

  • SSH 免密登录
  • 修改配置文件 core-site.xmlhdfs-site.xml
  • NameNode 格式化
  • 明确启动用户,修改 hadoop-env.sh
  • 若包含 YARN,还需修改 yarn-site.xmlmapred-site.xmlyarn-env.sh
注意
  • 若运行实例出现 code 143,可能为内存不足。
  • 一旦重新启动 YARN,之前运行过的程序运行情况将无法查看(输出结果还在)。配置历史服务器可保留,需修改 mapred-site.xml

配置文件

core-site.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<configuration>
  <!-- 指定 NameNode 的地址 -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:8020</value>
  </property>
  <!-- 指定 hadoop 数据的存储目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/module/hadoop-3.1.3/data</value>
  </property>
  <!-- 配置 HDFS 网页登录使用的静态用户为 root -->
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
  </property>
</configuration>

hdfs-site.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<configuration>
  <!-- NameNode web 端访问地址 -->
  <property>
    <name>dfs.namenode.http-address</name>
    <value>master:9870</value>
  </property>
  <!-- 文件数据副本数 -->
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

NameNode 格式化

1
2
3
hdfs namenode -format
# 若不是第一次格式化,要先将 /.../hadoop/ 下的 data 和 logs 删除,再格式化
# 别忘了先 stop-all.sh

明确启动用户(HDFS)

hadoop-env.sh 末尾添加:

1
2
3
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root

yarn-site.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<configuration>
  <!-- 指定 mapreduce 走 shuffle -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <!-- 指定 ResourceManager 的地址 -->
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
  </property>
  <!-- 环境变量的继承 -->
  <property>
    <name>yarn.nodemanager.env-whitelist</name>
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  </property>
</configuration>

mapred-site.xml(包含历史服务器配置)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<configuration>
  <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <!-- 历史服务器端地址 -->
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
  </property>
  <!-- 历史服务器 web 端地址 -->
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
  </property>
</configuration>

启动历史服务器

1
mapred --daemon start historyserver

明确启动用户(YARN)

yarn-env.sh 末尾添加:

1
2
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

3. 完全分布模式

节点HDFS 角色YARN 角色
masterNameNode, DataNodeNodeManager
slave1DataNodeResourceManager, NodeManager
slave2SecondaryNameNode, DataNodeNodeManager

需要

  • 修改主机名

  • 配置 IP 映射

  • 修改配置文件

    • core-site.xml
    • hdfs-site.xml
    • yarn-site.xml
    • mapred-site.xml
    • workers
  • 指定进程用户

  • 互相免密登录

  • 使用 rsync/scp 分发配置

  • 启动集群(格式化 NameNode → 启动 HDFS → 启动 YARN → 启动历史服务器)

    • 启动集群效果
    • master
      • jps
      • NodeManager
      • DataNode
      • NameNode
    • slave1
      • jps
      • ResourceManager
      • NodeManager
      • DataNode
    • slave2
      • jps
      • SecondaryNameNode
      • NodeManager
      • DataNode
    • Web 端
      • HDFS master 主机 IP:9870
      • YARN slave1 主机 IP:8088
      • 历史服务 master 主机 IP:19888
  • 时间同步(NTP)

配置文件

修改主机名

1
2
vi /etc/hostname
# 分别改为 master, slave1, slave2(方便区分即可)

配置 IP 映射

1
2
3
4
5
6
7
vi /etc/hosts
# 需要在每台主机的 hosts 中添加
# 添加以下内容(IP 换成你的实际地址)
192.168.37.101  master
192.168.37.102  slave1
192.168.37.103  slave2
# 重启使配置生效(reboot)

修改配置文件

若已配置伪分布,请删除 /.../hadoop 下的 datainputlogsoutput 或重新解压 Hadoop。

core-site.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<configuration>
<!-- 指定 NameNode 的地址 -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:8020</value>
  </property>
<!-- 指定 hadoop 数据的存储目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/.../hadoop/data</value>
  </property>
<!-- 配置 HDFS 网页登录使用的静态用户为 root -->
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
  </property>
</configuration>
hdfs-site.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<configuration>
<!-- NameNode web 端访问地址-->
  <property>
    <name>dfs.namenode.http-address</name>
    <value>master:9870</value>
  </property>
<!-- SecondaryNameNode web 端访问地址-->
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>slave2:9868</value>
  </property>
<!-- 文件数据副本数 -->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
</configuration>
yarn-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
25
26
27
28
29
30
31
32
33
<configuration>
<!-- 指定 mapreduce 走 shuffle -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
<!-- 指定 ResourceManager 的地址-->
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>slave1</value>
  </property>
<!-- 环境变量的继承 -->
  <property>
    <name>yarn.nodemanager.env-whitelist</name>
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  </property>
  <!-- 开启日志聚集功能 -->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
<!-- 设置日志聚集服务器地址 -->
  <property>
    <name>yarn.log.server.url</name>
    <value>http://master:19888/jobhistory/logs</value>
  </property>
<!-- 设置日志保留时间为 7 天 -->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
  </property>
</configuration>
<!-- 与伪分布式相比添加了一个日志聚焦,程序运行完成时,都会产生日志,日志聚焦就是 把日志信息上传到 HDFS 文件系统上,方便查看程序运行详情,方便排错和开发调试。 -->
mapred-site.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
<!-- 历史服务器端地址 -->
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
  </property>
<!-- 历史服务器 web 端地址 -->
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
  </property>
</configuration>
workers 文件
1
2
3
4
5
6
vi /.../hadoop/etc/hadoop/workers
# 注意:文件中每行末尾不能有空格,不允许有空行。
# localhost 可保留可以删除(建议删除)。添加下列主机名
master
slave1
slave2
指定进程用户

hadoop-env.sh 末尾添加:

1
2
3
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root

yarn-env.sh 末尾添加:

1
2
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

互相免密登录

参考伪分布式部分,确保 master、slave1、slave2 之间均能免密 SSH 登录。

远程同步配置(使用 scp)

1
2
3
4
5
6
7
# 附:目前是在 root 环境下进行安装
# scp -r(传输文件夹) 文件夹路径 用户@其他主机的ip:要传到的路径
# 将已经修改好的配置文件传给其他主机,减少工作量
scp -r /.../hadoop/etc/hadoop root@slave1:/.../hadoop/etc

# 传输环境配置
scp -r /etc/profile.d root@slave1:/etc/

启动集群

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# # 若 /.../hadoop 下有 date 和 logs 先删除(说明之前格式化过)
# 格式化 NameNode(只在 master 执行一次)
hdfs namenode -format

# 启动 HDFS(在 master 执行),具体根据配置文件来
start-dfs.sh

# 在配置了 ResourceManager 的节点(slave1)上启动 Yarn
# 具体根据配置文件来
# 若碰到提示 known hosts 请检查 ssh 免密登录
start-yarn.sh

# 启动历史服务器(在 master 执行),具体根据配置文件来
mapred --daemon start historyserver

启动后进程检查(jps

  • masterNodeManagerDataNodeNameNodeJobHistoryServer
  • slave1ResourceManagerNodeManagerDataNode
  • slave2SecondaryNameNodeNodeManagerDataNode

Web 端访问地址

  • HDFS:http://master:9870
  • YARN:http://slave1:8088
  • 历史服务器:http://master:19888

时间同步(NTP)

1
2
3
4
# 所有节点安装 ntp
yum -y install ntp
# 设置时间为亚洲上海
timedatectl set-timezone Asia/Shanghai

主节点(master)配置 /etc/ntp.conf 添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 添加以下内容
# 允许 192.168.37.x 这一网段,即与主机同一网段的机器同步该主机的时间
restrict 192.168.37.0 mask 255.255.255.0 nomodify notrap

# 该主机使用的时间服务器为阿里提供的公网 NTP 服务器(可不用)
server ntp1.aliyun.com iburst

#如果集群是在一个封闭的局域网内,可以屏蔽掉默认的server:
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

启动主节点 NTP 服务:

1
2
3
4
systemctl start ntpd
systemctl enable ntpd
# 查看 ntp 的状态
systemctl status ntpd

其他节点同步

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
方案一:
# 其他从节点停止并禁用 ntp 服务
systemctl stop ntpd
systemctl disable ntpd
# 同步主节点时间
ntpdate master


方案二:
# 将本地的硬件时间也作为同步的时间源之一
master(主节点)配置:server 127.127.1.0
master(主节点)配置:fudge 127.127.1.0 stratum 10

# 删除或注释以下配置项
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

#添加
server master
ntpdate master #同步时间
service ntpd start #启动 ntpd 时间服务器
查看与时间同步服务器的时间偏差
1
2
3
4
5
6
7
8
9
ntpdc -c loopinfo
#
# offset: 0.001014 s #时间偏差极小,即同步了
# frequency: 29.720 ppm
# poll adjust: 30
# watchdog timer: 929 s

# 或
ntpdate master # 同步时间时会显示时间偏差
设置定时任务可设置定时任务:
1
2
3
crontab -e
# 每天 00:00 同步一次(master 不行的话直接写 IP)
00 00 * * * /usr/sbin/ntpdate master
1
2
3
4
5
6
7
8
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

4. Hadoop 常见问题汇总

原文档此处未展开,保留标题。


3. Hive 及数据可视化

一、需要的安装包

Docker 容器(简化软件安装部署)

Docker 可以帮助开发人员快速构建轻量级和可移植的软件容器,简化应用程序开发、测试和部署等环节。它提供轻量级执行环境,共享操作系统内核但彼此独立运行。

二、不使用 Docker 容器

原文档至此结束。