@R星校长
课程重点
HDFS 完全分布式搭建(熟练)
Hadoop 3.x 新特性(了解)
Hadoop Federation(了解)
Hadoop HA(掌握)
Hadoop HA 集群搭建(熟练)
java 客户端操作 HDFS(熟练)
HDFS 完全分布式搭建
规划
node1 | node2 | node3 | node4 |
---|---|---|---|
NameNode | SecondaryNameNode | ||
DataNode-1 | DataNode-2 | DataNode-3 |
- 基础设置
a) 网络
b) ssh: 哪个节点将公钥分发,成为启动 start-dfs.sh 脚本的主机和这个主机上的进程没有关系
c) jdk - 应用搭建
a) 部署&配置
b) 执行:
搭建步骤
免密钥设置
四台服务器之间互相均可以免密登录
a、 首先在四台服务器上都要执行:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
b、在 node1 上将 node1 的公钥拷贝到 authorized_keys 中:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
将该文件拷贝给 node2:
scp ~/.ssh/authorized_keys node2:/root/.ssh/
c、在 node2 中将 node2 的公钥追加到 authorized_keys 中:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
将该文件拷贝给 node3:
scp ~/.ssh/authorized_keys node3:/root/.ssh/
d、在 node3 中将 node3 的公钥追加到 authorized_keys 中:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
将该文件拷贝给 node4:
scp ~/.ssh/authorized_keys node4:/root/.ssh/
e、在 node4 中将 node4 的公钥追加到 authorized_keys 中:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
将该文件拷贝给 node1、node2、node3:
scp ~/.ssh/authorized_keys node1:/root/.ssh/
scp ~/.ssh/authorized_keys node2:/root/.ssh/
scp ~/.ssh/authorized_keys node3:/root/.ssh/
JDK 安装环境变量配置
首先将 node1 中的 hadoop-2.6.5 删除,或者通过快照还原到单机伪分布安装前的环境。
node1-node4
mkdir /opt/apps
将 jdk-8u221-linux-x64.rpm 上传到 node1/opt/apps
将 /opt/apps 下的 jdk.rpm scp 到 node2、node3、node4 的对应目录中
scp jdk-8u221-linux-x64.rpm node2:`pwd`
scp jdk-8u221-linux-x64.rpm node3:`pwd`
scp jdk-8u221-linux-x64.rpm node4:`pwd`
在 node1、node2、node3、node4 上安装 jdk 并配置 profile 文件
rpm -ivh jdk-8u221-linux-x64.rpm
将 hadoop 安装文件上传到 node1 的 /opt/apps 目录下,并解压到 /opt 目录下
tar -zxvf hadoop-2.6.5.tar.gz -C /opt
node1 上修改环境变量
export HADOOP_HOME=/opt/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
Node2 上修改环境变量:
export HADOOP_HOME=/opt/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
让配置文件生效:
source /etc/profile
将 node2 的 /etc/profile 拷贝到 node3、node4 上并执行 . /etc/profile
scp /etc/profile node[34]:`pwd`
Hadoop 相关配置
先在 node1 上配置好,然后将之 scp 到 node2-node4 上
cd /opt/hadoop-2.6.5/etc/hadoop/
- hadoop-env.sh 配置
$HADOOP_HOME/etc/hadoop
由于通过 SSH 远程启动进程的时候默认不会加载 /etc/profile 设置,
JAVA_HOME变量就加载不到,需要手动指定。
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
- 修改 slaves 指定 datanode 的位置
node2
node3
node4
- 修改 hdfs-site.xml
##指定 SNN 的位置
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
- 修改 core-site.xml
<configuration>
<!--用来指定hdfs的老大,namenode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<!-- 指定hadoop的临时目录位置-->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/bjsxt/hadoop/full</value>
</property>
</configuration>
- 拷贝到 node2-node4 上
##先将之打成压缩包
[root@node1 opt]# tar -zcvf hadoop-2.6.5.tar.gz hadoop-2.6.5/
##将 /opt/hadoop-2.6.5.tar.gz scp 到 node2、node3、node4 的对应目录中
scp hadoop-2.6.5.tar.gz node2:/opt
scp hadoop-2.6.5.tar.gz node3:/opt
scp hadoop-2.6.5.tar.gz node4:/opt
## node2、node3、node4 分别解压
tar -zxvf hadoop-2.6.5.tar.gz
格式化并启动
##格式化
##在 node1 上执行:
hdfs namenode -format
##启动即可(该命令在四台服务器上哪一台执行都可以)
start-dfs.sh
http://192.168.20.201:50070
[root@node1 opt]# hdfs dfs -mkdir -p /user/root
[root@node1 opt]# hdfs dfs -put hadoop-2.6.5.tar.gz /user/root
停止
stop-dfs.sh
Hadoop Federation(了解)联邦
NameNode 需要多少内存
问题:NameNode 需要多大的内存?
业界看法:1GB 内存放 1,000,000 block 元数据。
200 个节点的集群中每个节点有 24TB 存储空间,block 大小为 128MB,
block 复制因子为 3,能存储大概 12500,000 个 block(或更多)
:200×24,000,000 MB/(128MB×3)。此时,NameNode 内存大概需要 12.5GB。
5000 个节点的集群需要多大的 NameNode 的内存?
12.5*25=312.5GB
HDFS 组成
- Namespace
a) 包括目录,文件和 block 块。
b) 支持所有跟文件系统命名空间相关的操作
如:创建、删除、修改和列出文件及目录。
- Block 存储服务包含两部分:
a) NameNode 中的 block 块管理
i. 通过心跳机制和注册机制提供了对 DataNode 集群的管理。
ii. 处理 block 块报告,管理 block 块的位置。
iii. 提供跟 block 块相关的操作,如:创建、修改、删除和查询 block 块的位置。
iv. 管理 block 副本如何放置,当副本数少于指定值之后增加副本,
当副本数多于指定值之后删除副本。
b) 存储:
在 DataNode 本地文件系统中存储 block 块,并提供读/写访问。
- NameNode 节点之间是相互独立的联邦的关系,即它们之间不需要协调服务。
- DataNode 向集群中所有的 NameNode 注册,发送心跳和 block 块列表报告,处理来自 NameNode 的指令。
- 用户可以使用 ViewFs 创建个性化的命名空间视图,ViewFs 类似于在 Unix/Linux 系统中的客户端挂载表。
VERSION
namespaceID 用于标记 namenode 的 ID
blockpoolID 用于标记 block 存储池子的 ID
clusterID 集群的 ID
Hadoop-env.sh
配置 JAVA_HOME
core-site.xml 配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>viewfs://ClusterX</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./data</name>
<value>hdfs://node1:8020/data</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX