首先使用VMWare创建3台CentOS的虚拟机,创建的默认账号名是hadoop,密码是1111,并为各虚拟机配置IP地址及指定主机名。你可以使用如下命令创建hadoop账号和组群。
groupadd hadoop
useradd hadoop -d /home/hadoop/ -g hadoop
passwd hadoop
我们的配置计划
主机名 | 分配的IP地址 | 分配的工作 |
ISCASTest01 | 192.168.145.100 | Namenode, NTP server |
ISCASTest02 | 192.168.145.101 | DataNode, zookeeper |
ISCASTest03 | 192.168.145.102 | DataNode, zookeeper |
为了模拟使用SSH远程登录,因此需要给每个主机指定一个主机名,使用vim修改/etc/sysconfig/network这个文件,将如下内容:
NETWORKING=yes
HOSTNAME=localhost.localdomain
替换成
WORKING=yes
HOSTNAME=HostNewName.localdomain
往ISCASTest01,ISCASTest02,ISCASTest03的/etc/hosts文件里分别增加如下内容:
ISCASTest01$ echo '127.0.0.1 ISCASTest01.localdomain' >> /etc/hosts
ISCASTest02$ echo '127.0.0.1 ISCASTest02.localdomain' >> /etc/hosts
ISCASTest03$ echo '127.0.0.1 ISCASTest03.localdomain' >> /etc/hosts
依次修改每个节点的/etc/sysconfig/network. 然后使用service network restart命令使配置生效。修改好主机名之后,接着往/etc/hosts中添加如下内容,将各节点的IP地址与主机名关联起来。使用vim修改/etc/hosts,依次向ISCASTest01,ISCASTest02,及ISCASTest03节点中添加如下内容:
192.168.145.100 ISCASTest01
192.168.145.101 ISCASTest02
192.168.145.102 ISCASTest03
此外,节点ISCASTest01需要SSH免密码登录ISCASTest02,ISCASTest03。因此需要为ISCASTest01生成RSA_PUB键。
登录ISCASTest01,使用如下命令生成SSH PUB Key,一路Enter,不要设置任何密码或修改文件生成路径:
ssh-keygen -t rsa
将生成的SSH PUB Key发送至ISCASTest02,及ISCASTest03两个节点,以及本节点
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@ISCASTest01
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@ISCASTest02
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@ISCASTest03
测试免登录
ssh hadoop@ISCASTest01
ssh hadoop@ISCASTest02
ssh hadoop@ISCASTest03
首先,将NTP压缩包解压:
tar -zxvf ntp-4.2.6p5.tar.gz
cd进入压缩包所在目录
./configure --prefix=/usr/local/ntp --enable-all-clocks --enable-parse-clocks
make; make install
修改/etc/ntp.conf。将 restrict default kod nomodify notrap nopeer noquery 修改为:
restrict default nomodify
并增加:
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
server 192.168.145.100
假设我们所要配置的服务器不与外网连接,因此为了方便我们可以关闭所有节点的防火墙:
service iptables stop
返回ISCASTest01,使用如下命令启动NTP服务:
service ntpd start
测试监听:
在ISCASTest01,使用命令:watch ntpq -p
在ISCASTest02,使用命令:ntpdate ISCASTest01
如果提示没有获得权限,使用su命令切换为root用户,再次执行这个命令
为客户机设置自动同步命令,使用命令:
crontab -e
添加如下内容:
0,30 * * * * /usr/sbin/ntpdate ISCASTest01; /usr/sbin/hwclock -w
表示 每小时0分和30分同步一次时间
查看定时任务
crontab -l
如果不想禁用防火墙,那么可以打开123端口,使NTP能正常使用。使用vim编辑
vim /etc/sysconfig/iptables
并增加:
-I OUTPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
-I INPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
由于Hadoop是由Java编写的因此需要在系统中安装JAVA JDK以及配置JAVA Home和Java classpath
将JAVA JDK安装包上传至各节点后,使用如下命令进行安装,假设使用的安装包是RPM格式
rpm -i ./jdk-8u5-linux-x64.rpm
待安装完毕后,使用vim /home/hadoop/.bashrc增加如下内容
JAVA_HOME=/usr/java/jdk1.8.0_05/
JAVA_BIN=$JAVA_HOME/bin/
JRE_HOME=$JAVA_HOME/jre/
JRE_BIN=$JRE_HOME/bin/
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_BIN:$JRE_BIN
之后使用source /home/hadoop/.bashrc使配置生效。
测试
java -version # 显示JAVA版本
jps # 显示正在运行的JAVA进程
如果有正确输出,则证明配置完毕。
配置$HADOOP_HOME/conf/hadoop-env.sh文件,需要为hadoop配置JAVA环境,增加或修改JAVA_HOME这一项
export JAVA_HOME=/usr/java/jdk1.8.0_05/
测试配置是否正确,运行Hadoop目录下/bin/hadoop,使用如下命令进行测试
./bin/hadoop version
若配置正确,则有结果输出,否则将报错。
为了方便,我们在$HADOOP_HOME/目录下创建distributed, standard, pseudo三个文件夹,并将 $HADOOP_HOME/conf 目录下的文件拷贝至这三个文件夹中,并使用 rm -rf 命令删除掉conf 文件夹。
我们将要配置的是分布式集群模式,所以使用 ln -s 将配置信息链接至 distributed 文件夹。
ln -s distributed conf
分别修改 conf/core-site.xml, conf/mapred-site.xml, conf/hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://ISCASTest01:8020</value>
<description>The name of the default file system, using 8020 port.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoopdata/tmp</value>
<description>A base for other temporary directories.</description>
</property>
</configuration>
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hadoopdata/mainname,/home/hadoop/hadoopdata/backname</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hadoopdata/maindata,/home/hadoop/hadoopdata/backdata</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</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.
Set to 1 for pseudo-distributed mode.
Set to 3 for distributed mode.
</description>
</property>
</configuration>
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://ISCASTest01:8021</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/hadoop-1.2.1/var</value>
</property>
</configuration>
配置 conf/masters 及 conf/slaves
ISCASTest01
ISCASTest02
ISCASTest03
将配置好的 hadoop 发送至各个节点
scp -r hadoop ISCASTest01:/home/hadoop/
在 namenode 上启动格式化
bin/hadoop namenode -format
在 namenode 上启动 hadoop 集群
bin/start-all.sh
测试.如果正常启动了hadoop集群后,应该分别在 ISCASTest01, ISCASTest02, ISCASTest03运行jps,应该分别看见如下输出:
40629 JobTracker
40549 SecondaryNameNode
40807 Jps
40395 NameNode
25316 TaskTracker
25447 Jps
25229 DataNode
24116 DataNode
24204 TaskTracker
24334 Jps
监听。 hadoop 提供了 Web 端的监听窗口,可以通过
• http://localhost:50030 监听集群的状态
• http://localhost:50070 监听HDFS系统的状态
外部访问,需要通过Namenode,也就是这里的ISCASTest01的IP地址进行访问。之后,需要在 ISCASTest02, 及 ISCASTest03 中配置 zookeeper。
配置 ZooKeeper。使用 SSH 登录 ISCASTest02,下载并解压 zookeeper-3.4.6.tar.gz 安装包,修改 $ZOOKEEPER_HOME/conf/zoo_sample.cfg
mv conf/zoo_sample.cfg conf/zoo.cfg
修改配置文件
vim ./conf/zoo.cfg
将 dataDir=/tmp/zookeeper 修改为
dataDir=/home/hadoop/zookeeper-3.4.6/data
增加
logDir=/home/hadoop/zookeeper-3.4.6/log
以及
server.1=ISCASTest02:2888:3888
server.2=ISCASTest03:2888:3888
返回 $ZOOKEEPER_HOME/ 并创建 data, log 这两个目录,并在 data 目录下创建 myid 文件。
ISCASTest02$ echo 1 > ./data/myid
将配置好的 zookeeper 发送至其他节点(ISCASTest03)
scp -r /home/hadoop/zookeeper-3.4.6/ ISCASTest03:/home/hadoop/
登录其他节点,修改zookeeper-3.4.6/data/myid 的值
ISCASTest03$ echo 2 > ./data/myid
分别在各节点上,启动zookeeper,使用如下命令
./bin/zkServer.sh start
检测当前节点的状态,可以使用 jps 命令查看当前的进程
26056 QuorumPeerMain
或者使用 zkServer.sh status 查看当前节点的状态。到这一步,hadoop集群已经基本配置完毕了。访问ISCASTest02或ISCASTest03节点,将工作目录切换至/home/hadoop/zookeeper-3.4.6/bin/目录下,使用命令:
./zkCli.sh
会发现标识变成了类似这样:
[zk: localhost:2181(CONNECTED) 0]
使用 ls / 命令可以查看当前的HDFS系统上有什么文件。
最后一步,测试 word count 程序。
在 ISCASTest01 节点上创建一个文件 words.txt
Mary had a little lamb
its fleece very white as snow
and everywhere that Mary went
the lamb was sure to go
将该文件上传至HDFS中,并保存为文件words
./bin/hadoop fs -put words.txt /words
使用hadoop命令查看HDFS中的文件
./bin/hadoop fs -ls /
使用 map reduce 示例统计文件中出现的单词数量
./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount /words /out
jar: 表示使用jar包
wordcount: hadoop-examples-1.2.1.jar 中的一个示例程序
/words: 输入words文件
/out: 将结果保存到out文件夹中
等待计算完毕后,可以使用 hadoop fs -ls / 查看是否生成了out文件夹。查看HDFS下out文件目录中包含的文件
./bin/hadoop fs -ls /out
查看统计结果: /out/part-r-00000
./bin/hadoop fs -cat /out/part-r-00000
最终我们获得结果如下
a 1
as 1
and 1
everywhere 1
fleece 1
go 1
had 1
its 1
lamb 2
little 1
Marry 2
snow 1
sure 1
that 1
the 1
to 1
was 2
went 1
white 1