首页 > 代码库 > hadoop 配置示例

hadoop 配置示例

安装配置hadoop:


1 安装前的准备工作


本示例所演示的过程基于RHEL 5.8(32bit)平台,用到的应用程序如下所示。

JDK: jdk-7u5-linux-i586.rpm

Hadoop:hadoop-0.20.2-cdh3u5.tar.gz


安全起见,运行Hadoop需要以普通用户的身份进行,因此,接下来先建立运行hadoop进程的用户hadoop并给其设定密码。

# useradd hadoop

# echo "password" | passwd --stdin hadoop 


而后配置hadoop用户能够以基于密钥的验正方式登录本地主机,以便Hadoop可远程启动各节点上的Hadoop进程并执行监控等额外的管理工作。

[root@master ~]# su - hadoop

[hadoop@master ~]$ ssh-keygen -t rsa -P ‘‘ 

[hadoop@master ~]$ ssh-copy-id -i .ssh/id_rsa.pub hadoop@localhost


2 安装JDK


Hadoop依赖于1.6 update 8或更新版本的Java环境。本文采用的jdk是rpm格式的安装包,在oracle官方的下载页面中即可找到合适的版本。其安装过程非常简单,使用类似如下命令即可。


# rpm -ivh jdk-7u5-linux-i586.rpm


Hadoop运行时需要能访问到如前安装的Java环境,这可以通过将其二进制程序(/usr/java/latest)所在的目录添加至PATH环境变量的路径中实现,也可以通过设定hadoop-env.sh脚本来进行。这里采用前一种方式,编辑/etc/profile.d/java.sh,在文件中添加如下内容:

JAVA_HOME=/usr/java/latest/

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME PATH


切换至hadoop用户,并执行如下命令测试jdk环境配置是否就绪。

# su - hadoop

$ java -version

java version "1.7.0_05"

Java(TM) SE Runtime Environment (build 1.7.0_05-b05)

Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)


3.1 hadoop安装配置


# tar xf hadoop-0.20.2-cdh3u5.tar.gz -C /usr/local

# chown -R hadoop:hadoop /usr/local/hadoop-0.20.2-cdh3u5

# ln -sv /usr/local/hadoop-0.20.2-cdh3u5 /usr/local/hadoop


然后编辑/etc/profile.d/hadoop.sh,设定HADOOP_HOME环境变量的值为hadoop的解压目录,并让其永久有效。编辑/etc/profile,添加如下内容:

HADOOP_BASE=/usr/local/hadoop

PATH=$HADOOP_BASE/bin:$PATH

export HADOOP_BASE PATH


切换至hadoop用户,并执行如下命令测试hadoop是否就绪。

# hadoop version

Hadoop 0.20.2-cdh3u5

Subversion git://ubuntu-slave02/var/lib/jenkins/workspace/CDH3u5-Full-RC/build/cdh3/hadoop20/0.20.2-cdh3u5/source -r 30233064aaf5f2492bc687d61d72956876102109

Compiled by jenkins on Fri Oct  5 17:21:34 PDT 2012

From source with checksum de1770d69aa93107a133657faa8ef467



3.2 Hadoop的配置文件:


hadoop-env.sh: 用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及master和slave文件的位置等;


core-site.xml: 用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;


hdfs-site.xml: HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;


mapred-site.xml:HDFS的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置;


masters: hadoop的secondary-masters主机列表,当启动Hadoop时,其会在当前主机上启动NameNode和JobTracker,然后通过SSH连接此文件中的主机以作为备用NameNode; 


slaves:Hadoop集群的slave主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNode和taskTracker进程;


3.3 Hadoop的分布式模型


Hadoop通常有三种运行模式:本地(独立)模式、伪分布式(Pseudo-distributed)模式和完全分布式(Fully distributed)模式。


安装完成后,Hadoop的默认配置即为本地模式,此时Hadoop使用本地文件系统而非分布式文件系统,而且其也不会启动任何Hadoop守护进程,Map和Reduce任务都作为同一进程的不同部分来执行。因此,本地模式下的Hadoop仅运行于本机。此种模式仅用于开发或调试MapReduce应用程序但却避免了复杂的后续操作。


