Hadoop集群搭建

Hadoop集群搭建

1、服务器配置

服务器名称 配置
master 2C 2G
slave1 2C 2G
slave2 1C 2G

1.1 修改主机名

#Centos永久修改主机名命令
hostnamectl set-hostname master

1.2 主机映射

vim /etc/hosts

#需要设置的服务器:ip为内网,其他服务器:ip为外网
172.16.0.3 master master
1.94.5.165 slave1 slave1
123.249.87.176 slave2 slave2

测试是否能ping通

若ping不同,根据文档云服务器 实例 IP 地址 ping 不通-故障处理-文档中心-腾讯云 (tencent.com)进行故障排查

若想自己的电脑上通过主机名的方式访问服务器,需要修改本地的 “C:\Windows\System32\drivers\etc\hosts” 文件,将主机名和IP填入(全都是公网IP)

# 修改hosts文件
117.72.37.12	master
1.94.5.165		slave1
123.249.87.176	slave2

然后打开命令行,执行ipconfig /flushdns命令刷新DNS缓存

1.3 SSH免密登录

先创建hadoop用户

# 创建hadoop用户
sudo useradd hadoop
# 设置密码
sudo passwd hadoop
# 添加hadoop用户到Hadoop组中
sudo usermod -a -G Hadoop hadoop

chmod u+w /etc/sudoers
vim /etc/sudoers
添加hadoop=(ALL)ALL

再设置免密登录

#生成公钥和私钥
ssh-keygen -t rsa

#将公钥复制到要免密登录的服务器上:ssh-copy-id 服务器名
#如要在master上免密登录slave1
ssh-copy-id slave1

1.4 安装Java和Hadoop

将jdk和hadoop压缩包通过xftp传输到服务器

# 在/opt下新建module和software文件夹
sudo mkdir /opt/module
sudo mkdir /opt/software

# 解压缩
tar -zxvf jdk-8u381-linux-x64.tar.gz -C /opt/module/
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

#配置环境变量
cd /etc/profile.d/
sudo vim my_env.sh

# my_env.sh
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_381
export PATH=$PATH:$JAVA_HOME/bin
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

source /etc/profile

1.5 scp和rsync命令

1.5.1 scp(secure copy)安全拷贝

  1. scp定义

    scp可以实现服务器与服务器之间的数据拷贝

  2. 基本语法

    scp   -r   $pdir/$fname         $user@host:$pdir/$fname
    命令   递归  要拷贝的文件路径/名称   目的地用户@主机:目的地路径/名称
    
  3. 案例

    前提:在master、slave1、slave2上都已经创建好了/opt/module和/opt/software两个目录,并且把这两个目录修改为hadoop:hadoop

    sudo chown hadoop:hadoop -R /opt/module
    
    • 在master上,将master中/opt/module/jdk_1.8.0_381目录拷贝到slave1上

      scp -r /opt/module/jdk1.8.0_381 hadoop@slave1:/opt/module/
      

1.5.2 rsync远程同步工具

rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。

rsync和scp区别:用rsync做文件的复制要比scp速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

  1. 基本语法

    rsync  -av      $pdir/$fname         $user@host:$pdir/$fname
    命令    选项参数  要拷贝的文件路径/名称   目的地用户@主机:目的地路径/名称
    
    选项参数说明
    -a   归档拷贝
    -v   显示复制过程
    
  2. 案例

    • 删除master中/opt/module/hadoop-3.1.3/wcinput

      rm -rf wcinput/
      
    • 同步master中的/opt/module/hadoop-3.1.3到slave1

      rsync -av hadoop-3.1.3/ hadoop@slave1:/opt/module/hadoop-3.1.3/
      

