搭建Hadoop集群

来源:互联网 发布:软件工程数据库设计 编辑:程序博客网 时间:2024/05/17 21:59
官方配置手册:http://hadoop.apache.org/docs/stable/
    通常,Hadoop集群里的一台机器被指定为NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode也作为TaskTracker,它们是slaves。
    1、先决条件
    确保在你的集群中的每个节点上都安装了所有必需软件:Java环境,SSH和Hadoop。其中Java使用1.6.x或以上的版本,必须安装,建议选择Sun公司发行的Java版本。ssh必须安装并且保证sshd一直运行,以便用Hadoop脚本管理远程Hadoop守护进程。

    例如,如果没有安装ssh,在Ubuntu上可以安装:

[plain] view plaincopy
  1. $ sudo apt-get install openssh-server  
  2. $ sudo apt-get install rsync  
    rsync是远程文件拷贝工具。执行$ netstat  -nat查看22端口是否开启了。测试ssh localhost,输入当前用户的密码,回车就ok了。说明安装成功,同时ssh登录需要密码。这种默认安装方式完后,默认配置文件是在/etc/ssh/目录下。sshd配置文件是/etc/ssh/sshd_config。
    Hadoop的稳定版(hadoop-1.0.4.tar.gz)可以从此处下载:http://hadoop.apache.org/releases.html
    操作系统环境:Ubuntu 12.04 LTS版,安装在VMware Workstation中。Java使用的是最新的OpenJDK 1.7版本。
    为了搭建集群,在vmvare安装好一台Ubuntu虚拟机后,可以导出或者克隆出另外两台虚拟机。注意要保证虚拟机的ip和主机的ip在同一个ip段,这样几个虚拟机和主机之间可以相互通信。为了保证虚拟机的ip和主机的ip在同一个ip段,虚拟机连接设置为桥接。
    准备机器:一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例如:
    机器jackzhou-node1:为master,地址192.168.1.6,作用NameNode, JobTracker。   
    机器jackzhou-node2:为slave1,地址192.168.1.7,作用DataNode, TaskTracker。
    机器jackzhou-node3:为slave2,地址192.168.1.8,作用DataNode, TaskTracker。
    一般要在所有的机器上都建立相同的Hadoop安装目录,例如可以建立相同的用户并以该用户的home路径来做hadoop的安装路径,我们统一解压到/home/jackzhou目录下。
    2、单个节点的设置
    解压hadoop-1.0.4.tar.gz到/home/jackzhou/下,编辑文件conf/hadoop-env.sh,至少要定义其中的JAVA_HOME并指向你的Java安装根目录(/usr/lib/jvm/java-7-openjdk-i386)。输入命令bin/hadoop可显示hadoop脚本的使用帮助。
    现在你可以用下面的任一种模式来启动Hadoop集群:
    (1)本地(独立)模式
    (2)伪分布式模式
    (3)完全分布式模式
    缺省情况下,Hadoop以本地模式(非分布式模式)运行,只有一个单一的Java进程。这通常用作调试。下面的例子拷贝conf目录以用作输入,然后显示每个正则表达式的匹配。输出被写入到output目录。
