> 文章列表 > (大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

(大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

(大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

索引

    • 完全分布式模式
      • 守护进程布局
      • 集群搭建准备
        • 总纲
        • 配置文件
        • 格式化集群
        • 启动集群
      • 集群控制命令
        • 集群启停
        • 进程查看
        • 启动日志查看
        • 集群常见问题
      • 案例演示:WordCount

完全分布式模式

  • 分布式文件系统中,HDFS相关的守护进程也分布在不同的机器上,如:
    • NameNode守护进程,尽可能单独部署在一台硬件性能较好的机器中
    • 其他的每台机器上都会部署一个DataNode进程,一般的硬件环境即可
    • SecondaryNameNode守护进程最好不要和NameNode在同一台机器上

守护进程布局

NameNode DataNode SecondaryNameNode
主机名1
主机名2
主机名3

集群搭建准备

总纲

  • 三台机器的防火墙关闭
    • 最好把selinux也关掉,vi /etc/selinux/config——SELINUX=disabled
  • 三台机器网络配置通畅(NAT模式,静态IP,主机名的配置)
  • /etc/host文件配置了ip和hostname的映射关系
  • 配置了三台机器的免密登录认证
  • 时间同步
  • jdk和hadoop环境变量配置

配置文件

  • `cd $HADOOP_HOME/etc/hadoop``

    • ``vi core-site.xml`

      <configuration><!-- 设置namenode节点 --><property><name>fs.defaultFS</name><value>hdfs://lanr:9820</value></property><!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 --><property><name>hadoop.tmp.dir</name><value>/usr/local/hadoop-3.3.1/tmp</value></property>
      </configuration>
    • vi hdfs-site.xml

      <configuration><!-- 块的副本数量 --><property><name>dfs.replication</name><value>3</value></property><!-- secondarynamenode守护进程的http地址;主机名:端口号 --><property><name>dfs.namenode.secondary.http-address</name><value>lanr2:9868</value></property><!-- namenode守护进程的http地址;主机名:端口号 --><property><name>dfs.namenode.http-address</name><value>lanr:9870</value></property>
      </configuration>
    • vi hadoop-env.sh

      export JAVA_HOME=/usr/local/jdk1.8.0_321export HDFS_NAMENODE_USER=root
      export HDFS_DATANODE_USER=root
      export HDFS_SECONDARYNAMENODE_USER=root
      # export YARN_RESOURCEMANAGER_USER=root
      # export YARN_NODEMANAGER_USER=root
      
    • vi workers(删除已有的localhost)

      主机名1
      主机名2
      主机名3
      
    • 分发:其他节点也需要保持相同的配置

      rm -rf $HADOOP_HOME/tmpcd /usr/local/
      scp -r jdk1.8.0_321/ hadoop-3.3.1/ lanr2:$PWD
      scp -r jdk1.8.0_321/ hadoop-3.3.1/ lanr3:$PWDscp /etc/profile lanr2:/etc/
      scp /etc/profile lanr3:/etc/
      

格式化集群

  • hdfs namenode -format(仅在主机名1上运行)

启动集群

  • start-dfs.sh(仅在主机名1上运行)

  • jps分别查看三个机器的节点:

    (大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

    (大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

    (大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

  • 访问:192.168.{你的网段}.101 查看节点运行状态

    (大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

集群控制命令

集群启停

start-dfs.sh  # 启动HDFS所有进程(NameNode、SecondaryNameNode、DataNode)
stop-dfs.sh  # 停止HDFS所有进程(NameNode、SecondaryNameNode、DataNode)# hdfs --daemon start 单独启动一个进程
# 补充:daemon译为,守护进程
# 该命令只会启动当前机器上的进程,若当前机器上没有部署特定节点,则无法启动
hdfs --daemon start namenode
hdfs --daemon start secondarynamenode
hdfs --daemon start datanode# hdfs --daemon stop 单独停止一个进程
hdfs --daemon stop namenode
hdfs --daemon stop secondarynamenode
hdfs --daemon stop datanodehdfs --workers --daemon start datanode # 启动所有机器上的datanode
hdfs --workers --daemon stop datanode # 停止所有机器上的datanode
# 在哪台机器上运行都可以

进程查看

jps # 查看当前机器上的进程# 查看所有机器上的进程情况
cd /opt/
mkdir bin
cd bin
vi jps-cluster.sh # 创建脚本# 添加如下程序:
# -----------------复制以下内容----------------------
#!/bin/bashHOSTS=( lanr lanr2 lanr3 )for HOST in ${HOSTS[*]}
doecho "---------- $HOST ----------"ssh -T $HOST << DELIMITERjps | grep -iv jpsexit
DELIMITERdone
# -----------------复制以上内容----------------------sudo chmod a+x jps-cluster.sh # 赋予执行权限
ln -s /opt/bin/jps-cluster.sh /usr/bin/ # 软链接
  • 启动集群:start-dfs.sh;查看进程:jps-cluster.sh

    (大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

启动日志查看

  • 启动节点进程时若出现问题,可以查看日志文件
  • 日志的位置:$HADOOP_HOME/logs/
  • 日志的命名:hadoop-username-daemon-hostname.log
  • 补充:shift g跳转到文件最后;gg跳转到文件开头
  • 查找error、warn日志:esc——/error——enter——n查找下一个,shift n查找上一个

集群常见问题

  • 格式化集群时报错:
    • 当前用户使用不当
      • 普通用户可能没有在hadoop安装路径下的权限
    • /etc/hosts 里映射关系错误
    • 免密登录认证异常
    • jdk环境变量配置错误
    • 防火墙没有关闭
  • namenode进程没有启动:
    • 当前用户使用不当
    • 重新格式化时,忘记删除${hadoop.tmp.dir}目录下的内容
    • 网络震荡,造成edit日志文件的事务ID序号不连续
  • datanode出现问题:
    • /etc/host 里映射关系错误
    • 免密登录异常
    • 重新格式化时,忘记删除${hadoop.tmp.dir}目录下的内容,造成datanode的唯一标识符不在集群中
  • 上述问题的暴力解决方法:重新格式化
    • 若想重新格式化,先需要删除每台机器上的${hadoop.tmp.dir}指定路径下的所有内容,然后再进行格式化;最好把logs目录下的内容也清空
      • cd $HADOOP_HOME/——rm -rf logs/ tmp/ (三个节点都要进行删除)
      • rm -rf dfs/data/* dfs/name/* (三个节点都要进行删除)
      • 格式化集群:hdfs namenode -format (仅在主机名1上运行)

案例演示:WordCount

  • 数据准备

    cd ~
    mkdir input && cd input
    echo "hello world hadoop linux hadoop" >> file1
    echo "hadoop linux world hadoop linux hadoop" >> file1
    echo "hello world hadoop linux hadoop" >> file1
    echo "hello world hadoop linux hadoop" >> file1
    echo "hello good programmer hadoop linux hadoop" >> file2
    echo "hello world hadoop linux hadoop ok nice" >> file2
    
  • 上传到集群

    cd ~
    hdfs dfs -put input/ /
    hdfs dfs -ls -R /  # 递归查看hdfs上的文件夹与文件
    hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output  # 该input、output文件夹是在hdfs上的,不是linux本地的 且输出路径不能已存在
    hdfs dfs -cat /output/*  # 查看结果