伪分布式模式下,Hadoop将所有进程运行于同一台主机上,但此时Hadoop将使用分布式文件系统,而且各jobs也是由JobTracker服务管理的独立进程。同时,由于伪分布式的Hadoop集群只有一个节点,因此HDFS的块复制将限制为单个副本,其secondary-master和slave也都将运行于本地主机。此种模式除了并非真正意义的分布式之外,其程序执行逻辑完全类似于完全分布式,因此,常用于开发人员测试程序执行。


要真正发挥Hadoop的威力,就得使用完全分布式模式。由于ZooKeeper实现高可用等依赖于奇数法定数目(an odd-numbered quorum),因此,完全分布式环境需要至少三个节点。


配置Hadoop的伪分布式模式


传统上使用的hadoop-site.xml文件已经过时,现在分别使用core-site.xml、mapred-site.xml和hdfs-site.xml来取代core-default.xml、mapred-default.xml和 hdfs-default.xml中的默认配置。hadoop为这些文件提供了模板,其关于xml文档文件格式定义的部分及<configure></configure>已经存在,此时所需要做的仅是在其中添加相应的配置即可。


3.4.1 编辑conf/core-site.xml,配置Hadoop的核心属性

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="http://www.mamicode.com/configuration.xsl"?>


<configuration>

  <property>

    <name>hadoop.tmp.dir</name>

    <value>/hadoop/temp</value>

  </property>

  

  <property>

    <name>fs.default.name</name>

    <value>hdfs://localhost:8020</value>

  </property>  

</configuration>


上面示例中hadoop.tmp.dir属性用于定义Hadoop的临时目录,其默认为/tmp/hadoop-${username}。HDFS进程的许多目录默认都在此目录中,本示例将其定义到了/hadoop/temp目录,需要注意的是,要保证运行Hadoop进程的用户对其具有全部访问权限。fs.default.name属性用于定义HDFS的名称节点和其默认的文件系统,其值是一个URI,即NameNode的RPC服务器监听的地址(可以是主机名)和端口(默认为8020)。其默认值为file:///,即本地文件系统。


3.4.2 编辑conf/mapred-site.xml,定义MapReduce


运行MapReduce需要为其指定一个主机作为JobTracker节点,在一个小规模的Hadoop集群中,它通常跟NameNode运行于同一物理主机。可以通过mapred.job.trakcer属性定义JobTracker监听的地址(或主机名)和端口(默认为8021),与前面的fs.default.name属性的值不同的是,这不是一个URI,而仅一个“主机-端口”组合。


在MapReduce作业运行过程中,中间数据(intermediate data)和工作文件保存于本地临时文件中。根据运行的MapReduce作业不同,这些数据文件可能会非常大,因此,应该通过mapred.local.dir属性为其指定一个有着足够空间的本地文件系统路径,其默认值为${hadoop.tmp.dir}/mapred/local。mapred.job.tracker可以接受多个以逗号分隔路径列表作为其值,并会以轮流的方式将数据分散存储在这些文件系统上,因此指定位于不同磁盘上的多个文件系统路径可以分散数据I/O。


另外,MapReduce使用分布式文件系统为各TaskTracker保存共享数据,这可以通过mapred.system.dir属性进行定义,其默认值为${hadoop.tmp.dir}/mapred/system。下面给出了一个较简单的mapred-site.xml文件示例。


<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="http://www.mamicode.com/configuration.xsl"?>


<configuration>

  <property>

    <name>mapred.job.tracker</name>

    <value>localhost:8021</value>

  </property>

</configuration>


3.4.3 编辑conf/hdfs-site.xml,定义hdfs的属性


HDFS进程有许多属性可以定义其工作路,如dfs.name.dir属性定义的HDFS元数据持久存储路径默认为${hadoop.tmp.dir}/dfs/name、dfs.data.dir属性定义的DataNode用于存储数据块的目录路径默认为${hadoop.tmp.dir}/dfs/data、fs.checkpoint.dir属性定义的SecondaryNameNode用于存储检查点文件的目录默认为${hadoop.tmp.dir}/dfs/namesecondary。


为了数据可用性及冗余的目的,HDFS会在多个节点上保存同一个数据块的多个副本,其默认为3个。而只有一个节点的伪分布式环境中其仅用保存一个副本即可,这可以通过dfs.replication属性进行定义。如下所示的内容即可作为最简单的hdfs-site.xml配置文件。


<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="http://www.mamicode.com/configuration.xsl"?>


<configuration>

  <property>

    <name>dfs.replication</name>

    <value>1</value>

  </property>

