基于伪分布式系统的 Hadoop 的配置

1,522 阅读8分钟
原文链接: blog.sanyuehua.net

前言

Hadoop本身是基于分布式的系统应用,但是很多时候如果只是进行简单的测试,没有必要做集群。所谓的伪分布式本质上指的就是进行单机版的Hadoop配置

在Hadoop里面是不允许IP变更的,也就是说必须要保证项目开发以及最终的允许状态,都要求IP是同一个。
如果你变更了,那么就意味着你的整个配置都要从新来过
以下所有操作都是在 root 账户下进行的

映射配置

  • 为了保证配置的方便,那么一定要为每台电脑设置一个主机名称:

    使用 vim 进入到 “/etc/hostname” 的这个文件进行修改
    

    将里面的 localhost(python2-VirtualBox) 修改为”hadoopm”
    修改之前 :

    修改之后 :

  • 修改主机的映射配置

    修改“/etc/hosts”文件,在里面追加 IP 地址与 hadoopm 主机的映射

    ifconfig (通过此命令记录下您的 IP 地址,192.168.1.108)
    vim /etc/hosts
    进去以后在第一行进行添加
    192.168.1.108 hadoopm
    这样就将IP地址和主机绑在一起
    随后保存退出

为了让生效起作用,建议让 Linux 重新启动
输入    reboot  重新启动

配置 SSH 免登录

请参考文章 Hadoop 的安装和搭建 中的第五步配置 SSH 免密码登录

Hadoop的相关配置

配置完ssh之后,下面就可以实现 hadoop 的相关配置,需要配置如下几个配置文件所有的配置文件都在 /usr/local/hadoop/etc/hadoop 下

  • 配置:“core-site.xml”
    确定Hadoop的核心的信息,包括临时目录,访问地址
    
  • 配置:“hdfs-site.xml”
    可以确定文件的备份个数以及数据文件夹的路径
    
  • 配置:“yarn-site.xml”
    可以简单的理解为配置相关的job的处理;
    

配置 core-site.xml 文件

cd /usr/local/
cd hadoop/etc/hadoop/
vim core-site.xml
  • 定位到
    <configuration>  </configuration>
    
  • 标签中间添加如下代码
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/root/hadoop_tmp</value>
    <description>Abase for other temporary directories.</description><!-- 可以不用写 -->
    </property>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoopm:9000</value>
    </property>

在本文件之中配置的“hdfs://localhost:9000”信息,描述的是日后打开的页面管理器的路径


<value>/home/root/hadoop_tmp</value>

上面这行代码是最重要的,他是不显山不露水的。这个文件路径配置的是临时文件的信息,如果不配置,就会在hadoop的文件夹里面生成“tmp”文件(“/user/local/hadoop/tmp”),如果这样配置,一但重新启动,所有的配置就会被清空,您的Hadoop环境就失效了。

  • 为了保证运行不出错,直接建好 “/home/root/hadoop_tmp”目录
    cd ~
    mkdir hadoop_tmp

注意 :

  • 由于使用的环境是Hadoop 2.x的开发版本。默认的端口是9000
  • 若使用的环境是Hadoop 1.x的开发版本。默认的端口是8020

配置 hdfs-site.xml 文件

Hadoop 的 hdfs 是最关键的

cd /usr/local/hadoop/etc/hadoop/
vim hdfs-site.xml
  • 定位到
    <configuration>  </configuration>
    
  • 标签中间添加如下代码

    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///usr/local/hadoop/dfs/name</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///usr/local/hadoop/dfs/data</value>
    </property>
    <property>
    <name>dfs.namenode.http-address</name>
    <value>hadoopm:50070</value>
    </property>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoopm:50090</value>
    </property>
    <property>
    <name>dfs.permission</name>
    <value>false</value>
    </property>
  • 配置信息详解
    “dfs.replication” :

    指文件的副本数,一般情况下一个文件会备份三份
    

    “dfs.namenode.name.dir”:

    定义名称节点路径
    

    “dfs.datanode.data.dir”:

    定义数据文件节点路径
    

    “dfs.namenode.http-address”:

    名称服务的http路径
    

    “dfs.namenode.secondary.http-address”:

    第二名称节点(此时用途不大,如果在分布式计算中就需要配置第二名称节点)
    

    “dfs.permission”:

    权限的认证问题,因为如果设置了 true,那么有可能以后无法进行文件的处理访问。
    

配置 yarn-site.xml 文件

主要是配置一些相应的节点信息

cd /usr/local/hadoop/etc/hadoop/
vim yarn-site.xml
  • 定位到
    <configuration>  </configuration>
    
  • 标签中间添加如下代码
    <property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>hadoopm:8033</value>
    </property>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>hadoopm:8025</value>
    </property>
    <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>hadoopm:8030</value>
    </property>
    <property>
    <name>yarn.resourcemanager.address</name>
    <value>hadoopm:8050</value>
    </property>
    <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>hadoopm:8030</value>
    </property>
    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>hadoopm:8088</value>
    </property>
    <property>
    <name>yarn.resourcemanager.webapp.https.address</name>
    <value>hadoopm:8090</value>
    </property>