[plain] view plaincopy
  1. $ mkdir input  
  2. $ cp conf/*.xml input  
  3. $ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'  
  4. $ cat output/*  
    Hadoop也可以通过伪分布式模式运行在单个节点上,这时每个Hadoop守护进程都是一个单独的Java进程。下面是一个配置实例:
    conf/core-site.xml文件:
[html] view plaincopy
  1. <configuration>  
  2.      <property>  
  3.          <name>fs.default.name</name>  
  4.          <value>hdfs://localhost:9000</value>  
  5.      </property>  
  6. </configuration>  
    conf/hdfs-site.xml文件:
[html] view plaincopy
  1. <configuration>  
  2.      <property>  
  3.          <name>dfs.replication</name>  
  4.          <value>1</value>  
  5.      </property>  
  6. </configuration>  
    conf/mapred-site.xml文件:
[html] view plaincopy
  1. <configuration>  
  2.      <property>  
  3.          <name>mapred.job.tracker</name>  
  4.          <value>localhost:9001</value>  
  5.      </property>  
  6. </configuration>  
    完全分布式模式就是通常多个节点的大规模Hadoop集群。
    3、Hadoop集群配置
    (1)配置SSH

    在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的,这就需要在节点之间执行指令的时候是无需输入密码的,因此我们需要配置SSH运用无密码公钥认证的形式。以本文中的三台机器为例,现在jackzhou-node1是主节点,他需要连接jackzhou-node2和jackzhou-node3。需要确定每台机器上都安装了ssh,并且DataNode机器上sshd服务已经启动。
    $ssh-keygen -t rsa
    这个命令将为节点上的用户生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在.ssh目录下。然后将id_rsa.pub的内容复制到每个机器(也包括本机)的.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行。
    首先设置NameNode的ssh为无需密码,自动登录的。
[plain] view plaincopy
  1. $cd /home/jackzhou  
  2. $ssh-keygen -t rsa  (一直回车,设置成空密码)  
  3. $cd .ssh  
  4. $cp id_rsa.pub  authorized_keys  
    测试是否需要密码,若无需密码,则成功:
[plain] view plaincopy
  1. $ssh localhost  
    或者用$ssh jackzhou-node1,如果不行,则一般是/etc/hosts文件中的IP-主机名映射不正确,修改它使正确的IP地址映射到正确的主机名即可。注意当我们通过主机名来访问机器(不管是本机还以是另外两台远程Slave机器)时,都要在/etc/hosts文件设置好正确的IP-主机名映射,添加两台slave机器的IP-主机名映射。
    然后复制authorized_keys到jackzhou-node2和jackzhou-node3上。在jackzhou-node2和jackzhou-node3上也要先用ssh-keygen -t rsa生成公钥和私钥,然后回到jackzhou-node1,复制authorized_keys到jackzhou-node2和jackzhou-node3。
[plain] view plaincopy
  1. $scp authorized_keys jackzhou-node2:/home/jackzhou/.ssh/  
  2. $scp authorized_keys jackzhou-node3:/home/jackzhou/.ssh/  
    测试ssh jackzhou-node2或者ssh jackzhou-node3(第一次需要输入yes)。如果不须要输入密码则配置成功,如果还须要请检查上面的配置是否正确。
    (2)安装配置Hadoop
    安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。并且安装路径要一致,如果我们用HADOOP_HOME指代安装的根路径,通常集群里的所有机器的HADOOP_HOME路径相同。
    如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把配置好的软件即hadoop-1.0.4整个文件夹拷贝到其他机器的相同位置即可。注意各个hadoop节点上的conf/hadoop-env.sh文件,使其JAVA_HOME指向Java安装根目录。
    可以将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,同时根据每一个Slave的Java_HOME的不同修改其hadoop-env.sh。
    为了方便使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile新增以下内容:
    export HADOOP_HOME=/home/jachzhou/hadoop-1.0.4
    export PATH=$PATH:$HADOOP_HOME/bin
    修改完毕后,执行source /etc/profile来使其生效。
    下面是Hadoop集群配置(所有节点相同):
    1)配置文件conf/core-site.xml:核心配置文件,这里配置的是HDFS的地址和端口号。
[html] view plaincopy
  1. <?xml version="1.0"?>  
  2. <?xml-stylesheet type="text/xsl"href="configuration.xsl"?>  
  3. <configuration>  
  4.     <property>  
  5.         <name>fs.default.name</name>  
  6.         <value>hdfs://jackzhou-node1:49000</value>  
  7.     </property>  
  8.     <property>  
  9.         <name>hadoop.tmp.dir</name>  
  10.         <value>/home/jachzhou/hadoop-1.0.4/tmp</value>  
  11.         <description>A base for other temporary directories.</description>  
  12.     </property>  
  13. </configuration>  
    fs.default.name:是NameNode的URI。hdfs://主机名:端口/
    hadoop.tmp.dir:Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为/tmp/hadoo-hadoop。而这个目录在每次重启后都会被干掉,必须重新执行format才行,否则会出错。
    2)配置文件conf/hdfs-site.xml:这里配置HDFS的目录结构。
[html] view plaincopy
  1. <?xmlversionxmlversion="1.0"?>  
  2. <?xml-stylesheettypexml-stylesheettype="text/xsl" href="configuration.xsl"?>  
  3. <configuration>  
  4.     <property>  
  5.         <name>dfs.name.dir</name>  
  6.         <value>/home/jackzhou/name1,/home/jackzhou/name2</value>  
  7.         <description>Name directories</description>  
  8.     </property>  
  9.     <property>  
  10.         <name>dfs.data.dir</name>  
  11.         <value>/home/jackzhou/data1,/home/jackzhou/data2</value>  
  12.         <description>Data directories</description>  
  13.     </property>  
  14.     <property>  
  15.         <name>dfs.replication</name>  
  16.         <!-- 我们的集群有两个结点,所以rep两份 -->  
  17.         <value>2</vaue>  
  18.     </property>  
  19. </configuration>  
    dfs.name.dir:是NameNode持久存储名字空间及事务日志的本地文件系统路径。当这个值是一个逗号分割的目录列表时,NameTable数据将会被复制到所有目录中做冗余备份。
    dfs.data.dir:是DataNode存放块数据的本地文件系统路径,逗号分割的列表。当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
    dfs.replication:是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
    注意此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先创建反而会有问题。
    3)配置文件conf/mapred-site.xml:这里是MapReduce的配置文件,配置JobTracker的地址和端口。
[html] view plaincopy
  1. <?xmlversionxmlversion="1.0"?>  
  2. <?xml-stylesheettypexml-stylesheettype="text/xsl" href="configuration.xsl"?>  
  3. <configuration>  
  4.     <property>  
  5.         <name>mapred.job.tracker</name>  
  6.         <value>jackzhou-node1:49001</value>  
  7.     </property>  
  8.     <property>  
  9.         <name>mapred.local.dir</name>  
  10.         <value>/home/jachzhou/hadoop-1.0.4/tmp</value>  
  11.         </property>  
  12. </configuration>  
    mapred.job.tracker:是JobTracker的主机名(或者IP)和端口。主机:端口。
    mapred.local.dir:临时目录,存放MapReduce的临时数据。
    4)配置masters和slaves主从结点
    配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。
    masters文件中输入jackzhou-node1。
    slaves文件中输入jackzhou-node2和jackzhou-node3。
    配置结束,把配置好的hadoop文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而言正确,例如如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh。
    4、Hadoop启动和关闭
    (1)格式化一个新的分布式文件系统
    先格式化一个新的分布式文件系统:bin/hadoop namenode -format
    成功时系统输出:
[plain] view plaincopy
  1. 13/04/05 17:47:47 INFO namenode.NameNode: STARTUP_MSG:   
  2. /************************************************************  
  3. STARTUP_MSG: Starting NameNode  
  4. STARTUP_MSG:   host = jackzhou-node1/127.0.1.1  
  5. STARTUP_MSG:   args = [-format]  
  6. STARTUP_MSG:   version = 1.0.4  
  7. STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct  3 05:13:58 UTC 2012  
  8. ************************************************************/  
  9. 13/04/05 17:47:47 INFO util.GSet: VM type       = 32-bit  
  10. 13/04/05 17:47:47 INFO util.GSet: 2% max memory = 19.33375 MB  
  11. 13/04/05 17:47:47 INFO util.GSet: capacity      = 2^22 = 4194304 entries  
  12. 13/04/05 17:47:47 INFO util.GSet: recommended=4194304, actual=4194304  
  13. 13/04/05 17:47:52 INFO namenode.FSNamesystem: fsOwner=jackzhou  
  14. 13/04/05 17:47:52 INFO namenode.FSNamesystem: supergroup=supergroup  
  15. 13/04/05 17:47:52 INFO namenode.FSNamesystem: isPermissionEnabled=true  
  16. 13/04/05 17:47:52 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100  
  17. 13/04/05 17:47:52 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)  
  18. 13/04/05 17:47:52 INFO namenode.NameNode: Caching file names occuring more than 10 times   
  19. 13/04/05 17:47:52 INFO common.Storage: Image file of size 114 saved in 0 seconds.  
  20. 13/04/05 17:47:53 INFO common.Storage: Storage directory /home/jackzhou/name1 has been successfully formatted.  
  21. 13/04/05 17:47:53 INFO common.Storage: Image file of size 114 saved in 0 seconds.  
  22. 13/04/05 17:47:53 INFO common.Storage: Storage directory /home/jackzhou/name2 has been successfully formatted.  
  23. 13/04/05 17:47:53 INFO namenode.NameNode: SHUTDOWN_MSG:   
  24. /************************************************************  
  25. SHUTDOWN_MSG: Shutting down NameNode at jackzhou-node1/127.0.1.1  
  26. ************************************************************/  
    查看输出保证分布式文件系统格式化成功。执行完后可以到master机器上看到/home/jackzhou/name1和/home/jackzhou/name2两个目录。在主节点master上面启动hadoop,主节点会启动所有从节点的hadoop。
    (2)启动所有节点
    同时启动所有HDFS集群和MapReduce集群:bin/start-all.sh。执行完后可以到master和slaves机器上看到/home/jackzhou/data1和/home/jackzhou/data2两个目录。
    单独启动HDFS集群:bin/start-dfs.sh。该脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动DataNode守护进程。
    单独启动MapReduce集群:bin/start-mapred.sh。该脚本在JobTracker机器上运行,它参照JobTracker上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动TaskTracker守护进程。
    (3)关闭所有节点
    从主节点master关闭hadoop:bin/stop-all.sh。主节点会关闭所有从节点的hadoop。Hadoop守护进程的日志写入到${HADOOP_LOG_DIR}目录(默认是${HADOOP_HOME}/logs)。
    5、测试
    (1)查看集群:NameNode的默认地址为http://jackzhou-node1:50070/,JobTracker的默认地址为http://jackzhou-node1:50030/
    (2)使用netstat –nat查看端口49000和49001是否正在使用。
    (3)使用jps查看进程。要想检查守护进程是否正在运行,可以使用jps命令(这是用于JVM进程的ps实用程序)。这个命令列出5个守护进程及其进程标识符。
    (5)将输入文件拷贝到分布式文件系统:
