搭建Hadoop集群

    官方配置手册: 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上可以安装:

$ sudo apt-get install openssh-server
$ 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目录。
$ mkdir input
$ cp conf/*.xml input
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
$ cat output/*
    Hadoop也可以通过伪分布式模式运行在单个节点上,这时每个Hadoop守护进程都是一个单独的Java进程。下面是一个配置实例:
    conf/core-site.xml文件:

<configuration>
     <property>
         <name>fs.default.name</name>
         <value>hdfs://localhost:9000</value>
     </property>
</configuration>
    conf/hdfs-site.xml文件:
<configuration>
     <property>
         <name>dfs.replication</name>
         <value>1</value>
     </property>
</configuration>
    conf/mapred-site.xml文件:
<configuration>
     <property>
         <name>mapred.job.tracker</name>
         <value>localhost:9001</value>
     </property>
</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为无需密码,自动登录的。
$cd /home/jackzhou
$ssh-keygen -t rsa  (一直回车,设置成空密码)
$cd .ssh
$cp id_rsa.pub  authorized_keys
    测试是否需要密码,若无需密码,则成功:
$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。
$scp authorized_keys jackzhou-node2:/home/jackzhou/.ssh/
$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的地址和端口号。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
	<property>
		<name>fs.default.name</name>
		<value>hdfs://jackzhou-node1:49000</value>
	</property>
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/home/jachzhou/hadoop-1.0.4/tmp</value>
		<description>A base for other temporary directories.</description>
	</property>
</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的目录结构。
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>dfs.name.dir</name>
		<value>/home/jackzhou/name1,/home/jackzhou/name2</value>
		<description>Name directories</description>
	</property>
	<property>
		<name>dfs.data.dir</name>
		<value>/home/jackzhou/data1,/home/jackzhou/data2</value>
		<description>Data directories</description>
	</property>
	<property>
		<name>dfs.replication</name>
		<!-- 我们的集群有两个结点,所以rep两份 -->
		<value>2</vaue>
	</property>
</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的地址和端口。
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>mapred.job.tracker</name>
		<value>jackzhou-node1:49001</value>
	</property>
	<property>
		<name>mapred.local.dir</name>
		<value>/home/jachzhou/hadoop-1.0.4/tmp</value>
        </property>
</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
    成功时系统输出:
13/04/05 17:47:47 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = jackzhou-node1/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.0.4
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
************************************************************/
13/04/05 17:47:47 INFO util.GSet: VM type       = 32-bit
13/04/05 17:47:47 INFO util.GSet: 2% max memory = 19.33375 MB
13/04/05 17:47:47 INFO util.GSet: capacity      = 2^22 = 4194304 entries
13/04/05 17:47:47 INFO util.GSet: recommended=4194304, actual=4194304
13/04/05 17:47:52 INFO namenode.FSNamesystem: fsOwner=jackzhou
13/04/05 17:47:52 INFO namenode.FSNamesystem: supergroup=supergroup
13/04/05 17:47:52 INFO namenode.FSNamesystem: isPermissionEnabled=true
13/04/05 17:47:52 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
13/04/05 17:47:52 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
13/04/05 17:47:52 INFO namenode.NameNode: Caching file names occuring more than 10 times 
13/04/05 17:47:52 INFO common.Storage: Image file of size 114 saved in 0 seconds.
13/04/05 17:47:53 INFO common.Storage: Storage directory /home/jackzhou/name1 has been successfully formatted.
13/04/05 17:47:53 INFO common.Storage: Image file of size 114 saved in 0 seconds.
13/04/05 17:47:53 INFO common.Storage: Storage directory /home/jackzhou/name2 has been successfully formatted.
13/04/05 17:47:53 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at jackzhou-node1/127.0.1.1
************************************************************/
    查看输出保证分布式文件系统格式化成功。执行完后可以到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)将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -mkdir input
$ bin/hadoop fs -put conf/core-site.xml input
    运行发行版提供的示例程序:
$ 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上的数据块的分布。

你可能感兴趣的:(hadoop,大数据,hdfs,HADOOP集群)