# Hadoop 安装部署

# 一、安装 Cloudera Enterprise 6.3.x

视频教程手摸手教你在Ubuntu 18.04中部署Cloudera Enterprise 6.2.x 跟你聊聊企业部署Hadoop的注意事项CDH (opens new window)

# 1.1 安装Ubuntu 18.04.4 LTS

前往https://ubuntu.com/download/desktop 下载最新版本的Ubuntu 18.04.4 LTS (opens new window)

做一些必要配置

# 安装ssh
sudo apt-get install ssh
service sshd start

# 替换163源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 在/etc/apt/sources.list文件前面添加如下条目
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

# 更新
sudo apt-get update
sudo apt-get upgrade
apt install net-tools

# 关闭防火墙
systemctl stop ufw
systemctl disable ufw

# 允许root用户登录
vim /etc/ssh/sshd_config

# 设置 PermitRootLogin 为yes
PermitRootLogin yes
PasswordAuthentication yes
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
34

# 1.2 配置CDH源

因为国内访问官方镜像实太慢,我们需要把安装包下载到本地然后在本地启一个镜像站点。

下载Cloudera Manager 6包并解压

mkdir -p cloudera-repos/cm6
wget https://archive.cloudera.com/cm6/6.3.1/repo-as-tarball/cm6.3.1-ubuntu1804.tar.gz
tar xvfz cm6.3.1-ubuntu1804.tar.gz -C cloudera-repos/cm6 --strip-components=1
chmod -R ugo+rX cloudera-repos/cm6
1
2
3
4

下载CDH 6的包

wget --recursive --no-parent --no-host-directories https://archive.cloudera.com/cdh6/6.3.2/ubuntu1804/ -P cloudera-repos
wget --recursive --no-parent --no-host-directories https://archive.cloudera.com/gplextras6/6.3.2/ubuntu1804/ -P cloudera-repos
chmod -R ugo+rX cloudera-repos/cdh6
chmod -R ugo+rX cloudera-repos/gplextras6
1
2
3
4

临时起一个Http服务

python3 -m SimpleHTTPServer 8900
1

在Ubuntu中创建资源文件,并指向我们临时创建的http服务

vim /etc/apt/sources.list.d/cloudera-repo.list

#内容如下
deb [arch=amd64] http://192.168.50.76:8900/cloudera-repos/cm6/ bionic-cm6.3.1 contrib
1
2
3
4

添加GPG key

wget https://archive.cloudera.com/cm6/6.3.1/ubuntu1604/apt/archive.key
apt-key add archive.key
1
2

最后更新一下源即可

apt-get update
1

# 1.3 安装 Cloudera Manager Server

# 安装JDK
apt-get install openjdk-8-jdk
# 或 apt-get install oracle-j2sdk1.8

apt-get install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server
1
2
3
4
5

# 1.4 安装mariadb数据库

apt-get install mariadb-server

# 系统启动的时候自动启动 mariadb
systemctl enable mariadb

# 设置root账号密码
/usr/bin/mysql_secure_installation
1
2
3
4
5
6
7

以下是官方需要数据库的服务清单

Databases for Cloudera Software
Service Database User
Cloudera Manager Server scm scm
Activity Monitor amon amon
Reports Manager rman rman
Hue hue hue
Hive Metastore Server metastore hive
Sentry Server sentry sentry
Cloudera Navigator Audit Server nav nav
Cloudera Navigator Metadata Server navms navms
Oozie oozie oozie

根据实际情况创建即可

CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY 'scm';
CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON hue.* TO 'hue'@'%' IDENTIFIED BY 'hue';
CREATE DATABASE hive DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';
FLUSH PRIVILEGES;
1
2
3
4
5
6
7

# 1.5 初始化 Cloudera Manager的数据库

安装Jdbc驱动

apt-get install libmysql-java
1

初始化

/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm
1

# 1.6 安装CDH

启动 CM Server,日志路径/var/log/cloudera-scm-server/cloudera-scm-server.log

注意把host文件多余指向127.0.0.1的记录删掉,否则会出现 Unable to retrieve non-local non-loopback IP address 错误

systemctl start cloudera-scm-server
1

接着访问 CM的管理页面 http://localhost:7180/ 默认用户名密码 admin admin

因为网络的关系,我们还是要实现下好CDH的Parcel

wget https://archive.cloudera.com/cdh6/6.3.2/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554-bionic.parcel
wget https://archive.cloudera.com/cdh6/6.3.2/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554-bionic.parcel.sha1
wget https://archive.cloudera.com/cdh6/6.3.2/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554-bionic.parcel.sha256
wget https://archive.cloudera.com/cdh6/6.3.2/parcels/manifest.json
1
2
3
4