</configuration>

  

3.4.4 格式化名称节点


以hadoop用户运行如下命令

$ hadoop namenode -format


其执行后会显示为类似如下内容:

17/02/06 22:16:02 INFO namenode.NameNode: STARTUP_MSG: 

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG:   host = localhost.localdomain/127.0.0.1

STARTUP_MSG:   args = [-format]

STARTUP_MSG:   version = 0.20.2-cdh3u5

STARTUP_MSG:   build = git://ubuntu-slave02/var/lib/jenkins/workspace/CDH3u5-Full-RC/build/cdh3/hadoop20/0.20.2-cdh3u5/source -r 30233064aaf5f2492bc687d61d72956876102109; compiled by ‘jenkins‘ on Fri Oct  5 17:21:34 PDT 2012

************************************************************/

17/02/06 22:16:03 INFO util.GSet: VM type       = 32-bit

17/02/06 22:16:03 INFO util.GSet: 2% max memory = 19.33375 MB

17/02/06 22:16:03 INFO util.GSet: capacity      = 2^22 = 4194304 entries

17/02/06 22:16:03 INFO util.GSet: recommended=4194304, actual=4194304

17/02/06 22:16:03 INFO namenode.FSNamesystem: fsOwner=hadoop (auth:SIMPLE)

17/02/06 22:16:04 INFO namenode.FSNamesystem: supergroup=supergroup

17/02/06 22:16:04 INFO namenode.FSNamesystem: isPermissionEnabled=true

17/02/06 22:16:04 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=1000

17/02/06 22:16:04 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)

17/02/06 22:16:04 INFO common.Storage: Image file of size 112 saved in 0 seconds.

17/02/06 22:16:05 INFO common.Storage: Storage directory /hadoop/temp/dfs/name has been successfully formatted.

17/02/06 22:16:05 INFO namenode.NameNode: SHUTDOWN_MSG: 

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at localhost.localdomain/127.0.0.1

************************************************************/


其中的“Storage directory /hadoop/temp/dfs/name has been successfully formatted”一行信息表明对应的存储已经格式化成功。


3.4.5 启动hadoop


Hadoop提供了2个脚本start-dfs.sh和start-mapred.sh,分别用于启动hdfs相关的进程和mapred相关的进程。事实上,为了使用的便捷性,在NameNode和JobTracker运行于同一主机的场景中,Hadoop还专门提供了脚本start-all.sh脚本来自动执行前述两个脚本。


$ /usr/local/hadoop/bin/start-all.sh 

其会输出类似如下内容:

starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-localhost.localdomain.out

localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-localhost.localdomain.out

localhost: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-localhost.localdomain.out

starting jobtracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-jobtracker-localhost.localdomain.out

localhost: starting tasktracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-localhost.localdomain.out


运行jps命令查看正在运行的Hadoop进程

$ jps | grep -iv "jps"

29326 DataNode

29478 SecondaryNameNode

29685 TaskTracker

29208 NameNode

29563 JobTracker


3.4.6 Hadoop进程监听的地址和端口


Hadoop启动时会运行两个服务器进程,一个为用于Hadoop各进程之间进行通信的RPC服务器,另一个是提供了便于管理员查看Hadoop集群各进程相关信息页面的HTTP服务器。


用于定义各RPC服务器所监听的地址和端口的属性有如下几个:

fs.default.name:定义HDFS的NameNode用于提供URI所监听的地址和端口,默认端口为8020;

dfs.datanode.ipc.address:DataNode上IPC服务器监听的地址和端口,默认为0.0.0.0:50020;

mapred.job.tracker:JobTracker的PRC服务器所监听的地址和端口,默认端口为8021;

mapred.task.tracker.report.address:TaskTracker的RPC服务器监听的地址和端口;TaskTracker的子JVM使用此端口与TaskTracker进行通信,它仅需要监听在本地回环地址127.0.0.1上,因此可以使用任何端口;只有在当本地没有回环接口时才需要修改此属性的值;


除了RPC服务器之外,DataNode还会运行一个TCP/IP服务器用于数据块传输,其监听的地址和端口可以通过dfs.datanode.address属性进行定义,默认为0.0.0.0:50010。


可用于定义各HTTP服务器的属性有如下几个:

mapred.job.tracker.http.addrss:JobTracker的HTTP服务器地址和端口,默认为0.0.0.0:50030;

