位置:科技大田大数据产业专题>>资讯>>技术>>内容阅读
详细解析 hadoop 分布式部署

1.硬件环境

共有 3 台机器,均使用的 linux 系统,Java 使用的是 jdk1.6.0。 配置如下:

:192.168.2.1(NameNode)

:192.168.2.2(DataNode)

:192.168.2.3 (DataNode)

:192.168.2.4

主机与IP之间有正确解析

对于 Hadoop 来说,在 HDFS 看来,节点分为 Namenode 和 Datanode,其中Namenode 只有一个, Datanode 可以是很多;在 MapReduce 看来,节点又分为Jobtracker 和 Tasktracker,其中 Jobtracker 只有一个,Tasktracker 可以是很多。我是将 namenode 和 jobtracker 部署在 hadoop1 上, hadoop2, hadoop3 作为 datanode和 tasktracker 。当然你也可以将 namenode ,datanode ,jobtracker,tasktracker 全部部署在一台机器上(这样就是伪分布式)。

2.目录结构

由于 Hadoop 要求所有机器上 hadoop 的部署目录结构要相同,并且都有一个相同的用户名的帐户。

我 的 三 台 机 器 上 是 这 样 的 : 都 有 一 个 hadoop 的 帐 户 , 主 目 录是/home/hadoop。

