轻松构建分布式Hadoop

轻松构建分布式Hadoop
随着互联网的发展,大数据运算需求日益剧增,开源的hadoop出现至今,几乎已成为了业界的默认标准,下面,笔者就开始构建一个简单的hadoop并行运算集群。

一、    环境介绍

模拟环境使用三台rhel5.8 32bit,各自IP和主机名如下:

    
    
    
    
  1. IP                            主机名        
  2. 192.168.88.253                none.mos.com    
  3. 192.168.88.129                lab1.mos.com 
  4. 192.168.88.130                lab2.mos.com 

其中

    
    
    
    
  1. none.mos.com负责任务管理和数据名称节点,在生产环境中,建议将此两项分开; 
  2.  
  3. lab1.mos.com为第二名称节点,其并不提供名称节点的功能,但默认情况下,负责周期性的将编辑日志合并至名称节点,并自己也保存一份,其提供了名称节点的冗余,但其数据依然落后于名称节点; 
  4.  
  5. lab3.mos.com为实际数据存储节点和任务执行节点。 

使用的软件版本及下载地址:

    
    
    
    
  1. JDK: jdk-7u5-linux-i586.rpm 
  2. 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
  3. Hadoop: hadoop-0.20.2-cdh3u5.tar.gz 
  4. 下载地址: http://hadoop.apache.org/releases.html
  5.  


二、    准备工作
2.1 修改每个主机的/etc/hosts文件如下:

    
    
    
    
  1. 192.168.88.253      none.mos.com    none 
  2. 192.168.88.129      lab1.mos.com    lab1 
  3. 192.168.88.130      lab2.mos.com    lab2 

2.2 在集群的每个节点建立用于运行hadoop的用户及设定密码

    
    
    
    
  1. # useradd hduser && echo "redhat" | passwd --stdin hduser 

2.3 为master节点的hduser用户能够管理并监控其他节点,在none节点做如下操作。

    
    
    
    
  1. # su – hduser 
  2. $ ssh-keygen -t rsa -P '' 
  3. $ ssh-copy-id -i .ssh/id_rsa.pub hduser@lab1 
  4. $ ssh-copy-id -i .ssh/id_rsa.pub hduser@lab2 

2.4 确保每个节点时间的一致性,并清空iptables和关闭selinux,此处操作略


三、    配置hadoop运行所需的java环境,此操作需在每个节点执行一遍。

3.1 安装jdk

    
    
    
    
  1. # rpm -ivh ~/root/Download/jdk-7u5-linux-i586.rpm 

3.2 配置java环境变量

    
    
    
    
  1. # vim /etc/profile.d/java.sh 
  2. JAVA_HOME=/usr/java/latest 
  3. PATH=$JAVA_HOME/bin:$PATH 
  4. export JAVA_HOME PATH 

3.3 使刚才配置的环境其生效(或重新登陆控制台亦可)

    
    
    
    
  1. # source /etc/profile.d/java.sh 

3.4 测试java环境是否OK

    
    
    
    
  1. # su – hduser 
  2. $ java –version 
  3. java version "1.7.0_05" 
  4. Java(TM) SE Runtime Environment (build 1.7.0_05-b05) 
  5. Java HotSpot(TM) Server VM (build 23.1-b03, mixed mode) 



四、    安装Hadoop,此步骤操作略长,但也需在每个节点执行。
4.1 解压至/usr/local目录,并做软件链接使其易于访问

    
    
    
    
  1. # tar xf ~/Download/hadoop-0.20.2-cdh3u5.tar.gz –C /usr/local/ 
  2. # ln -sv /usr/local/hadoop-0.20.2-cdh3u5 /usr/local/hadoop 

4.2 修改hadoop目录的属主属组,并配置hadoop环境变量

    
    
    
    
  1. # chown -R hduser. /usr/local/hadoop-0.20.2-cdh3u5 
  2. # vim /etc/profile.d/hadoop.sh 
  3. HADOOP_HOME=/usr/local/hadoop 
  4. PATH=$HADOOP_HOME/bin:$PATH 
  5. export HADOOP_HOME PATH 