mapred.task.tracker.http.address:TaskTracker的HTTP服务器地址和端口,默认为0.0.0.0:50060;

dfs.http.address:NameNode的HTTP服务器地址和端口,默认为0.0.0.0:50070;

dfs.datanode.http.address:DataNode的HTTP服务器地址和端口,默认为0.0.0.0:50075;

dfs.secondary.http.address:SecondaryNameNode的HTTP服务器地址和端口,默认为0.0.0.0:50090;


上述的HTTP服务器均可以通过浏览器直接访问以获取对应进程的相关信息。


下面的命令可以查看jvm监听的端口。 

$ netstat -tnlp | grep "java"

(Not all processes could be identified, non-owned process info

 will not be shown, you would have to be root to see it all.)

tcp        0      0 0.0.0.0:50020               0.0.0.0:*                   LISTEN      29326/java          

tcp        0      0 0.0.0.0:52805               0.0.0.0:*                   LISTEN      29208/java          

tcp        0      0 0.0.0.0:50090               0.0.0.0:*                   LISTEN      29478/java          

tcp        0      0 0.0.0.0:50060               0.0.0.0:*                   LISTEN      29685/java          

tcp        0      0 0.0.0.0:50030               0.0.0.0:*                   LISTEN      29563/java          

tcp        0      0 0.0.0.0:51664               0.0.0.0:*                   LISTEN      29478/java          

tcp        0      0 0.0.0.0:54898               0.0.0.0:*                   LISTEN      29326/java          

tcp        0      0 0.0.0.0:55475               0.0.0.0:*                   LISTEN      29563/java          

tcp        0      0 127.0.0.1:8020              0.0.0.0:*                   LISTEN      29208/java          

tcp        0      0 127.0.0.1:44949             0.0.0.0:*                   LISTEN      29685/java          

tcp        0      0 127.0.0.1:8021              0.0.0.0:*                   LISTEN      29563/java          

tcp        0      0 0.0.0.0:50070               0.0.0.0:*                   LISTEN      29208/java          

tcp        0      0 0.0.0.0:50010               0.0.0.0:*                   LISTEN      29326/java          

tcp        0      0 0.0.0.0:50075               0.0.0.0:*                   LISTEN      29326/java     



4 Hadoop命令


hadoop有很多子命令,用于完成不同的功能,这个可以通过如下命令查看。

$ hadoop


其中的fs子命令用于进行跟文件系统相关的多种操作,如创建目录、复制文件或目录等,其具体的使用帮助可以使用如下命令获得。

$ hadoop fs -help


hadoop的fs命令能同时跟本地文件系统和HDFS交互,甚至可以跟Amazon的S3进行交互。其使用URI格式路径引用文件路径,完全的URI格式类似schema://authority/path,其中schema类似于协议,这里可以使用hdfs或file,分别用于引用 HDFS文件或本地文件系统中的文件。而对于HDFS来说,authority是指Namenode主机,path是指具体的文件路径。例如,在伪文件系统模式中,HDFS运行于本机的8020端口,因此hdfs://localhost:8020/user/hadoop/test.txt就是一个完整意义上的URI。事实上,在使用中,也可以省略URI中的schema://authority部分,此时其使用配置文件中默认名称段的定义,如我们前面定义的类似如下段的配置信息:


  <property>

    <name>fs.default.name</name>

    <value>hdfs://localhost:9000</value>

  </property>


在fs命令用于实现在本地文件系统和HDFS之间传递文件时,可以使用-get(从HDFS中复制文件至本地文件系统)或-put(将本地文件复制到HDFS中)命令实现,而fs会根据使用的命令来判断哪个是本地文件系统路径,哪个是HDFS文件系统路径,如将本地的/etc/issue复制到HDFS中存放至当前hadoop用户的目录中,则可使用如下命令:


$ hadoop fs -put /etc/issue  hdfs://localhost:9000/user/hadoop/

或使用命令

$ hadoop fs -put /etc/issue  /user/hadoop/


复制的结果可以使用如下命令查看:

$ hadoop fs -ls

Found 1 items

-rw-r--r--   1 hadoop supergroup         74 2012-09-20 23:03 /user/hadoop/issue


本文出自 “logs” 博客,请务必保留此出处http://51log.blog.51cto.com/6076767/1899616

hadoop 配置示例