Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。(百科)
下载Hadoop
本次使用的是2.8.1版本的Hadoop,官网地址
http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.1/hadoop-2.8.1.tar.gz
点击(不用进官网直接点这个链接就能下载)
http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.8.1/hadoop-2.8.1.tar.gz
安装3个虚拟机并实现ssh免密码登录
修改host
使用的Linux系统是CentOS 7 ,修改三台机器的Hosts,让它们能相互映射到,能ping t通
参考我的上一篇文章
http://blog.wuwii.com/linux-hostname.html
添加Hosts,这是我的三台机器
1 | 192.168.19.185 server1 |
ping 结果都能ping 通
1 | [root@server2 ~]# ping -c 4 server1 |
生成密钥
密钥三台机器都需要生成,就以一台 server1 机器为例
使用命令 ssh-keygen -t rsa
一路 enter
1 | [root@server1 ~]# ssh-keygen -t rsa |
出现上面的 ,可以在本帐户的根目录看到一个 .ssh 文件夹
1 | [root@server1 ~]# ll -a |
注意它是个隐藏的文件,我是用的是secureFx 显示隐藏文件,需要 视图 -> 文件 勾选上就行
1 | [root@server1 .ssh]# ll |
打开 /root/.ssh/id_rsa.pub
1 | [root@server1 .ssh]# cat id_rsa.pub |
查看到了我们生成的密钥成功了
然后我们把三个机器都生成密钥,然后把他们合并成一个文件创建一个/root/.ssh/authorized_keys
文件保存着。
使用命令
1 | [root@server1 ~]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys |
其他机器的公共密钥也复制到到这个文件里来(补充,不要连着复制,上一行后面打个空格,再换行。)
所以最后是这样的
1 |
|
每个电脑都需要这个/root/.ssh/authorized_keys
文件,所以直接把它复制到对应位置就行了。
注意
我们需要给它们相应的权限,一般默认的就是这个权限,下面是root 用户的。chmod 700 ~/.ssh
#注意:这两条权限设置特别重要,决定成败。chmod 600 ~/.ssh/authorized_keys
测试使用ssh 密钥无密码登陆
首先测试下localhost ,看能否无密码登陆自己
1 | [root@server1 ~]# ssh localhost |
演示下server2 电脑上进行登陆 server1 并进行操作,
1 | [root@server2 ~]# ssh server1 |
之前配置 authorized_keys
搞了半天,虽然用了三行,但是后面没空格,导致 密钥不能使用,每次登陆还需要密码。
1 | [root@server1 ~]# ssh server2 |
没百度出来,自己最后卡了一个小时 恍然大悟,每行后面空出空格就好了。
在其余的电脑相互登陆试试,都能无密登陆,说明,配置成功。
但是一定要注意的是,每次ssh登陆完成后,都要执行 exit
,否则你的后续命令是在另外一台机器上执行的。
安装JDK 和Hadoop
安装jdk
三台机器都需要安装jdk,CentOS7 安装JDK参考 http://blog.wuwii.com/linux-jdk.html
安装hadoop
首先 三台机器都需要安装hadoop,都需要执行下面所有的操作。
上载文件,并且解压
1 | [root@server1 opt]# tar -xvf hadoop-2.8.1.tar.gz |
解压缩后得到hadoop-2.8.1
文件夹。
新建目录
在/root 目录下新建
1 | mkdir /root/hadoop |
修改配置文件
配置文件都在 解压后的文件夹 hadoop-2.8.1/etc/hadoop
下。
修改core-site.xml
在configuration>节点内加入配置:
1 | <property> |
修改 hadoop-env.sh文件
修改./hadoop-2.8.1/etc/hadoop/hadoop-env.sh
文件
将export JAVA_HOME=${JAVA_HOME}
修改为:export JAVA_HOME=/usr/java/jdk1.8.0_144
说明:修改为自己的JDK路径和版本号
修改hdfs-site.xml
修改./hadoop-2.8.1/etc/hadoop/hdfs-site.xml
文件,
在
1 | <property> |
说明:dfs.permissions配置为false后,可以允许不要检查权限就生成dfs上的文件,方便倒是方便了,但是你需要防止误删除,请将它设置为true,或者直接将该property节点删除,因为默认就是true。
新建并且修改mapred-site.xml
在该版本中,有一个名为mapred-site.xml.template的文件,复制该文件,然后改名为mapred-site.xml,命令是:
1 | [root@server1 hadoop]# cp mapred-site.xml.template mapred-site.xml |
修改这个新建的mapred-site.xml文件,在1
2
3
4
5
6
7
8
9
10
11
12
13 <property>
<name>mapred.job.tracker</name>
<value>server1:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/root/hadoop/var</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
修改slaves文件
修改./hadoop-2.8.1/etc/hadoop/slaves
文件,将里面的localhost删除,添加如下内容:
1 | server2 |
修改yarn-site.xml文件
修改./hadoop-2.8.1/etc/hadoop/yarn-site.xml
文件,
在
1 | <property> |
说明:yarn.nodemanager.vmem-check-enabled
这个的意思是忽略虚拟内存的检查,如果你是安装在虚拟机上,这个配置很有用,配上去之后后续操作不容易出问题。如果是实体机上,并且内存够多,可以将这个配置去掉。
启动Hadoop
在namenode上执行初始化
因为server1是namenode,server2和server3都是datanode,所以只需要对server1进行初始化操作,也就是对hdfs进行格式化。
进入到server1这台机器的/opt/hadoop-2.8.1/bin目录,执行初始化命令:./hadoop namenode -format
,格式化一个新的分布式文件系统。
如下
1 | [root@server1 bin]# cd /opt/hadoop-2.8.1/bin/ |
执行完成,不报错,说明启动成功。
格式化成功后,可以在看到在/root/hadoop/dfs/name/
目录多了一个current目录,而且该目录内有一系列文件。
在namenode上执行启动命令
因为server1是namenode,server2和server3都是datanode,所以只需要再server1上执行启动命令即可。
进入到hserver1这台机器的/opt/hadoop-2.8.1/sbin
目录,也就是执行命令:cd /opt/hadoop/hadoop-2.8.0/sbin
执行初始化脚本,也就是执行命令:./start-all.sh
第一次执行上面的启动命令,会需要我们进行交互操作,在问答界面上输入yes回车
1 | [root@server1 hadoop-2.8.1]# sbin/start-all.sh |
没报错,说明执行成功,之前我的server3 上的一个xml 配置错了,很明了的说出了错误的位置。
测试hadoop
启动后,需要测试能使用,才能说明配置正确
首先需要关闭防火墙。
1 | [root@server1 ~]# systemctl stop firewalld.service |
我们的namanode机器是server1,IP是192.168.19.185,直接在谷歌浏览器上输入到端口 50070,自动跳转到了overview页面 (dfshealth.html)
继续;
测试 8088 端口 :
自动跳转到了cluster页面
在namenode机器上执行jps
1 | [root@server1 hadoop-2.8.1]# jps |
在datanode机器上执行jps
1 | [root@server3 hadoop-2.8.1]# jps |
这只能证明它们启动成功,还要看它们之间互相通信。
出现datanode 机器,通信成功。
配置完成。
参考博客: http://blog.csdn.net/pucao_cug/article/details/71698903