Hadoop Cluster Setup 19 Mar 2014

安装准备

确保JDK1.6安装在clusters中,并保证ssh和sshd均以安装

如果ssh和sshd没有安装,可以通过以下方式来安装:

$ sudo apt-get install ssh
$ sudo apt-get install rsync

下载hadoop分发包,并将其解压到clusters中,最好放在同一个目录。

一般情况下,一台机器作为NameNode,另一台机器作为JobTracker,它们是masters,其他机器作为DataNode和TaskTracker,也就是slaves。各个cluster需要设置HADOOP_INSTALL

$ export HADOOP_INSTALL=/opt/hadoop102
$ export PATH=$HADOOP_INSTALL/bin:$PATH

注:HADOOP_HOME已废弃

Check是否能够无密码登陆本机

$ ssh localhost

如果提示需要输入密码,则需要使用如下命令来生成密钥:

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

第一条命令会生成id_dsaid_dsa.pub两个文件,这两个文件成对出现。

如果修改后无效,确认.sshauthorized_keys只有用户本身有读写权限,如果仍然无效,需确认root目录不是777权限,如果是,请将其改为默认650.

接下来要确保NameNode可以无密码登陆DataNodes把NameNode中的`id_dsa.pub`追加到其他DataNodes的`authorized_keys`文件中

例如:

$ scp id_dsa.pub root@123.125.208.231:/root/mengke/id_dsa.pub
$ cat /root/mengke/id_dsa.pub >> ~/.ssh/authorized_keys

使用ssh root@123.125.208.231验证

另外如果需要使用rsync来同步各个集群的配置的话,还需要将DataNodes的公钥添加到NameNode的验证文件中

确保DataNodes可以无密码访问NameNode

关闭Linux防火墙

$ chkconfig iptables off

如果不关闭防火墙,会出现找不到DataNodes的问题

配置Hadoop

配置conf/hadoop-env.sh(须在多台机器上配置,如果是大型集群可以采用自动安装脚本来分发这些配置)

自定义JAVA_HOME(必配,即使在系统环境变量中配置了JAVA_HOME, 还是需要在文件中配置该项)

$ export JAVA_HOME=/usr/lib/j2sdk1.5-sun

设置HADOOP_MASTER项,该项会使用rsync把以HADOOP_MASTER为根目录树与本地的HADOOP_INSTALL目录进行同步

HADOOP_MASTER=123.125.208.230:/opt/hadoop102

其他有用的参数:

HADOOP_LOG_DIR 指定LOG输出地址

HADOOP_HEAPSIZE 指定使用内存大小

配置conf/core-site.xml

添加如下参数:

<!-- 指定NameNode -->
<property>
   <name>hadoop.tmp.dir</name>
   <value>/opt/hadoop_data/tmp</value>
   <description>a base directory for some temporary directories</description>
</property>
<!-- 指定NameNode -->
<property>
   <name>fs.default.name</name>
   <value>hdfs://123.125.208.230:8020</value>
</property>
<!-- 如不指定端口,默认为8020 -->

配置conf/hdfs-site.xml

添加如下参数:

<!-- dfs.replication默认为3, 如果不配置,datanode小于3台会报错 -->
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>
另外可以指定
<!-- namenode的元数据存储目录 -->
<property>
  <name>dfs.name.dir</name>
  <value>/disk1/hdfs/name,/remote/hdfs/name</value>
  <!-- <final>true</final> -->
</property>
<!-- datanode的数据存储目录 -->
<property>
  <name>dfs.data.dir</name>
  <value>/disk1/hdfs/data,/disk2/hdfs/data</value>
  <!-- <final>true</final> -->
</property>
<!-- 辅助namenode的存储文件系统的检查点目录 -->
<property>
  <name>fs.checkpoint.dir</name>
  <value>/disk1/hdfs/namesecondary,/disk2/hdfs/namesecondary</value>
  <!-- <final>true</final> -->
</property>

配置conf/mapred-site.xml

<!-- 指定JobTracker的主机名和端口 -->
<property>
  <name>mapred.job.tracker</name>
  <value>123.125.208.230:8021</value>
  <!-- <final>true</final> -->
</property>
<!-- 如不指定端口,默认为8021 -->
 
<!-- 另外可以指定 存储作业中间数据的目录列表(逗号分割目录列表) -->
<property>
  <name>mapred.local.dir</name>
  <value>/disk1/mapred/local,/disk2/mapred/local</value>
  <!-- <final>true</final> -->
</property>
<!-- 存储作业运行期间共享文件的目录(URI) -->
<property>
  <name>mapred.system.dir</name>
  <value>/tmp/hadoop/mapred/system</value>
  <!-- <final>true</final> -->
</property>
<!-- 运行在tasktracker上的map任务的最大数 -->
<property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value>7</value>
  <!-- <final>true</final> -->
</property>
<!-- 运行在tasktracker上的reduce任务的最大数 -->
<property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
  <value>7</value>
  <!-- <final>true</final> -->
</property>
<!-- JVM选项,用于启动运行map和reduce任务的tasktracker子进程 -->
<property>
  <name>mapred.child.java.opts</name>
  <value>-Xmx400m</value>
  <!-- 不要标记为final,这样Jobs可以包含JVM的调试配置 -->
</property>

配置conf下的masters和slaves(只需在name node上设置)

masters是辅助namenode的机器列表,每行一个,如果namenode只有一个,该文件不需配置;

slaves是存放tasktracker和datanode的机器列表,每行一个

例如:

123.125.208.231
123.125.208.232

运行hadoop

初始化namenode

$ hdfs namenode –format

启动Hadoop

$ start-all.sh

在masters和slaves中的使用jps命令查看processes的状态

$ jps

查看集群状态

$ hadoop dfsadmin -report

通过浏览器查看namenode和jobtracker的状态

NameNode - http://123.125.208.230:50070/

JobTracker - http://123.125.208.230:50030/

如果在NameNode状态中显示没有LiveNode,请确认已经关闭防火墙,并确定DataNodes的配置与NameNode的配置相同, 可以查看有关NameNode和DataNodes的启动日志。

运行示例程序

Copy the input files into the distributed filesystem

$ bin/hadoop fs -put conf input

Run some of the examples provided

$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'

Copy the output files from the distributed filesystem to the local filesytem and examine them

$ bin/hadoop fs -get output output
$ cat output/*

or

View the output files on the distributed filesystem

$ bin/hadoop fs -cat output/*