快速部署Hadoop Cluster

绚丽也尘埃 » 快速部署Hadoop Cluster

快速部署Hadoop Cluster

在开发环境经常需要部署Hadoop集群,如果每次都手工去做,显得非常繁琐,并且容易犯错。所以我想着使用Python写一个脚本,通过简单的配置文件,运行这个脚本就能部署一个Hadoop集群。这个集群使用的Hadoop版本为0.19.2,因为Hadoop 0.20的配置文件稍有不同。

首先是设计配置文件,Hadoop依赖JDK,因此这个配置文件应该包括以下几个部分。这个文件就叫cluster.conf吧。

Hadoop tar包所在位置
JDK tar包所在位置
master的名字或者IP地址
slave的名字或者IP地址(以逗号分隔)
安装的路径(必须将Hadoop安装在每台机器的相同目录下)

根据上面的设计,得到这样一个配置文件:

hadoop=software/hadoop-0.19.2.tar.gz
jdk=software/jdk1.6.0_13.tar.gz
master=192.168.208.14
slave=192.168.208.11;192.168.208.13
install_path=/home/henshao

设计好了配置文件,就可以编写脚本程序了。脚本程序所做的工作主要分为以下几部分:

1、将Hadoop包和JDK包分发到所有的机器上。

2、解压所有机器上的Hadoop包和JDK包。

3、根据cluster.conf中master和slave信息,生成对应的masters文件和slaves文件。

4、分发所有的配置文件到正确的目录下。配置文件主要是hadoop-site.xml、hadoop-env.sh、masters和slaves,这些文件要放在hadoop主目录下的conf子目录下。

脚本的代码如下:

#!/bin/env python

application = "scp %s %s:%s ; scp %s %s:%s"
install = "ssh %s 'tar zxvf %s; tar zxvf %s'";
specs = "scp %s %s %s %s %s:%s"

f = file("cluster.conf", "r");

str = f.readline();

hosts = []

while str:

        str = str.strip();

        if str.find("master") != -1:
                master = str[str.find("=")+1:]
                hosts.append(master);
        elif str.find("slave") != -1:
                slaves = str[str.find("=")+1:].split(";");
                hosts = hosts + slaves;
        elif str.find("hadoop") != -1:
                hadoop = str[str.find("=")+1:];
        elif str.find("jdk") != -1:
                jdk = str[str.find("=")+1:];
        elif str.find("install_path") != -1:
                path = str[str.find("=")+1:];

        str = f.readline();

temp = path+"/"+hadoop[hadoop.find("/")+1 : hadoop.find(".tar.gz")]+"/conf";

hadoop_dst = hadoop[hadoop.find("/")+1:];
jdk_dst = jdk[jdk.find("/")+1:];

print temp;

masters_file = file("masters", "w");

masters_file.write(master+"\n");

masters_file.close();

slaves_file = file("slaves", "w");

for slave in slaves:
        slaves_file.write(slave+"\n");

slaves_file.close();

for host in hosts:
        print host;
        os.system(application % (hadoop, host, path, jdk, host, path));
        os.system(install % (host, hadoop_dst, jdk_dst));
        os.system(specs % ("hadoop-site.xml", "hadoop-env.sh", "masters", "slaves", host, temp));

将相关的文件放到一个目录下,然后打成包,目录路径如下:

henshao@henshao-desktop:~/hadoop_cluster$ tree
.
|-- cluster.conf
|-- hadoop-env.sh
|-- hadoop-site.xml
|-- masters
|-- setup.py
|-- slaves
`-- software
    |-- hadoop-0.19.2.tar.gz
    `-- jdk1.6.0_13.tar.gz

嗯,在运行这个脚本之前还要做以下两个工作。

1、打通集群中所有的服务器,这些机器相互之间通过ssh可以直接登录。

2、配置hadoop-site.xml和hadoop-env.sh。hadoop-env.sh配置非常简单,只需要指明jdk安装目录即可。

export JAVA_HOME=/home/henshao/jdk1.6.0_13

hadoop-site.xml一个非常简单的配置如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>
<name>hadoop.tmp.dir</name>
<value>/home/henshao/hadoop-datastore/hadoop-${user.name}</value>
<description>A base for other temporary directories.</description>
</property>

<property>
<name>fs.default.name</name>
<value>hdfs://192.168.208.14:54310</value>
<description>The name of the default file system.  A URI whose
scheme and authority determine the FileSystem implementation.  The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class.  The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>

<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>

<property>
<name>mapred.job.tracker</name>
<value>192.168.208.14:54311</value>
<description>The host and port that the MapReduce job tracker runs
at.  If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>

</configuration>

如果有些服务器之前已经部署过Hadoop,并且之前hadoop.tmp.dir目录同本次部署的一样,那么很可能会出现DataNode VERSION文件中的namespaceID同master的namespaceID不一致的情况,这样是不能启动DataNode的。这种情况下直接将slave的hadoop.tmp.dir目录全部删除即可,这个目录会在DataNode启动的时候被自动创建。

在我部署的一个集群中,NameNode和DataNode的VERSION文件分别如下。

-bash-3.00$ cat /home/henshao/hadoop-datastore/hadoop-henshao/dfs/name/current/VERSION
#Mon Aug 09 16:40:40 CST 2010
namespaceID=779524235
cTime=0
storageType=NAME_NODE
layoutVersion=-18
[henshao@test208011 current]$ cat /home/henshao/hadoop-datastore/hadoop-henshao/dfs/data/current/VERSION
#Mon Aug 09 16:38:35 CST 2010
namespaceID=779524235
storageID=DS-170430777-192.168.208.11-50010-1281332656244
cTime=0
storageType=DATA_NODE
layoutVersion=-18
原文地址:https://www.cnblogs.com/lexus/p/2388719.html