[plain] view plaincopy
  1. $ bin/hadoop fs -mkdir input  
  2. $ bin/hadoop fs -put conf/core-site.xml input  
    运行发行版提供的示例程序:
[plain] view plaincopy
  1. $ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'  
    这条命令意思是使用hadoop命令运行jar包,包名为hadoop-examples-1.0.4.jar,即hadoop示例程序。整个命令就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。这里的grep是一个MapReduce程序,用来对输入进行正则表达式匹配,匹配正确的结果写到输出中,正则表达式是后边的'dfs[a-z.]+'。
    在分布式文件系统上查看输出文件:bin/hadoop fs -cat output/*
    统计结果:hadoop fs -cat output/part-00000
    6、HDFS常用操作
hadoop dfs -ls:列出HDFS下的文件
hadoop dfs -ls in:列出HDFS下某个文档中的文件
hadoop dfs -put test1.txt test:上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才算成功
hadoop dfs -get in getin:从HDFS获取文件并且重新命名为getin,同put一样可操作文件也可操作目录
hadoop dfs -rmr out:从HDFS上删除指定文件
hadoop dfs -cat in/*:查看HDFS上in目录的内容
hadoop dfsadmin -report:查看HDFS的基本统计信息
hadoop dfsadmin -safemode leave:退出安全模式
hadoop dfsadmin -safemode enter:进入安全模式
    7、添加节点
    可扩展性是HDFS的一个重要特性,首先在新加的节点上安装hadoop,然后修改$HADOOP_HOME/conf/master文件,加入NameNode主机名,然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文件,加入新加节点
主机名,再建立到新加节点无密码的SSH连接。
    运行启动命令:start-all.sh
    然后可以通过http://(Master主机名):50070,查看新添加的DataNode
    8、负载均衡
    start-balancer.sh,可以使DataNode节点上选择策略重新平衡DataNode上的数据块的分布。

版权声明:本文为博主原创文章,未经博主允许不得转载。

0 0
原创粉丝点击