到了此时 Hadoop 的核心文件已经配置完成

开启服务

由于 Hadoop 属于分布式的开发环境,所以考虑到日后要进行的集群搭建
建议在“/usr/local/hadoop/etc/hadoop”目录中创建一个 masters 文件,里面写上主机名称,内容就是 hadoopm (之前在 hosts 文件里面定义的主机名称),如果你是单机环境,不写也没有关系
但是考虑以后的配置还是写上比较好,并把它记住

cd /usr/local/hadoop/etc/hadoop
touch masters
vim masters
直接在第一行写上 hadoopm
保存退出 :wq!
  • 修改从节点的文件“slaves”,增加 hadoopm

    vim slaves
    此文件第一行可能会有 localhost, 不要删除它,直接在它的上面添加 hadoopm
    :wq! 保存提出
  • 由于此时是将所有的 namenode、datanode 保存路径设置在 hadoop 目录中

    cd ..
    cd .. (退出 /etc 目录)
    接下来自己创建目录
    mkdir dfs dfs/name dfs/data

特别注意 :
如果你的 hadoop 出现了问题并且需要重新配置时,请保证将这两个文件夹彻底清除掉
如果不清除您的新配置则不会生效

  • 格式化文件系统
    source /etc/profile
    cd /usr/local/hadoop/bin
    ./hdfs namenode -format

如果此时格式化正常会出现“INFO util.ExitUtil: Exiting with status 0”的信息。

  • 随后可以使用最简单的处理,启动 hadoop

    cd /usr/local/hadoop/sbin
    ./start-all.sh
  • 接下来可以使用 JDK 提供 jps 命令查看所有的java进程,如果输入之后返回如下 6 个进程

    2848 DataNode
    2721 NameNode
    3266 ResourceManager
    3445 NodeManager
    3115 SecondaryNameNode
    3773 Jps

其实是 5 个进程 Jps 是 jps 自己的进程。如果发现有这六个进程那么表示配置成功
  • 接下来可以进行测试,但现在只能测试 HDFS 是否可以正常使用
    可以直接使用ip地址访问,打开浏览器输入
    http://192.168.1.108:50070/
    这里的 ip 是 Ubuntu 自己的 ip
    也可以通过下面的命令查看
    http://hadoopm:50070/


  • 扩展
    开启服务 start-all.sh
    关闭服务 stop-all.sh
    执行这两个命令都需要进入下面这个目录去执行
    /usr/local/hadoop/sbin
    
    知识点 —— Hadoop2 系列的执行程序分为: bin 下的为普通用户可执行; sbin下的为超级用户才能执行。
       有人会觉得每次在虚拟机外面输入 ip 地址比较麻烦,如果也想在外部使用 hadoopm 名称,那么需要修改本地的 hosts文件,增加映射配置
    路径:C:\Windows\System32\drivers\etc
    打开这 hosts 文件时需要将他 Users 权限设置为完全控制
    追加如下内容:
    192.168.1.108 hadoopm
    保存立即生效
    此方法的弊端是 如果 虚拟机的 ip 一但被修改就无法在虚拟机外部通过 hadoopm 访问。需要再次修改 hosts 文件

jps 查看缺少进程

  • 问题1 : 使用 jps 命令查看进程时,发现没有 “DataNode” 进程

    在每次执行 ./hdfs namenode -format 时,都会为 NameNode 生成 namespaceID,但是在 /usr/local/hadoop/dfs 目录下的 data 还是保留上次的 namespaceID,因为 namespaceID 的不一致,而导致 DataNode 无法启动

    解决方案 :
    删除 /usr/local/hadoop/dfs 此目录下的 "name" 和 "data" 两个文件
    并进入 sbin 目录下停止所有服务, stop-all.sh
    然后进入 bin 目录下重新进行格式化
    ./hdfs namenode -format
    再次进入 sbin 目录启动所有服务,start-all.sh
    此时再次使用 jps 查看进程,就会发现 "DataNode " 再次出现了
  • 如何预防上面出现的问题1

    当进行格式化文件系统时,出现如下提示,记住此时一定要输入 n

    Re-format filesystem in Storage Directory /usr/local/hadoop/dfs/name ? (Y or N) Invalid input: 
    Re-format filesystem in Storage Directory /usr/local/hadoop/dfs/name ? (Y or N)

  • 问题2 : 使用 jps 命令查看进程时,发现没有 “NameNode” , “ResourceManager” 进程

    此时出现的问题应该是 /etc/hosts 文件里面第一行配置的hadoopm 前面的 ip 地址和当前系统的 ip 地址不一致

    解决方案 : (适用于虚拟机) 
    拷贝 /etc/hosts 文件第一行的 ip 地址
    接下来修改当前系统的 ip 地址
    ifconfig eth0 (这里输入刚才复制的 ip 地址)
    重新使用 start-all.sh 命令启动服务
    此时再次使用 jps 查看进程,就会发现 "NameNode" , "ResourceManager" 进程
    如果发现还是没有,就将 /etc/hosts 文件下的 ip 替换成当前系统的 ip 地址
-------------本文结束 感谢您的阅读-------------