4.3 使hadoop环境变量生效并使用hduser测试其是否就绪

    
    
    
    
  1. # source /etc/profile.d/hadoop.sh 
  2. # su – hduser 
  3. $ hadoop version 
  4. Subversion git://ubuntu-slave02/var/lib/jenkins/workspace/CDH3u5-Full-RC/build/cdh3/hadoop20/0.20.2-cdh3u5/source -r 30233064aaf5f2492bc687d61d72956876102109 
  5. Compiled by jenkins on Fri Oct  5 17:21:34 PDT 2012 
  6. From source with checksum de1770d69aa93107a133657faa8ef467 



五、    配置Hadoop,集群中每个节点只能通过配置文件来得知自身的角色,因此,以下配置需在每个节点都做同样修改。

5.1    定义第二名称节点的主机名或IP地址

    
    
    
    
  1. # echo ‘lab1.mos.com’ > /usr/local/hadoop/conf/masters 

5.2    定义数据节点和任务执行节点,笔者这里只有一个,而生成环境中,数据节点一般最少3个以上。

    
    
    
    
  1. # echo ‘lab2.mos.com’ > /usr/local/hadoop/conf/slaves 

5.3    定义系统级别的参数如下:

    
    
    
    
  1. # vim /usr/local/hadoop/conf/core-site.xml 
  2. <?xml version="1.0"?> 
  3. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
  4. <!-- Put site-specific property overrides in this file. --> 
  5. <configuration> 
  6.  
  7. <!-- 定义hadoop的分布式文件系统hdfs的名称节点。--> 
  8.     <property> 
  9.         <name>fs.default.name</name>   
  10.         <value>hdfs://none.mos.com:8020</value> 
  11.     </property> 
  12.  
  13. <!--定义临时文件的位置,需确保此目录存在,且hadoop的执行用户hduser对其有足够的权限. --> 
  14.     <property>     
  15.         <name>hadoop.tmp.dir</name> 
  16.         <value>/hadoop/temp</value> 
  17.     </property> 
  18.  
  19. <!--定义回收站,可不定义,设置在hdfs中删除的文件先放在回收站内,超时才会被删除,时间单位为分钟,笔者此处定义为100小时。--> 
  20.     <property> 
  21.         <name>fs.trash.interval</name>   
  22.         <value>6000</value> 
  23.     </property> 
  24.  
  25. </configuration> 

5.4    定义任务管理管理节点

    
    
    
    
  1. # vim /usr/local/hadoop/conf/mapred-site.xml 
  2. <?xml version="1.0"?> 
  3. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
  4.  
  5. <!-- Put site-specific property overrides in this file. --> 
  6.  
  7. <configuration> 
  8.     <property> 
  9.         <name>mapred.job.tracker</name> 
  10.         <value>none.mos.com:8021</value> 
  11.     </property> 
  12. </configuration> 

5.5    定义hadoop的分布式文件系统相关属性

    
    
    
    
  1. # vim /usr/local/hadoop/conf/hdfs-site.xml 
  2. <?xml version="1.0"?> 
  3. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
  4.  
  5. <!-- Put site-specific property overrides in this file. --> 
  6.  
  7. <configuration> 
  8.  
  9. <!-- 为了保证数据的冗余,定义切割后的数据块在几个节点上存储,生产环境中,建议最少3份以上,笔者这里就一个数据节点,因此,此处为1即可--> 
  10.      <property> 
  11.     <name>dfs.replication</name> 
  12.     <value>1</value> 
  13.      </property> 
  14.  
  15.     <!-- 数据名称节点用于存储HDFS文件数据块的本地目录,存储多份时,可写多个路径,以逗号隔开即可--> 
  16.      <property> 
  17.         <name>dfs.data.dir</name> 
  18.         <value>/hadoop/data</value> 
  19.         <final>ture</final> 
  20.      </property> 
  21.      
  22. <!-- 数据节点用于存储名称空间和事务日志的本地文件系统路径,存储多份时,可写多个路径,以逗号隔开即可 --> 
  23.      <property> 
  24.         <name>dfs.name.dir</name> 
  25.         <value>/hadoop/name</value> 
  26.         <final>ture</final> 
  27.      </property> 
  28.     
  29.     <!-- 用于定义HDFS元数据冗余的复制到这个目录 --> 
  30.      <property> 
  31.         <name>fs.checkpoint.dir</name> 
  32.         <value>/hadoop/namesecondary</value> 
  33.         <final>ture</final> 
  34.      </property> 
  35.  
  36. </configuration> 