1.5.3 xsync集群分发脚本

  1. 需求:循环复制文件到所有节点的相同目录下

  2. 需求分析:

    1. rsync命令原始拷贝

      rsync -av /opt/module  hadoop@slave1:/opt/
      
    2. 期望脚本

      xsync fname(要同步的文件名称)

    3. 期望脚本在任何路径都能使用(把脚本放在声明了全局环境变量的路径 /home/hadoop/bin)

  3. 脚本实现

    1. 在/home/hadoop/bin目录下创建xsync文件

      cd /home/hadoop
      mkdir bin
      cd bin
      vim xsync
      
      # 在xsync文件中编写代码
      # !/bin/bash
      
      #1. 判断参数个数
      if [ $# -lt 1 ]
      then
          echo Not Enough Arguenment!
          exit
      fi
      
      #2. 遍历集群所有机器
      for host in master slave1 slave2
      do
          echo ============  $host  ============
          #3. 遍历所有目录,逐一发送
      
          for file in $@
          do
              #4. 判断文件是否存在
              if [ -e $file ]
                  then
                      #5. 获取父目录
                      pdir=$(cd -P $(dirname $file); pwd)
      
                      #6. 获取当前文件的名称
                      fname=$(basename $file)
                      ssh $host "mkdir -p $pdir"
                      rsync -av $pdir/$fname $host:$pdir
                  else
                      echo $file does not exists!
              fi
          done
      done
      
    2. 修改脚本xsync具有执行权限

      chmod 777 xsync
      

2、集群配置

2.1 集群部署规划

  • NameNode和SecondaryNameNode不要安装再同一台服务器
  • ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在一台服务器
Master Slave1 Slave2
HDFS NameNode
DataNode
DataNode SecondaryNameNode
DataNode
YARN NodeManager ResourceManager
NodeManager
NodeManager

2.2 配置文件

  1. core-site.xml

    <configuration>
    	<!-- 指定NameNode的地址 -->
    	<property>
    		<name>fs.defaultFS</name>
    		<value>hdfs://cloud1:8020</value>
    	</property>
    	<!-- 指定hadoop数据的存储目录 -->
    	<property>
    		<name>hadoop.tmp.dir</name>
    		<value>/opt/module/hadoop-3.1.3/data</value>
    	</property>
    	<!-- 配置HDFS网页登录使用的静态用户为hadoop -->
        <property>
            <name>hadoop.http.staticuser.user</name>
            <value>hadoop</value>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/var/log/hadoop/tmp</value>
        </property>
    </configuration>
    
  2. hdfs-site.xml

    <configuration>
    	<!-- nn web端访问地址 -->
    	<property>
    		<name>dfs.namenode.http-address</name>
    		<value>cloud1:9870</value>
    	</property>
    	<!-- 2nn web端访问地址 -->
    	<property>
    		<name>dfs.namenode.secondary.http-address</name>
    		<value>cloud3:9868</value>
    	</property>
    	
    	<property> 
    		<name>dfs.namenode.name.dir</name>
    		<value>/opt/module/hadoop-3.1.3/hdfs/name</value>
            <final>true</final>
        </property> 
        <property> 
        	<name>dfs.datanode.data.dir</name> 
        	<value>/opt/module/hadoop-3.1.3/hdfs/data</value> 
        	<final>true</final>
        </property> 
        <property> 
        	<name>dfs.http.address</name>
        	<value>cloud1:50070</value>
        </property>
        <property>
        	<name>dfs.permissions</name>
        	<value>false</value>
        </property>
    </configuration>
    
  3. 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>cloud2</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>
    
  4. mapred-site.xml

    <configuration>
    	<!-- 指定MapReduce程序运行在Yarn上 -->
    	<property>
    		<name>mapreduce.framework.name</name>
    		<value>yarn</value>
    	</property>
    	<!-- 历史服务器端地址 -->
        <property>
            <name>mapreduce.jobhistory.address</name>
            <value>cloud1:10020</value>
        </property>
    
        <!-- 历史服务器web端地址 -->
        <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>cloud1:19888</value>
        </property>
    
    	<property>
        	<name>yarn.app.mapreduce.am.env</name>
        	<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
    	</property>
    	<property>
        	<name>mapreduce.map.env</name>
        	<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
    	</property>
    	<property>
        	<name>mapreduce.reduce.env</name>
        	<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
    	</property>
    </configuration>
    

    在/opt/module/hadoop-3.1.3/etc目录下执行 xsync hadoop/ 命令,将配置文件分发到另外两个服务器

内存配置调优

  1. yarn-site.xml

    <!-- yarn-site.xml -->
    
    <!-- ResourceManager配置 -->
    
    <!-- 设置NodeManager的最大内存,单位为MB,根据实际情况调整 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value> 
    </property>
    
    
     <!-- 设置每个容器的最小内存,单位为MB -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    
    
    <!-- 设置每个容器的最大内存,单位为MB,根据实际情况调整 -->
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value> 
    </property>
    
  2. mapred-site.xml

    <!-- mapred-site.xml -->
    
    <!-- MapReduce任务运行时的内存配置 -->
    <!-- 设置Map任务的内存,单位为MB -->
    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>512</value>
    </property>
    
    <!-- 设置Reduce任务的内存,单位为MB -->
    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>1024</value>
    </property> 
    

2.3 群起集群

配置worker

# 在/opt/module/hadoop-3.1.3/etc/hadoop目录下
vim workers

# 在文件中增加以下内容
master
slave1
slave2

# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行

# 同步所有节点配置文件
xsync workers

启动集群

  1. 如果集群是第一次启动,需要在master节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式话NameNode的话,一定要先停止NameNode和DataNode进程,并且要删除所有机器上的data和logs目录,然后再进行格式化。

    rm -rf data/ logs/

    hdfs namenode -format

  2. 启动HDFS

    sbin/start-dfs.sh

  3. 在配置了ResourceManager的节点(slave1)启动YARN

    sbin/start-yarn.sh

  4. Web端查看HDFS的NameNode

  5. Web端查看YARN的ResourceManager

配置历史服务器

  1. 配置mapred-site.xml

    <!-- 历史服务器端地址 -->
    <property>
    	<name>mapreduce.jobhistory.address</name>
    	<value>master:10020</value>
    </property>
    
    <!-- 历史服务器web端地址 -->
    <property>
    	<name>mapreduce.jobhistory.webapp.address</name>
    	<value>master:19888</value>
    </property>
    
  2. 启动历史服务器

    bin/mapred --daemon start historyserver

配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到JHDFS系统上。

开启日志聚集功能需要重新启动NodeManager、ResourceManager和HistoryServer。

  1. 配置yarn-site.xml

    # 在该文件里增加如下配置
    <!-- 开启日志聚集功能 -->
    <property>
    	<name>yarn.log-aggregation-enable</name>
    	<value>true</value>
    </property>
    
    <!-- 设置日志聚集服务器地址 -->
    <property>
    	<name>yarn.log.server.url</name>
    	<value>http://cloud1:19888/jobhistory/logs</value>
    </property>
    
    <!-- 设置日志保存时间为7天 -->
    <property>
    	<name>yarn.log-aggregation.retain-seconds</name>
    	<value>604800</value>
    </property>
    
    # 分发节点
    xsync yarn-site.xml
    
  2. 重启YARN

2.4 集群启动和关闭

集群启停脚本/home/hadoop/bin目录下,myhadoop.sh

#!/bin/bash

if [ $# -lt 1 ]
then
	echo "No Args Input..."
	exit;
fi

case $1 in
"start")
		echo " ========== 启动 hadoop集群 ========== "
		
		echo " -------- 启动 hdfs -------- "
		ssh master "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
		echo " -------- 启动 yarn -------- "
		ssh slave1 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
		echo " -------- 启动 historyserver -------- "
		ssh master "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
		echo " ========== 关闭 hadoop集群 ========== "
		echo " -------- 关闭 historyserver -------- "
		ssh master "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
		echo " -------- 关闭 yarn -------- "
		ssh slave1 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
		echo " -------- 关闭 hdfs -------- "
		ssh master "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
	echo "Input Args Error..."
;;
esac

查看三台服务器Java进程脚本:jpsall

#!/bin/bash

for host in master slave1 slave2
do
		echo ========== $host ==========
		ssh $host jps
done

保存后退出,然后赋予脚本执行权限

chmod +x jpsall

2.5 集群启动过程中遇到的问题

2.5.1 端口号被占用

  1. 报错日志

    # 报错日志
    ERROR org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
    org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.BindException: Problem binding to [0.0.0.0:8040] java.net.BindException: Address already in use; For more details see:  http://wiki.apache.org/hadoop/BindException
    
  2. 解决方案

    # 1.首先查询被占用端口号
    netstat -anp | grep 8040
    
    tcp        0      0 192.168.0.104:8088      0.0.0.0:*               LISTEN      13425/java
    
    # 2.然后查看进程的具体信息
    ps -ef | grep 13425
    
    # 3.杀死进程
    kill 13425
    

3、WC程序运行

# 在hdfs创建input文件夹
hadoop fs -mkdir /input

# 将本地文件拷贝到hdfs
hadoop fs -put word.txt /input
posted @   还是做不到吗  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示