Hadoop实验环境的搭建:standalone&pesudo cluster
这周结束前完成了Hadoop的本机配置,由于权限的原因还引发了一些小插曲。总之在最后完成了环境的安装。本机的配置为RHEL(RedHat Enterprise Linux) 6.7
- 添加用户/用户组
针对hadoop应用,添加相应的用户和用户组。我们就将其命名为hadoop。
# sudo groupadd hadoop
# sudo groupuser -g hadoop hadoop
这样就能遵守“最小权限”原则。
- SSH安装
首先是ssh的安装,在root权限下执行yum update之后,自动更新到最新的软件包。在我的环境下已经安装了ssh,只需启动即可。
$ sudo /etc/init.d/sshd start
为了方便Hadoop运作,我们使用ssh-keygen设置ssh无密码登录。[1]
- 无密登录
使用公钥-私钥的方式来进行避免密码输入和SSH认证。首先统一规定的hostname,按照[2]所指,修改3处hostname(注意root权限)。
# hostname Server
# vi /etc/sysconfig/network //直接添加 Server
# vi /etc/hosts //修改 127.0.0.1 的 hostname为 Server
然后就是生成密钥了。使用空密码的rsa加密方法。
$ ssh-keygen -t rsa -P ""
# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys
cat命令——进行文件之间的拼接并且输出到标准输出。这里是将生成的公钥附加到authorized_keys文件里。
这里一定要记得设置文件模式,不然通过如下命令检查时还是需要密码登录。
$ ssh localhost
- 安装Java
本机安装时是已经安装Java 1.7.0版本,这里略过。大家可以看这篇文章[3]。
- 安装hadoop
直接使用wget将官网上的软件包下载下来。接着解压并移动到/usr/local目录下。最后将目录所有为我们新添加的用户和用户组hadoop。
$ wget http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
$ tar xzf hadoop-2.7.2.tar.gz
$ sudo mv hadoop-2.7.2 /usr/local/hadoop
$ sudo chown -R hadoop:hadoop /usr/local/hadoop
tar命令——归档文件。参数-xzf表示提取gzip,如果带上v将会解压结果打印到termimal。
然后再配置hadoop-env.sh文件。2.7.2版本的文件在(hadoop/etc/hadoop/hadoop_env.sh)。
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-ibm-1.7.0.9.40.x86_64/jre
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/usr/local/hadoop/bin
部署单机版Hadoop,source之后通过hadoop version查看是否正常运行。
# source /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# hadoop version
source命令——重新执行刚修改的初始化文件。
- example
这里参照官方文档[4]的wordCount和PI例子。直接在/usr/local/hadoop/share/hadoop/mapreduce/可以看到例子的jar包。
wordCount是统计文本的单词数,我们的输入文件使用hadoop的配置目录下的xml文件。然后将结果存在当前目录下的output2目录下。
# mkdir input
# cp etc/hadoop/*.xml input
# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount input output2
当敲完这条命令时,Hadoop就会开始运行MapReduce计算。
执行命令 # cat output2/* ,可以看到下图所示的计算结果。
Pi程序是通过随机投掷点来估算出PI的近似值。这个程序不需要输入参数,只需要设置Map的总数和每个Map的样本数就可以计算出结果。执行完下面这条命令后,可以看到Hadoop开始分配计算任务。
# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar pi 1000 1000
因为将计算进行了切分,我们可以通过监控系统资源来查看计算任务的执行过程。从下图可以看出,MapReduce主要是占用CPU资源,峰值达到80%以上。而内存相对使用比较低。
结果计算出来的Pi值大致为3.141552。
- pesudo cluster
继续跟着官方教程搭建要给单机的伪集群环境。首先我们需要新建HDFS的文件系统目录。我们就直接在Hadoop目录下创建相应的目录。这三个配置文件的详解可见这篇文章。
# mkdir tmp
# mkdir hdfs
# mkdir hdfs/name
# mkdir hdfs/data
然后配置相应的文件。首先是etc/hadoop/目录下的core-site.xml。
core-site.xml文件中包含如读/写缓冲器用于Hadoop的实例的端口号的信息,分配给文件系统存储,用于存储所述数据存储器的限制和大小。
这里我们只设置了默认的文件系统和临时文件目录。在
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
然后是同目录下的hdfs-site.xml文件。
hdfs-site.xml 文件中包含如复制数据的值,NameNode路径的信息,本地文件系统的数据节点的路径。这意味着是存储Hadoop基础工具的地方。
同样地添加下列内容。这里我们设置复本数为1,nameNode和dataNode的目录则是我们开始创建的目录。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
</configuration>
最后设置MapReduce框架。我们修改etc/hadoop/mapred-site.xml文件。这里将开启9001的端口来监控任务的执行。
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
这样基本的三个配置文件就修改好了。我们最后还会配置yarn相关内容来监控任务的完成。
接下来的步骤就是更新配置信息,并格式化namenode。
# source /usr/local/hadoop/etc/hadoop/hadoop-env.sh
hadoop namenode -format
这样就可以了吗?我们试着运行一下,terminal会报出一句错误。
Error: Cannot find configuration directory: /etc/hadoop
这是因为系统无法找到/etc/hadoop路径,我们在hadoop-env.sh文件中添加一条环境变量信息。
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop/
并且记得source一下。
# source /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# sh sbin/start-all.sh
这里我们如图上一样,检查一下java进程。然后我们访问8088和50070端口。8088端口的结果还是有,作为这个Hadoop系统的总览。
但是50070端口无法访问,我需要关闭这个端口的防火墙。在iptables上添加一条规则。
iptables -A INPUT -p tcp --dport 50070 -j ACCEPT
这样50070就能正常访问了。
我们的最后一步是针对这个Hadoop集群创建HDFS目录和进行一个wordCount测试例程。
官方教程的命令有误,目录前需要添加/符号。然后我们把etc/hadoop/*.xml全部都存进HDFS。
# bin/hdfs dfs -mkdir /input
# bin/hdfs dfs -put etc/hadoop/*.xml /input/
# bin/hdfs dfs -ls /input
上述最后一条命令的结果可以查看HDFS的目录内文件。
最后以同样的命令执行wordCount,其结果也是一样的。
# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
- SETUP YARN
to be continue