添加用户hadoop

  • #userad -u 800 hadoop
  • 下载hadop-1.2.1.tar.gz

    解压 #tar zxf hadop-1.2.1.tar.gz

  • #ln -s hadoop-1.2.1 hadoop
  • #mv hadoop-1.2.1 /home/hadoop/
  • #cd /home/hadoop
  • #chown -R hadoop.hadoop hadoop-1.2.1/
  • #passwd hadoop 给用户hadoop创建密码
  • 下载jdk-6u32-linux-x64.bin

  • sh jdk-6u32-linux-x64.bin
  • cd ~
  • mv jdk1.6.0_32 hadoop-1.2.1/
  • cd hadoop-1.2.1/
  • 创建软链接,以便与日后的更新、升级

    ln -s jdk jdk1.6.0_32

    3.SSH设置

    在 Hadoop 启动以后,Namenode 是通过 SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置 SSH 使用无密码公钥认证的方式。

    首先要保证每台机器上都装了 SSH 服务器,且都正常启动。实际中我们用的都是 OpenSSH,这是 SSH 协议的一个免费开源实现。

    以本文中的 3 台机器为例,现在 hadoop1 是主节点,它需要主动发起 SSH连接到 hadoop2 ,对于 SSH 服务来说, hadoop1 就是 SSH 客户端,而hadoop2,hadoop3 则是 SSH 服务端,因此在 hadoop2,hadoop3 上需要确定 sshd 服务已经启动。简单的说,在 hadoop1 上需要生成一个密钥对,即一个私钥,一个公钥。将公钥拷贝到 hadoop2 上,这样,比如当 hadoop1 向 hadoop2 发起 ssh 连接的时候,hadoop2 上就会生成一个随机数并用 hadoop1 的公钥对这个随机数进行加密并发送给 hadoop1,hadoop1 收到这个加密的数以后用私钥进行解密,并将解密后的数发送回hadoop2,hadoop2 确认解密的数无误后就允许 hadoop1 进行连接了。这就完成了一次公钥认证过程。

    对于本文中的 3 台机器,首先在 hadoop1 上生成密钥对:

  • #su - hadoop
  • $ssh-keygen
  • 这个命令将为 hadoop1 上的用户 hadoop 生成其密钥对。生成的密钥对id_rsa,id_rsa.pub,在/home/hadoop/.ssh 目录下。

  • $ssh-copy-id localhost
  • $ssh-copy-id 192.168.2.2
  • $ssh-copy-id 192.168.2.3
  • 发布密钥到你本地和hadoop2、hadoop3

    试着登录本地和hadoop2、hadoop3看是否有密码验证,无密码即验证成功

    下载jdk-6u32-linux-x64.bin

  • sh jdk-6u32-linux-x64.bin
  • cd ~
  • mv jdk1.6.0_32 hadoop-1.2.1/
  • cd hadoop-1.2.1/
  • 创建软链接

    ln -s jdk jdk1.6.0_32

    4.环境变量

    在 ~/hadoop-1.2.1/conf/ 目 录 下 的 hadoop-env.sh 中 设 置Hadoop 需 要 的 环 境 变 量 , 其 中 JAVA_HOME 是 必 须 设 定 的 变 量 。HADOOP_HOME 变量可以设定也可以不设定,如果不设定, HADOOP_HOME默认的是 bin 目录的父目录,即本文中的/home/hadoop/hadoop。

    vim~/hadoop-1.2.1/conf/hadoop-env.sh

    export JAVA_HOME=/home/hadoop/hadoop/jdk

    先进行简单测试:

  • $cd /home/hadoop/hadoop/
  • $mkdir input
  • $cp conf/* input/
  • $bin/hadoop jar hadoop-examples-1.2.1.jar
  • $bin/hadoop jar hadoop-examples-1.2.1.jar grep input output 'dfs[a-z.]+'
  • $cd output
  • $cat *
  • 统计文件中的单词:

  • $bin/hadoop jar hadoop-examples-1.2.1.jar
  • $bin/hadoop jar hadoop-examples-1.2.1.jar wordcount input test
  • $cd test/
  • $cat *
  • 5.hadoop配置文件

    $cd /home/hadoop/hadoop/conf

    conf/core-site.xml:



    fs.default.name
    hdfs://:9000

    conf/hdfs-site.xml:



    dfs.replication
    2

    conf/mapred-site.xml:



    mapred.job.tracker
    :9001

    伪分布式测试:

    $mkdir ~/bin

    $ln -s /home/hadoop/hadoop/jdk/bin/jps ~/bin/

    $cd /home/hadoop/hadoop/

    $bin/hadoop namenode -format 先进行初始化

    $bin/start-all.sh

    web测试192.168.2.1:50070

    192.168.2.1:50030

    $rm -fr input/ output/ test/

    $bin/hadoop fs -mkdir input

    $bin/hadoop fs -put conf input

    $bin/hadoop fs -lsr

    192.168.2.1:50075下查看/usr/hadoop/input是否有变化

    6.部署Hadoop

    前面讲的这么多 Hadoop 的环境变量和配置文件都是在 hadoop1 这台机器上的,现在需要将 hadoop 部署到其他的机器上,保证目录结构一致。

    $scp -r /home/hadoop/hadoop :/home/hadoop/

    $scp -r /home/hadoop/hadoop :/home/hadoop/

    $scp -r .ssh/ hadoop2:

    $scp -r .ssh/ hadoop3:

    注意还要修改以下文件:

    $cd /home/hadoop/hadoop/conf

    conf/masters

    conf/slaves


    $ln -s hadoop-1.2.1/ hadoop

    $mkdir ~/bin

    $ln -s ~/hadoop/jdk/bin/jps ~/bin

    至此,可以说,Hadoop 已经在各个机器上部署完毕了,下面就让我们开始启动 Hadoop 吧。

    7. 启动 Hadoop

    启动之前,我们先要格式化 namenode,先进入~/hadoop/目录,执行下面的命令:

  • $bin/hadoop namenode –format
  • 不出意外,应该会提示格式化成功。如果不成功,就去 hadoop/logs/目录下去查看日志文件。

    下面就该正式启动 hadoop 啦,在 bin/下面有很多启动脚本,可以根据自己的需要来启动。

    * start-all.sh 启动所有的 Hadoop 守护。包括 namenode, datanode, jobtracker,tasktrack

    * stop-all.sh 停止所有的 Hadoop

    * start-mapred.sh 启动 Map/Reduce 守护。包括 Jobtracker 和 Tasktrack

    * stop-mapred.sh 停止 Map/Reduce 守护

    * start-dfs.sh 启动 Hadoop DFS 守护.Namenode 和 Datanode

    * stop-dfs.sh 停止 DFS 守护

    在这里,简单启动所有守护:

  • [[email protected]:hadoop]$bin/start-all.sh
  • $jps
  • 查看JobTracker,Jps,SecondaryNameNode,NameNode是否启动成功。

    同样,如果要停止 hadoop,则

  • [[email protected]:hadoop]$bin/stop-all.sh
  • 8. HDFS 操作

    运行 bin/目录的 hadoop 命令,可以查看 Haoop 所有支持的操作及其用法,这里以几个简单的操作为例。

    建立目录:

  • [[email protected] hadoop]$bin/hadoop dfs -mkdir testdir
  • 在 HDFS 中建立一个名为 testdir 的目录,复制文件:

  • [[email protected] hadoop]$bin/hadoop dfs -put /home/large.zip testfile.zip
  • 把 本 地 文 件 large.zip 拷 贝 到 HDFS 的 根 目 录 /user/hadoop/ 下 , 文 件 名 为testfile.zip,查看现有文件:

  • [[email protected] hadoop]$bin/hadoop dfs -ls
  • 9.hadoop 在线更新节点:

    新增节点:

    1). 在新增节点上安装 jdk,并创建相同的 hadoop 用户,uid 等保持一致

    2). 在 conf/slaves 文件中添加新增节点的 ip

    3). 同步 master 上 hadoop 所有数据到新增节点上,路径保持一致

    4). 在新增节点上启动服务:

  • $ bin/hadoop-daemon.sh start datanode
  • $ bin/hadoop-daemon.sh start tasktracker
  • 5). 均衡数据:

    $ bin/start-balancer.sh

    (1)如果不执行均衡,那么 cluster 会把新的数据都存放在新的 datanode 上,这样会降低 mapred的工作效率

    (2)设置平衡阈值,默认是 10%,值越低各节点越平衡,但消耗时间也更长

  • $ bin/start-balancer.sh -threshold 5
  • 在线删除datanode节点:

    1). 在 master 上修改 conf/mapred-site.xml

  • property>
  • name>dfs.hosts.excludename>
  • value>/home/hadoop/hadoop-1.2.1/conf/datanode-excludesvalue>
  • property>
  • 2). 创建 datanode-excludes 文件,并添加需要删除的主机,一行一个

    192.168.2.4

    3). 在 master 上在线刷新节点

  • $ bin/hadoop dfsadmin -refreshNodes
  • 此操作会在后台迁移数据,等此节点的状态显示为 Decommissioned,就可以安全关闭了。

    4). 你可以通过以下命令查看 datanode 状态

  • $ bin/hadoop dfsadmin -report
  • 在做数据迁移时,此节点不要参与 tasktracker,否则会出现异常。

    在线删除tasktracker 节点:

    1). 在 master 上修改 conf/mapred-site.xml

  • property>
  • name>mapred.hosts.excludename>
  • value>/home/hadoop/hadoop-1.2.1/conf/tasktracker-excludesvalue>
  • property>
  • 2. 创建 tasktracker-excludes 文件,并添加需要删除的主机名,一行一个

    3. 在 master 上在线刷新节点

  • $ bin/hadoop mradmin -refreshNodes
  • 4. 登录 jobtracker 的网络接口,进行查看。

    免责声明:本网站部 分文章和信息来源于互联网,本网转载出于传递更多信息和学习之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请立即联系管理 员,我们会予以更改或删除相关文章,保证您的权利。对使用本网站信息和服务所引起的后果,本网站不作任何承诺。
    Copyright 版权所有 Copyright 2013-2014 福建省云创集成科技服务有限公司
    All Rights Reserved. 运营维护:三明市明网网络信息技术有限公司 业务咨询:0598-8233595 0598-5831286 技术咨询:0598-8915168