# 1.7 Cloudera Manager许可证管理

在前面的安装时,在版本说明页面有三个选项:Cloudera Express、Cloudera Enterprise数据集线器60天试用版和Cloudera Enterprise。Cloudera Express版本不需要许可证,试用版使用的是60天的试用许可证;Cloudera Enterprise需要许可证。我们选择的是默认配置的60天试用版。如果到了60天期限,是不是Cloudera Manager就完全不能用了呢?本小节就来介绍一下Cloudera Manager的许可证管理。

Cloudera Enterprise,也就是所谓的企业版有如下Express版本不具有的特性:

  • 支持LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)和SAML(Security Assertion Markup Language,安全声明标记语言)身份认证。Cloudera Manager可以依赖内部数据库进行身份认证,企业版还支持通过LDAP和SAML等外部服务进行身份认证。
  • 浏览和还原配置历史。无论何时,当你改变并保存了一系列关于服务、角色或主机的配置信息,Cloudera Manager都会自动保存前一个版本的配置和更改配置的用户名。这样就可以浏览以前的配置,并且在需要时可以回滚到以前的配置状态。
  • 支持SNMP traps报警和用户定制的报警脚本。当预制定阈值越界等情况出现时,可以在任何时候向SNMP管理器报告错误情况,而不用等待SNMP管理器的再次轮询。
  • 备份与崩溃恢复。Cloudera Manager企业版提供了一套集成的、易用的、Hadoop平台上的数据保护解决方案。Cloudera Manager允许跨数据中心的数据复制,包括HDFS里的数据、Hive表中的数据、Hive元数据、Impala元数据等。即使遇到一个数据中心都当掉的情况,仍然可以保证这些关键数据是可用的。
  • 能够建立操作报告。在企业版Cloudera Manager的报告页面,可以建立HDFS的使用报告,包括每个用户、组或者目录的文件数及数据大小等信息,还可以报告MapReduce的操作情况。
  • 支持Cloudera导航。Cloudera导航是一个与Hadoop平台完全集成的数据管理和安全系统,包括数据的审计、可视化、加密、搜索、分析等数据管理功能。
  • 只有企业版支持Rolling Restart、History and Rollback和Send Diagnostic Data操作命令。
  • 提供集群使用报告。企业版Cloudera Manager的集群使用报告页面显示汇总的YARN和Impala作业使用信息。报告还显示CPU、内存的使用情况,基于YARN fair调度器的资源分配情况,Impala查询等,可以配置报告的时间范围。

登录Cloudera Manager后,选择“管理”→“许可证”菜单,就访问到许可证页面。如果已经安装了许可证,该页面将显示许可证的状态(如当前是否有效)和许可证的属主、密钥、过期时间等细节信息。

如果企业版的许可证过期,Cloudera Manager仍然可以使用,只是企业版特性将不可用。试用版许可证只能使用一次,当60天试用期满,或者手工结束试用,将不能再次开启试用。试用结束后,企业版特性立即不可用,但是被禁用功能的相关数据和配置并不删除,一旦安装了企业版许可证,这些功能会再次生效。

# 二、安装开源版Hadoop

系统:CentOS 7

组件 node01 node02 node03
HDFS NameNode DataNode DataNode SecondaryNameNode DataNode
YARN NodeManager JobHistoryServer ResourceManager NodeManager NodeManager

# 2.1 前置配置

传送门

# 2.2 Hadoop 下载

Hadoop (opens new window)官方下载最新版,然后解压

[root@node01 ~]$ wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz
[root@node01 ~]# tar -xzf hadoop-3.3.5.tar.gz
[root@node01 hadoop]# xcall chown hadoop:hadoop -R /opt/hadoop-3.3.5
[root@node01 ~]# ln -s hadoop-3.3.5 hadoop
1
2
3
4

/etc/profile.d/my_env.sh中增加hadoop相关变量

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
1
2
3
4

# 2.3 配置用户sudo权限

传送门

# 2.4 ssh免密登陆

传送门

# 2.5 复制文件清单

xsync /etc/environment
xsync /etc/profile.d/my_env.sh
xsync /opt/jdk1.8.0_301
xsync /etc/hosts
xsync /opt/hadoop/
1
2
3
4
5

# 2.6 配置文件

默认配置文件

默认文件 jar包中的位置
core-default.xml hadoop/share/hadoop/common/hadoop-common-3.3.1.jar
hdfs-default.xml hadoop/share/hadoop/hdfs/hadoop-hdfs-3.3.1.jar
yarn-default.xml hadoop/share/hadoop/yarn/hadoop-yarn-common-3.3.1.jar
mapred-default.xml hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.1.jar

自定义配置文件

core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上

# 2.7 核心配置

