Loading... # Hadoop3.1.3完全分布式搭建(231018) ## 一、前置准备(模版机) 1. 准备`jdk1.8.0_202` 和 `hadoop-3.1.3` 2. 准备一台CentOS模版机 3. 模版机要求配置静态IP地址 4. 模版机要求修改主机名 ### 1.1、修改ip地址 修改网卡: ```css vim /etc/sysconfig/network-scripts/ifcfg-ens33 ``` 添加: ```css BOOTPROTO=static #static静态IP地址,dhcp动态IP地址 ··· ONBOOT=yes #将ONBOOT="no"改为ONBOOT="yes",开启网卡自动连接 ··· IPADDR=192.168.10.21 #ip地址 NETMASK=255.255.255.0 #子网掩码 GATEWAY=192.168.10.2 #网关 DNS1=8.8.8.8 #修改DNS服务器 ``` 重启网卡 ```css service network restart ``` ### 1.2、修改主机名 修改主机名: ```css vim /etc/hostname ``` ### 1.3、必装组件 常用命令: ```css yum install update vim epel-release tree wget net-tools psmisc nc rsync lrzsz ntp libzstd openssl-static iotop git -y ``` ### 1.4、修改hosts ```css vim /etc/hosts ``` 添加:`注意要把前面两行注释掉(使用 #)` ```css 172.16.84.21 hadoop21 172.16.84.22 hadoop22 172.16.84.23 hadoop23 # 这是你们的 根据自己电脑来 192.168.10.31 hadoop31 192.168.10.32 hadoop32 192.168.10.33 hadoop33 ``` 使用`scp`同步到hadoop32、hadoop33 ```css scp /etc/hosts root@172.16.84.32:/etc/hosts # 从31同步到32 scp /etc/hosts root@172.16.84.33:/etc/hosts # 从31同步到33 ``` 其他系统: ```css # Linux中的hosts路径 /etc/hosts # Windows的hosts路径 C:\Windows\System32\drivers\etc # MacOS的hosts路径 /etc/hosts ``` ### 1.5、创建用户 & 设置密码 `这一步三台机子都要创建,hadoop31、hadoop32、hadoop33` 创建用户: ```css useradd ahdan ``` 设置密码: ```css passwd ahdan ``` ### 1.6、修改全局用户权限 设置权限: ```css vim /etc/sudoers # 大概100行,100gg root ALL=(ALL) ALL ahdan ALL=(ALL) NOPASSWD:ALL #先添加行 设置面免密操作 ``` ### 1.7、禁用防火墙 禁用防火墙: ```css systemctl stop firewalld systemctl disable firewalld ``` ## 二、安装JDK & Hadoop `克隆三台主机hadoop31、hadoop32、hadoop33后,在hadoop31里面操作` ==以下所有步骤使用root用户操作== ### 2.1、在hadoop31上传/解压 创建: ```css # 在/opt下创建software module mkdir /opt/software /opt/module # 验证 ls /opt ``` 上传: ```css cd /opt/software # 上传到该目录 [root@hadoop31 software]# pwd /opt/software [root@hadoop31 software]# ls hadoop-3.1.3.tar.gz jdk-8u121-linux-arm64.tar.gz ``` 解压: ```css cd /opt/software # 解压Java 到/opt/module/ tar -zxvf jdk-8u121-linux-arm64.tar.gz -C /opt/module/ # 解压Hadoop 到/opt/module/ tar -zxvf hadoop-3.1.3.tar.gz -C ../module/ 验证: ls /opt/module/ [root@hadoop31 software]# ls /opt/module/ hadoop-3.1.3 jdk1.8.0_121 ``` ### 2.2、配置环境变量: 编辑文件 ```css vim /etc/profile.d/my_env.sh ``` 添加:`注意修改路径` ```css # 配置JDK环境变量 export JAVA_HOME=/opt/module/jdk1.8.0_121 # 修改Java安装目录 export PATH=$PATH:$JAVA_HOME/bin # 配置hadoop环境变量 export HADOOP_HOME=/opt/module/hadoop-3.1.3 # 修改Hadoop安装目录 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin # 设置HDFS&YARN用户 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root ``` 生效: ```css source /etc/profile ``` 验证版本号: ```css java -version hadoop version ``` 验证命令: ```css java javac hadoop ``` ### 2.3、修改目录用户 & 用户组权限 ==以下步骤全部使用所创建的用户(addan)操作== ```css su ahdan ``` 给`/opt/module/hadoop-3.1.3`权限 ```css sudo chown -R ahxin:ahxin /opt/module/hadoop-3.1.3 ``` ### 2.4、删除官方文档400多MB 切换: ```css cd $HADOOP_HOME/share ``` 查看: ```css du -h --max-depth=1 [ahdan@hadoop31 share]$ du -h --max-depth=1 357M ./hadoop 479M ./doc # 删的就删它 835M . ``` 删除: ```css rm -rf $HADOOP_HOME/share/doc/ ``` ## 三、把hadoop21的包发送给hadoop22 hadoop23 ==克隆三台机:hadoop31、hadoop32、hadoop33== ==修改对应的ip地址和主机名字== | 主机名 | ip地址 | | :------: | :----------: | | Hadoop31 | 172.16.84.31 | | Hadoop32 | 172.16.84.32 | | Hadoop33 | 172.16.84.33 | ### 3.1、修改ip地址 ```css vim /etc/sysconfig/network-scripts/ifcfg-ens33 ``` ### 3.2、修改主机名字 ```css sudo vim /etc/hostname ``` ### 3.3、拷贝hadoop文件 将hadoop31中的`/opt`下的所有文件,拷贝到hadoop32、hadoop33 切换root ```css su root ``` 拷贝到hadoop32 ```css scp -r /opt/* root@hadoop22:/opt/ ``` 拷贝到hadoop33 ```css scp -r/opt/* root@hadoop23:/opt/ ``` ### 3.4、免密登录 `root用户和ahdan用户都要用` 生成密钥: ```css ssh-keygen -t rsa ``` 发送密钥: ```css # hadoop31 ssh-copy-id hadoop31 ssh-copy-id hadoop32 ssh-copy-id hadoop33 # hadoop32 ssh-copy-id hadoop31 ssh-copy-id hadoop32 ssh-copy-id hadoop33 # hadoop33 ssh-copy-id hadoop31 ssh-copy-id hadoop32 ssh-copy-id hadoop33 ``` ## 四、Hadoop集群配置 规划: ```css 192.168.10.31 hadoop31 NN DN NM 192.168.10.32 hadoop32 DN RM NM 192.168.10.33 hadoop33 DN SN RM 172.16.84.31 hadoop31 172.16.84.32 hadoop32 172.16.84.33 hadoop33 ``` 1. NN (NameNode) - 名称节点:`HDFS文件系统文件和目录的命位置信息` 2. DN (DataNode) - 数据节点:`存储HDFS数据块的具体位置` 3. NM (NodeManager) - 节点管理器:`管理该节点上的资源` 4. RM (ResourceManager) - 资源管理器:`集群的资源管理` 5. SN (Secondary NameNode) - 次要名称节点:`定时备份` 实现网址: namenode的web地址为:http://hadoop31:9870 yarn的web地址为:http://hadoop32:8088 ### 3.1、core-site.xml 切换Hadoop目录: ```css cd /$HADOOP_HOME/etc/hadoop ``` ```css vim core-site.xml ``` ```css <configuration> <!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop21:9820</value> </property> <!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.1.3/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户为ahdan --> <property> <name>hadoop.http.staticuser.user</name> <value>ahxin</value> </property> </configuration> <!-- 以下是代理的使用,主要在hive时使用,可以暂时不用配置 --> <!-- 配置该hadoop(superUser)允许通过代理访问的主机节点 --> <property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> </property> <!-- 配置该hadoop(superUser)允许通过代理用户所属组 --> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property> <!-- 配置该hadoop(superUser)允许通过代理的用户--> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property> ``` ### 3.2、hdfs-site.xml ```css vim hdfs-site.xml ``` 添加: ```css <configuration> <!-- nn web端访问地址--> <property> <name>dfs.namenode.http-address</name> <value>hadoop21:9870</value> </property> <!-- 2nn web端访问地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop23:9868</value> </property> <!-- 页面操作权限--> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration> ``` ### 3.3、yarn-site.xml ```css vim yarn-site.xml ``` 添加: ```css <configuration> <!-- 指定MR走shuffle 数据的重新整合方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop22</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> <!-- 以下为可选配置 --> <!-- yarn容器允许分配的最大最小内存 --> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>512</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>4096</value> </property> <!-- yarn容器允许管理的物理内存大小 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4096</value> </property> <!-- 关闭yarn对物理内存和虚拟内存的限制检查 --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> </configuration> ``` ### 3.3、mapred-site.xml ```css vim mapred-site.xml ``` 添加: ```css <configuration> <!-- 指定MapReduce程序运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> ``` ### 3.4、创建data文件 ```css cd $HADOOP_HOME mkdir data # 授权 sudo chown -R ahdan:ahdan /opt/module/hadoop-3.1.3/data ``` ### 3.5、workers(后面其群启动要用到) works 配置的为 DataNode节点的主机名 ```css sudo vim workers # 添加: hadoop21 hadoop22 hadoop23 ``` ## 五、集群分发脚本xsync ### 6.1、编写集群分发脚本rsync rsync用法: ```css -a # 归档拷贝 -v # 显示复制过程 rsync -av /opt/software/* root@hadoop32:/opt/software # 将hadoop21的hadoop配置文件 同步到hadoop22 rsync -av /opt/module/hadoop-3.1.3/etc/hadoop/* root@hadoop22:/opt/module/hadoop-3.1.3/etc/hadoop ``` 注意: - rsync 只对差异文件做更新, rsync 源和目标不能都是远程的 - **rsync 是 分块校验+传输, scp 是整个文件传输**。. rsync 比 scp 有优势的地方在于单个大文件的一小部分存在改动时,只需传输 改动部分 ,无需重新传输整个文件。 `实现一条命令同步把任意hadoop同步到hadoop31、hadoop32、hadoop33` 实现语法: ```css my_rsync 同步目录 # 把当前主机/opt下所有文件同步到hadoop31、hadoop32、hadoop33中 my_rsync /opt/* ``` ### 6.2、创建脚本xsync 创建目录 ```css mkdir ~/bin cd ~/bin sudo vim my_rsync.sh 创建软连接 sudo ln -s ~/bin/my_rsync.sh /bin/my_rsync.sh ``` 添加 ```css #!/bin/bash #参数预处理,判断参数个数, if [ $# -lt 1 ];then echo 参数不能为空 exit fi #遍历集群所有机器 for host in hadoop21 hadoop22 hadoop23;do echo "==========$host================" # 遍历所有目录,按个发送 for file in $@;do # 判断文件是否存在 if [ -e $file ];then # 1. 获取当前文件的目录结构,使用cd防止是软连接 cd -P pdir=$(cd -P $(dirname $file); pwd) # 2.获取当前文件名 fname=$(basename $file) # 3. 登陆目标地址,创建同一目标结构 ssh $host "mkdir -p $pdir" # 4.依次分发文件或目录 rsync -av $pdir/$fname $host:$pdir else echo "$host $file 不存在" fi done done ``` ### 6.3、添加权限 ```css chmod +x my_rsync.sh ``` ### 6.4、测试 ```css my_rsync ~/bin/my_rsync.sh ``` 去hadoop32、hadoop33看看 ```css ll ~/bin ``` ## 六、单点启动/停止 ### 6.1、格式化namenode ```css hdfs namenode -format ``` ### 6.2、hadoop31启动项 ```css hdfs --daemon start namenode # 1 hdfs --daemon start datanode # 2 yarn --daemon start nodemanager # 5 ``` ### 6.3、hadoop32启动项 ```css hdfs --daemon start datanode # 2 yarn --daemon start resourcemanager # 4 yarn --daemon start nodemanager # 5 ``` ### 6.4、hadoop33启动项 ```css hdfs --daemon start datanode # 2 hdfs --daemon start secondarynamenode # 3 yarn --daemon start nodemanager # 5 ``` ### 6.5、Web地址 ```css # nomenoded的Web http://hadoop31:9870 # yarn的web地址为: http://hadoop32:8088 ``` .assets/image-20231018173744854.png) ==单点停止就是把上面的start换成stop== > `格式化 HDFS 集群的 NameNode的注意事项` > 集群只有首次搭建后需要对NameNode进行格式化操作 > 如果集群在后期使用过程需要重新格式化,一定切记删除 > 所有机器hadoop安装目录下的 data logs 目录。 ### ## 七、集群启动/停止 `切换root用户执行以下步骤` ### 7.1、设置Hadoop用户为root 编辑: ```css vim /etc/profile.d/my_env.sh ``` 添加: ```css # 设置HDFS&YARN用户 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root ``` ### 7.2、hadoop31启动HDFS ```css start-dfs.sh ``` ### 7.3、hadoop32启动YARN ```css start-yarn.sh ``` jps: ### 7.4、Web地址 HDFS:http://hadoop31:9870 YARN:http://hadoop32:8088 ```css 利用hadoop提供的 群启/群停 脚本完成集群操作 群启: start-dfs.sh start-yarn.sh 群停: stop-dfs.sh stop-yarn.sh `注意事项`:启动hdfs的时候要在NameNode所在的机器执行脚本 启动yarn的时候要在resourcemanager所在的机器执行脚本 ``` ### 7.5、用Web界面上传文件到集群 Utilities-->Browse the file system: .assets/image-20231020111357360.png) .assets/image-20231020111441797.png) 若报错无法创建,则给HDFS添加777权限: ```css [root@hadoop21 /]# hdfs dfs -chmod 777 / ``` .assets/image-20231020114144955.png) 进入目录: .assets/image-20231020114247477.png) 上传: .assets/image-20231020114405846.png) .assets/image-20231020114424863.png) ### 7.6、从linux上传文件到集群 命令: ```css hadoop fs -put Linux上的目录为止 上传到HDFS的什么位置 hadoop fs -put /root/demo1.txt /wc_input ``` 在/opt下创建一个mode2 内容如下: ```css vim /opt/demo2.txt hadoop hadoop ss ss cls cls jiao banzhang xue hadoop sgg sgg sgg nihao nihao bigdata0111 laiba ``` 上传HDFS,`/wc_input`中 ```css hdfs dfs -put /opt/demo2.txt /wc_input ``` 查看`HDFS`的`/`目录: ```css hdfs dfs -ls / hdfs dfs -ls /wc_input ``` 拓展: ```css # Hadoop命令 hadoop fs -ls <path>:列出指定路径下的文件和目录。 hadoop fs -mkdir <path>:在指定路径下创建新目录。 hadoop fs -rm <path>:删除指定路径下的文件或目录。 hadoop fs -mv <source> <destination>:将文件或目录从源路径移动到目标路径。 hadoop fs -cp <source> <destination>:将文件或目录从源路径复制到目标路径。 # HDFS命令 hdfs dfs -du <path>:显示指定路径下文件或目录的大小。 hdfs dfs -chown <user>:<group> <path>:更改文件或目录的所有者和所属组。 hdfs dfs -chmod <permissions> <path>:更改文件或目录的权限。 hdfs dfs -tail <path>:显示文件末尾的内容。 ``` ### 7.7、执行wordcount程序 执行前查看: .assets/image-20231020115741293.png) 执行wordcount程序: ```css # 切换到 cd $HADOOP_HOME/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount /wc_input /wc_output ``` 执行后查看: .assets/image-20231020133050110.png) .assets/image-20231020133106224.png) ## 八、历史服务器 切换目录: ```css cd $HADOOP_HOME/etc/hadoop/ ``` 编辑: ```css vim mapred-site.xml ``` 添加: ```css <configuration> <!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop21:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop21:19888</value> </property> </configuration> ``` 分发一下: ```css my_rsync /opt/module/hadoop-3.1.3/etc/hadoop/ ``` 重启HDFS(需要先重启,否则无法正常打开历史): ```css stop-dfs.sh # 在hadoop21启动 start-dfs.sh # 在hadoop21启动 mapred --daemon start historyserver # 在hadoop21启动 [ahxin@hadoop11 hadoop-3.1.3]$ jps 12593 NameNode 12709 DataNode 12999 JobHistoryServer 11479 NodeManager 13018 Jps ``` ## 九、日志的聚集 切换目录: ```css cd $HADOOP_HOME/etc/hadoop/ ``` 编辑: ```css vim yarn-site.xml ``` 添加: ```css <configuration> <!-- 开启日志聚集功能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置日志聚集服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://hadoop21:19888/jobhistory/logs</value> </property> <!-- 设置日志保留时间为7天 秒为单位--> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> </configuration> ``` 先停止先前的: ```css stop-dfs.sh # hadoop21 mapred --daemon stop historyserver # hadoop21 stop-yarn.sh # hadoop21 ``` 启动: ```css # hadoop21 start-dfs.sh mapred --daemon start historyserver # hadoop22 start-yarn.sh ``` Web日志服务器:hadoop21:19888/jobhistory/ .assets/image-20231020134211621.png) .assets/image-20231020134220410.png) .assets/image-20231020134227403.png) .assets/image-20231020134241884.png) 执行wordcount程序: ```css # 切换到 cd $HADOOP_HOME/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount /wc_input /wc_output ``` .assets/image-20231020134311570.png) .assets/image-20231020134320200.png) .assets/image-20231020134326231.png) .assets/image-20231020134331851.png) ## 十、hadoop集群启停脚本 ### 10.1、创建my_hadoop.sh ```css vim ~/bin/my_hadoop.sh ``` 添加: ```css #!/bin/bash if [ $# -lt 1 ] then echo "No Args Input..." exit ; fi case $1 in "start") echo " =================== 启动 hadoop集群 ===================" echo " --------------- 启动 hdfs ---------------" ssh hadoop21 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh" echo " --------------- 启动 yarn ---------------" ssh hadoop22 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh" ;; "stop") echo " =================== 关闭 hadoop集群 ===================" echo " --------------- 关闭 yarn ---------------" ssh hadoop22 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh" echo " --------------- 关闭 hdfs ---------------" ssh hadoop21 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh" ;; *) echo "Input Args Error..." ;; esac ``` 授权: ```css chmod +x ~/bin/my_hadoop.sh ``` 创建软链接: ```css ln -s ~/bin/my_hadoop.sh /bin/my_hadoop ``` 命令用法: ```css my_hadoop stop # 停止 my_hadoop start # 启动 ``` ## 完(常见问题) 最后修改:2024 年 01 月 24 日 © 允许规范转载 打赏 赞赏作者 赞 咱们谁跟谁,用不着~