5.6    创建hadoop配置中定义的目录,且给予相应的权限

    
    
    
    
  1. # mkdir -pv /hadoop/temp && chown -R hduser. /hadoop  

 

 

六、    格式化hadoop的分布式文件系统(HDFS),并检测hadoop是否就绪。
 

6.1 以hduser的身份格式,切记一定要将第五步的操作在三个节点全部完成

    
    
    
    
  1. # su - hduser 
  2. $ hadoop namenode –format 
  3. 出现“Storage directory /hadoop/temp/dfs/name has been successfully formatted”此行,才表示格式化成功,否则需检查是否配置出错。 

6.2 以hduser的身份启动hadoop

    
    
    
    
  1. $ start-all.sh 

6.3 使用jps在每个节点,检查是否启动正常.

轻松构建分布式Hadoop_第1张图片



七、    使用hadoop提供的字符统计应用程序算法样例做简单的计算实现

7.1 在hadoop的分布式文件系统(hdfs)中创建目录,并上传要计算的文件

    
    
    
    
  1. $ hadoop fs -mkdir mos-test 
  2. $ hadoop fs -put /etc/services mos-test 

7.2 调用hadoop提供的字符统计程序,计算上传的services文件的每个字符个数,并输出到hdfs的test-out目录中,此目录hadoop会自行创建。

    
    
    
    
  1. $ hadoop jar /usr/local/hadoop/hadoop-examples-0.20.2-cdh3u5.jar wordcount mos-test test-out 

7.3 等命令执行完成后,下载执行结果到本地当前目录,并查看相关内容

    
    
    
    
  1. $ hadoop fs -get ./test-out/part-r-00000 ./ 
  2. $ head part-r-00000 

7.4 也可不用下载直接查看HDFS的文件或目录

    
    
    
    
  1. $ hadoop fs –ls /  #查看hdfs的根位置 
  2. $ hadoop fs –cat  /user/hduser/test-out/part-r-00000   #不下载直接查看计算结果 
  3. Ps:  hadoop fs命令的相关用法,可通过:hadoop fs --help获得 

 



    到此为止,一个简单的分布式hadoop并行运算集群已经已然完成,哈哈,是不是很简单,但是需要说明的是,各位其实也看到了,并且想必各位也充满了各种 疑惑:这些命名神马的怎么这么奇怪?hdfs是怎么工作的?数据怎么分开存储的?数据怎么在被切开存储后还能计算?各个节点的高可用怎么实现?如果需要更 为复杂的运算怎么处理等等?相关内容,笔者也在慢慢的整理和学习,敬请关注哈。
 


补充一点相关知识:
当hadoop正常启动后,不同的节点,会开放不同的几个端口,可以直接通过web页面查看其相关信息的端口,实际上,开放的端口 远不止这些,(详情可以通过  netstat -tnlp|grep java)查看, 但是只有这些可以通过web直接打开查看。具体如下:
 

    
    
    
    
  1. 端口                    工作节点                 本此实验的web查方式 
  2. 0.0.0.0:50030     任务管理节点(JobTracker)                192.168.88.253:5030 
  3. 0.0.0.0:50070     HDFS的数据名称节点(NameNode)         192.168.88.253:5070 
  4. 0.0.0.0:50090     第二数据名称节点(SecondaryNameNode)     192.168.88.129:50090 
  5. 0.0.0.0:50060     任务执行节点(TaskTracker)               192.168.88.130:5060 
  6. 0.0.0.0:50075     数据节点(DataNode)                    192.168.88.130:5075 


下图是之前执行计算时笔者的截图:

轻松构建分布式Hadoop_第2张图片

 

你可能感兴趣的:(轻松构建分布式Hadoop)