/opt/hadoop/etc/hadoop/core-site.xml 核心文件

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

/opt/hadoop/etc/hadoop/hdfs-site.xml

<configuration>
    <!-- nn web端访问地址--> 
    <property>
        <name>dfs.namenode.http-address</name>
        <value>node01:9870</value> 
    </property>
    
    <!-- 2nn web 端访问地址--> 
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node02:9868</value> 
    </property>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13

/opt/hadoop/etc/hadoop/yarn-site.xml

<configuration>
    <!-- 指定 MR 走 shuffle --> 
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value> 
    </property>
    <!-- 指定 ResourceManager 的地址--> 
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node01</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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/opt/hadoop/etc/hadoop/mapred-site.xml

<configuration>
    <!-- 指定 MapReduce 程序运行在 Yarn 上 --> 
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
   </property>

    <property>
        <name>mapreduce.application.classpath</name>
        <value>/opt/hadoop/share/hadoop/mapreduce/*</value>
    </property>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12

分发配置好的文件

xsync /opt/hadoop/etc/hadoop/
1

# 2.8 配置workers

2.x系列文件名叫slaves

[root@node01 etc]# cat /opt/hadoop/etc/hadoop/workers
node01
node02
node03

[root@node01 etc]# xsync /opt/hadoop/etc/hadoop/workers
1
2
3
4
5
6

# 2.9 启动集群

(1) 初始化

仅第一次启动需要该步骤,初始化以后目录新增datalogs目录

$HADOOP_HOME/bin/hdfs namenode -format

# BTW 日志目录可以单独设置
node01-➜ vim /opt/hadoop/etc/hadoop/hadoop-env.sh
export HADOOP_LOG_DIR=/opt/hdp-data/hadoop-node01/logs
1
2
3
4
5

(2) 启动HDFS

$HADOOP_HOME/sbin/start-dfs.sh
1

如果出现以下错误,说明你是用root启动的,可以参考这里 (opens new window)解决

ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
1
2

jps看下进程

[root@node01 ~]# xcall jps
================current host is node01=================
--> excute command "jps"
11488 DataNode
16178 Jps
11299 NameNode
================current host is node02=================
--> excute command "jps"
5635 SecondaryNameNode
17833 Jps
5483 DataNode
================current host is node03=================
--> excute command "jps"
4950 DataNode
9101 Jps
excute successfully !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

访问HDFS WebUI http://node01:9870/

(3) 启动 YARN

登陆salve01启动yarn

[hadoop@node01 ~]$ $HADOOP_HOME/sbin/start-yarn.sh
1

jps查看

[tpxcer@node01 root]$ xcall jps
================current host is node01=================
--> excute command "jps"
11488 DataNode
11299 NameNode
16900 ResourceManager
17064 NodeManager
17563 Jps
================current host is node02=================
--> excute command "jps"
17986 NodeManager
5635 SecondaryNameNode
5483 DataNode
18207 Jps
================current host is node03=================
--> excute command "jps"
9476 Jps
4950 DataNode
9255 NodeManager
excute successfully !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

查看YARN的WebUI http://node01:8088/cluster

# 2.10 群集基本测试

(1) 上传文件到群集

hadoop fs -mkdir /input
hadoop fs -put README.txt /input
1
2

(2) 拼接数据

二进制文件可以通过cat拼接

cat blk_xxxx1 >> tmp.tar.gz
cat blk_xxxx2 >> tmp.tar.gz
cat blk_xxxx3 >> tmp.tar.gz

tar xzf tmp.tar.gz
1
2
3
4
5

(3) 执行wordcount

[tpxcer@node01 ~]$ cd /opt/hadoop
[tpxcer@node01 hadoop]$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.5.jar wordcount /input /wcoutput
1
2

# 2.11 配置历史服务器

/opt/hadoop/etc/hadoop/mapred-site.xml配置历史服务器

    <!-- 历史服务器端地址 --> 
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>node01:10020</value> 
    </property>
    <!-- 历史服务器 web 端地址 --> 
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>node01:19888</value> 
    </property>
1
2
3
4
5
6
7
8
9
10

分发配置

[tpxcer@node01 hadoop]$ xsync /opt/hadoop/etc/hadoop/mapred-site.xml
1

启动历史服务器

# 先把yarn关掉
[tpxcer@node01 hadoop]$ stop-yarn.sh
# 再启动yarn后,接着启动historyserver
[tpxcer@node01 hadoop]$ start-yarn.sh
[tpxcer@node01 hadoop]$ mapred --daemon start historyserver
# 如果是Hadoop2.0用以下命令启动
[tpxcer@node01 hadoop]$ sbin/mr-jobhistory-daemon.sh start historyserver
[tpxcer@node01 hadoop]$ jps
77456 NameNode
110944 Jps
108740 NodeManager
77625 DataNode
110799 JobHistoryServer
1
2
3
4
5
6
7
8
9
10
11
12
13

访问历史服务器WebUI:http://node01:19888/

# 2.12 配置日志聚集

配置/opt/hadoop/etc/hadoop/yarn-site.xml

    <!-- 开启日志聚集功能 --> 
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 设置日志聚集服务器地址 --> 
    <property>
        <name>yarn.log.server.url</name> 
        <value>http://node01:19888/jobhistory/logs</value>
    </property>
    <!-- 设置日志保留时间为 7 天 --> 
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

分发配置

[tpxcer@node01 hadoop]$ xsync /opt/hadoop/etc/hadoop/yarn-site.xml
1

重启服务

[tpxcer@node01 hadoop]$ mapred --daemon stop historyserver
[tpxcer@node01 hadoop]$ stop-yarn.sh
[tpxcer@node01 hadoop]$ start-yarn.sh
[tpxcer@node01 hadoop]$ mapred --daemon start historyserver
1
2
3
4

# 2.13 Web UI访问汇总

服务 URL
HDFS http://node01:9870/ (opens new window)
YARN http://node01:8088/cluster (opens new window)
YARN 历史服务 http://node01:19888/ (opens new window)

# 2.14 Hadoop 群集启停脚本

[tpxcer@node01 script]$ cat myhadoop.sh
#!/bin/bash
if [ $# -lt 1 ]
then
   echo "No Args Input..."
exit ;
fi

case $1 in
"start")
    echo " =================== 启动 hadoop 集群 ==================="
    echo " --------------- 启动 hdfs ---------------"
    ssh node01 "$HADOOP_HOME/sbin/start-dfs.sh"
    echo " --------------- 启动 yarn ---------------"
    ssh node01 "$HADOOP_HOME/sbin/start-yarn.sh"
    echo " --------------- 启动 historyserver ---------------"
    ssh node01 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
    ;;
"stop")
    echo " =================== 关闭 hadoop 集群 ==================="
    echo " --------------- 关闭 historyserver ---------------"
    ssh node01 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"
    echo " --------------- 关闭 yarn ---------------"
    ssh node01 "$HADOOP_HOME/sbin/stop-yarn.sh"
    echo " --------------- 关闭 hdfs ---------------"
    ssh node01 "$HADOOP_HOME/sbin/stop-dfs.sh"
    ;;
*)
    echo "Input Args Error..."
;; esac
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

# 三、最佳实践

# 3.1 HDFS 参数调优

  1. 节点间数据均衡

对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。

start-balancer.sh -threshold 10
1

停止数据均衡命令:

stop-balancer.sh
1
  1. 磁盘间数据均衡
# 生成均衡计划(只有一块磁盘,不会生成计划)
hdfs diskbalancer -plan node01
# 执行均衡计划
hdfs diskbalancer -execute node01.plan.json
# 查看当前均衡任务的执行情况
hdfs diskbalancer -query node01
# 取消均衡任务
hdfs diskbalancer -cancel node01.plan.json
1
2
3
4
5
6
7
8
  1. hdfs-site.xml文件中配置多目录

HDFS的DataNode节点保存数据的路径由dfs.datanode.data.dir参数决定,其默认值为 file://${hadoop.tmp.dir}/dfs/data,若服务器有多个磁盘,必须对该参数进行修改。如服务器磁盘如上图所示,则该参数应修改为如下的值。

<property>
    <name>dfs.datanode.data.dir</name>
<value>file:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value>
</property>
1
2
3
4

注意:每台服务器挂载的磁盘不一样,所以每个节点的多目录配置可以不一致。单独配置即可。

  1. HDFS参数调优hdfs-site.xml

NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。

<property>
    <name>dfs.namenode.handler.count</name>
    <value>10</value>
</property>
1
2
3
4

可以通过导数公式计算,例如群集规模为8,则需要设置为41,公式如下,以python为例

>>> import math
>>> print int(20*math.log(8))
41
>>> quit()
1
2
3
4

# 3.2 YARN 参数调优 yarn-site.xml

  1. 单节点可用内存
<!-- NodeManager 使用内存数,默认 8G,修改为 4G 内存 -->
<property>
    <description>Amount of physical memory, in MB, that can be allocated for containers. If set to -1 and yarn.nodemanager.resource.detect-hardware-capabilities is true, it is automatically calculated(in case of Windows and Linux). In other cases, the default is 8192MB.</description>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
</property>
1
2
3
4
5
6
  1. 单个任务可申请的最多物理内存量
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>2048</value>
</property>
1
2
3
4
更新时间: 6/15/2023, 3:43:14 PM