HDFS原理
简言之,HDFS是通过整合多个低成本硬件,从而实现数据的冗余存储,提高容错性和吞吐量的分布式文件系统。类似于RAID。
集群环境搭建
准备工作
- 三台云主机:hadoop001, hadoop002, hadoop003(以hadoop001为master,所以内存配置相对要高一些),系统CentOS 7.6
- 三台主机上分别创建hadoop账户,拥有sudo权限(后面会以这个账号登录)
- Hadoop CDH 2.6版本: hadoop-2.6.0-cdh5.15.2.tar.gz
- JDK: jdk-8u231-linux-x64.tar.gz
搭建步骤
配置系统环境
- 修改hadoop001上的/etc/hosts,加上hadoop001-003的映射(使用内网IP)
- hadoop001上生成RSA秘钥,并copy到hadoop001, 002, 003上
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop001 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop002 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop003
- 解压hadoop tar包,到/usr/app/目录
sudo tar -xvf hadoop-2.6.0-cdh5.15.2.tar.gz -C /usr/app
- 解压jdk到/usr/app目录
sudo tar -xvf jdk-8u231-linux-x64.tar.gz -C /usr/app
- 修改/etc/profile,末尾添加
export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2 export JAVA_HOME=/usr/app/jdk1.8.0_231 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH
- 执行source /etc/profile,使修改立刻生效
配置Hadoop
进入 ${HADOOP_HOME}/etc/hadoop
目录下,修改配置文件。各个配置文件内容如下:
- hadoop-env.sh
# 指定JDK的安装位置 export JAVA_HOME=/usr/app/jdk1.8.0_231/
- core-site.xml
<configuration> <property> <!--指定 namenode 的 hdfs 协议文件系统的通信地址--> <name>fs.defaultFS</name> <value>hdfs://hadoop001:8020</value> </property> <property> <!--指定 hadoop 集群存储临时文件的目录--> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> </property> </configuration>
- hdfs-site.xml
<property> <!--namenode 节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔--> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/namenode/data</value> </property> <property> <!--datanode 节点数据(即数据块)的存放位置--> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/datanode/data</value> </property>
- yarn-site.xml
<configuration> <property> <!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。--> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <!--resourcemanager 的主机名--> <name>yarn.resourcemanager.hostname</name> <value>hadoop001</value> </property> </configuration>
- mapred-site.xml,从template copy
cp mapred-site.xml.template mapred-site.xml
<configuration> <property> <!--指定 mapreduce 作业运行在 yarn 上--> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
- slaves
配置所有从属节点的主机名或 IP 地址,每行一个。所有从属节点上的 DataNode 服务和 NodeManager 服务都会被启动。hadoop001 hadoop002 hadoop003
分发
- 将hadoop001上/etc/hosts中配置的映射关系,copy到hadoop002, 003的/etc/hosts
- 将 Hadoop 安装包分发到其他两台服务器,分发后建议在这两台服务器上也配置一下 Hadoop 的环境变量
# 将安装包分发到hadoop002 scp /etc/profile root@hadoop002:/etc/profile scp -r /usr/app/ root@hadoop002:/usr # 将安装包分发到hadoop003 scp /etc/profile root@hadoop002:/etc/profile scp -r /usr/app/ root@hadoop003:/usr
启动
- 打开防火墙和相关端口
# 开启防火墙 sudo systemctl start firewalld # 开放50010端口(否则数据块只能存在NameNode上) sudo firewall-cmd --add-port=50010/tcp --permanent # 开放hadoop001的8020端口,让hadoop002, 003可以连接 sudo firewall-cmd --add-port=8020/tcp --permanent
- hadoop001上执行NameNode初始化
hdfs namenode -format
- 启动集群
进入到 Hadoop001 的 ${HADOOP_HOME}/sbin 目录下,启动 Hadoop。此时 hadoop002 和 hadoop003 上的相关服务也会被启动:# 启动dfs服务 start-dfs.sh # 启动yarn服务 start-yarn.sh
验证
-
jps查看进程
hadoop001上运行jps,可以看到
hadoop002, 003上运行jps,可以看到
-
开启
50070
对外端口,然后登陆验证hadoop001:50070sudo firewall-cmd --add-port=50070/tcp --permanent
可以看到Live Nodes的数量正确,就说明配置成功
点击进入Live Node,可以看到每个Node的运行情况
-
提交任务到集群
# hadoop001上运行 hadoop jar /usr/app/hadoop-2.6.0-cdh5.15.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.15.2.jar pi 3 3
得到正确的结果
常用命令
-
查看:
hdfs dfs -ls xxx
-
创建目录:
hdfs dfs -mkdir -p /xxx/xxx
hdfs dfs -mkdir /user/hadoop/files
-
看文件:
hdfs dfs -cat xxx / hdfs dfs -text xxx
-
上传文件:
hdfs dfs -put local cluster
hdfs dfs -put ./hadoop-2.6.0-cdh5.15.2.tar.gz /user/hadoop/files/
之后可以到50070管理工具下的Utilities -> Browse File System查看已上传的文件
-
下载文件:
hdfs dfs -get cluster local
-
copy:
hdfs dfs -cp /xxx/xxx /xxx/xxx
-
chmod:
hdfs dfs -chmod -R 777 /xxx
-
chown:
hdfs dfs -chown -R zyh:zyh /xxx
-
离开安全模式:
hadoop dfsadmin -safemode leave
-
恢复namenode元数据:
hadoop namenode -recover
注意事项
安全隐患
Yarn该版本有漏洞,8088
端口会被嗅探到变成挖坑机,建议不要轻易开启改端口,并设置IP防火墙规则
端口
作为master的hadoop001需要开放的端口:8020, 50010, 50070
作为slaves的hadoop002, 003需要开放的端口:50010
查看日志
如果遇到NameNode, DataNode无法正常启动的情况,建议看一下hadoop的日志,路径为:/usr/app/hadoop-2.6.0-cdh5.15.2/logs
,里面有很关键的错误信息
如何重置
有时想重新初始化HDFS,此时按如下操作:
1. 删除配置的所有文件夹:/home/hadoop/下的所有文件夹(NameNode, DataNode, tmp)
2. 格式化:hdfs namenode -format