首先介绍下hadoop的部署方式:
本地模式:只启动一个map,一个reduce
伪分布式模式:一台机器模拟分布式环境
集群模式:真正的生产环境
本文将介绍伪分布式环境的搭建
伪分布式模式安装步骤:
1、关闭防火墙
2、修改ip地址
3、修改hostname
4、设置ssh自动登录
5、安装jdk
6、安装hadoop
首先关闭防火墙,我安装的linux系统是ubuntu,注意linux系统不同,命令也将不同。
我先看看防火墙是否已经安装,
sudo ufw version防火墙版本:
ufw 0.29-4ubuntu1 Copyright 2008-2009 Canonical Ltd.ubuntu 系统默认已安装ufw。如果没有安装则先安装,
1.安装
sudo apt-get install ufw
查看防火墙的状态用命令:sudo ufw status
我的返回的是:inactive,说明防火墙就是关闭的
开启/关闭防火墙 命令(默认设置是’disable’)
sudo ufw enable|disable
下面修改ip
这里用hostonly方式(仅主机模式),为了是在不联网的情况下,windows和linux能够通信。
1、选中虚拟机图标,右击,打开文件位置,找到vmnetcfg,打开,用来配置网络
打开后,点击hostonly,在name那一列发现时vmnet1网卡,如果想用此hostonly模式,得在windows下面的网络与共享中心中的更改设备器设置中将VMnet1启动,再回到刚出现的虚拟机网络设置那个界面,发现网段是47网段,从最后面的Subnet Address一列192.168.47.0可以看出来.现在我不喜欢47网段,我喜欢8网段,将47改成8既可以,在下面改,后面的子网掩码就别管了,此时发现Subnet Address那一列已经改变。
下面在windows下面设置wmnet1的属性,ipv4 发现ip变成了192.168.8.1,如果不喜欢,可以改成192.168.8.100等,此时100就是windows的ip,是虚拟机与windows通信走的ip。
下面修改linux的ip,这边介绍图形界面的方式,这个设置方式多,图形界面也很可能不一样
1、找到ubuntu右上角的图标,右击选中System Setting打开
2、选择NetWork,打开
3、选择Wired,右边选择Options..
4、选择IPv4 Settiongs ,默认是DHCP即动态获取ip,这种情况下,如果机器重启,ip地址会变
选择Manual,即手动配置。在Addresses中选择Add,然后添加配置,如
ip:192.168.8.88,这是linux的ip,注意与windows在一个网段并且不能一样
Netmask:子网掩码255.255.255.0
Gateway网关,192.168.8.1 然后save
下面修改主机名:命令vi /etc/hostname
下面设置主机名与ip的映射关系
vim /etc/hosts
然后添加192.168.8.88 我刚才设置的主机名hostname 如果有多个 一行一个
重启linux ,然后检查是否主机名,ip地址都已经修改,防火墙是否关闭,然后在windows下面ping 192.168.8.88
看看主机是否能够ping通linux,发现没有ping通,首先检查虚拟机设置是否是用了hostonly模式,虚拟机打开,在master右击,Setting里面,选择Network Adapter,右边选择hostonly模式。然后ok.
稍等一下,现在在从外网ping,发现ping成功了
现在其实是从外网ping通的,因为我的电脑虚拟机和主机都是联网的,只要把本地连接禁用,然后在ping就是测试在hostonly模式是否成功。
下面安装jdk,hadoop要求jdk1.6之上,不要用1.8,这里我下载了1.7版本
这里做统一管理,放在指定地方,首先在usr下面创建文件夹:mkdir /usr/java
然后将刚才解压后的jdk移动进去,命令mv jdk1.7.0_79 /usr/java
看看是否移动进去,命令cd /usr/java
ls
发现移动成功
在cd到jdk里面,再ls发现文件夹下面是一些如bin等文件夹。
下面添加环境变量,先pwd,将目录复制
打开配置文件,添加环境变量,vim /etc/profile
在最后添加
export JAVA_HOME=/usr/java/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin
在使刚才的环境变量生效
source /etc/profile 即可
现在java -version 将显示版本
我在安装时还碰到一个问题是我系统安装时自动安装了openjdk,并且上面的过程显示了系统以前安装的jdk,我卸载步骤如下:
上面环境变量已经配置好,保留,先关闭终端,重新打开
update-alternatives --config java
显示:
选择 路径 优先级 状态
------------------------------------------------------------
* 0 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 自动模式
1 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 手动模式
2 /usr/java/jdk1.7.0_79/jre/bin/java 63 手动模式
键入选择的编号:2
回车
4.验证下java -version发现已经改为我刚安装的
配置hadooP,我下载的版本是hadoop2.6.0,你最好下载稳定版本,我这还不是稳定版本
下载,解压
修改5个配置文件
我解压后的文件夹直接放在home目录下了,大概文件结构为:/home/master/itcast/hadoop-2.6.0
首先到:/home/master/itcast/hadoop-2.6.0/etc/hadoop目录
先修改hadoop的环境变量 vim hadoop-env.sh
找到设置java_home的地方,就是在#the java implementation to use下面一行
改为:export JAVA_HOME=/usr/java/jdk1.7.0_79
保存 退出
下面修改core-site.xml,这是一个配置文件,命令是
vim core-site.xml
打开后找到<configuration>标签,在这个标签之间添加标签如下:
<property>//第一个属性用来指定hdfs的老大namenode的地址
<name>fs.defaultFS</name>
<value>hdfs://192.168.8.88:9000</value>//主机名加上端口
</property>
<property>//第二个属性用来指定hadoop运行时产生文件的存放目录(linux下面具体的目录)
<name>hadoop.tmp.dir</name>
<value>/home/master/itcast/hadoop-2.6.0/tmp</value>
</property>
下面修改第三个配置文件hdfs-site.xml
打开vim hdfs-site.xml
根上面一样,
<property>//指定hdfs保存数据副本的数量
<name>dfs.replication</name>
<value>1</value>//在伪分布式环境下保存一份,默认在集群环境剩下是1份
</property>
第四个配置文件是mapred-site.xml
首先ls下面发现没有mapred-site.xml,只有以template结尾的文件
这时候,得重命名
命令:mv mapred-site.xml.template mapred-site.xml
这时再ls发现重命名成功
这时打开配置文件:vim mapred-site.xml
跟上面一样,添加
<property>//告诉hadoop以后Mapreduce运行在yarn上
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
修改第五个配置文件yarn-site.xml
跟上面一样
<property>//获取数据的方式是shuffle的方式
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>//指定yarn的老大ResourceManager的地址
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
下面将hadoop添加到环境变量,并且格式化hadoop
vim /etc/profile
export HADOOP_HOME=/home/master/itcast/hadoop-2.6.0
修改PATH 后面添加:HADOOP_HOME/bin
然后生效配置文件source /etc/profile
下面初始化HDFS(格式化文件系统)
用命令hadoop namenode -format(过时了)
我们用新的命令,先找命令在哪里,用命令which hadoop
我们将看到hadoop所在的目录
用which hdfs
看到hdfs的路径,在bin目录下
下面打开到bin目录下面,我们看到有很多脚本,如hadoop、yarn、hdfs等
下面进行格式化
打开到上一层目录,就是bin前的那一层目录
用命令hdfs 看跟什么参数
看到有个namenode -format 就是格式化这个分布式文件系统
故用命令hdfs namenode -format
看到接近最后有一句话successfully formatted 就是已经配成功格式化了
这时候在hadoop-2.6.0文件夹下面ls,发现了生成了tmp文件夹,这时hadoop运行时保存重要文件的目录
下面启动hadoop ,hadoop有两个核心一个是hdfs一个是yarn,我们先cd 到sbin下面
发现sbin 下面很多start,stop 如start-all就是把所有的都启动起来,启动所有其实就是启动hdfs和yarn,也可以单独启动
整体启动命令 ./start-all.sh
期间可能遇到的问题可能有:1、
启动./start-all.sh有个小问题就是要不断的输入密码,下面ssh免密码登录
下面先验证配置是否正确:
(HDFS管理界面)
(MR管理界面)下面验证hdfs,如上传文件
首先cd ~ 到主目录home下面,我这个下面有个hadoop-2.6.0.tar.gz包
敲命令hadoop ,但是居然提示找不到hadoop命令,于是我就把hadoop的sbin目录加入到path中,依然在配置文件/etc/profile,这时再执行source命令,生效后即能识别hadoop命令
再敲hadoop命令出现一些命令,下面我们选用这个fs,再敲hadoop fs这个时候看到copyFromLocal和put都是将本地文件上传上去。
我们把hdfs看成是一个文盘,网盘也是一个文件系统。你要上传的文件在本地linux文件系统上,我要上传到hdfs文件系统
敲命令hadoop fs -put hadoop-2.6.0.tar.gz hdfs://192.168.8.88:9000/hadoop,这时候在 (HDFS管理界面)的browser the file system中将看到,已经成功上传
下面通过命令下载,依然hadoop fs发现get 就是从hdfs文件系统拿到本地文件系统
hadoop fs -get hdfs://192.168.8.88:9000/hadoop /home/hhh 这样就下载到/home/hhh这个目录下了
测试mapreduce 和yarn
首先打开到目录/home/master/itcast/hadoop-2.6.0/share/hadoop,然后可以看到mapreduce
cd mapreduce 在ls之后,你会看到很多包,其中examples等就是例子
vim words创建文件,添加内容
hello tom
hello jerryhello kittyhello wordhello tom这时wc words将统计出来行数字数等等
more words 将显示出刚才的内容
统计刚才完成的内容
由上面的内容知道,hello 出现了5次,tom出现了2次,jerry出现了1次,kitty出现了1次,word次出现了1次
先which hadoop ,看hadoop的目录
运行包,hadoop jar hadoop-mapreduce-examples-2.6.0.jar 回车之后你将看到有很多的例子,如排序。。。。
我现在想要wordcount 这时hadoop的入门基础级别程序,wordcount后跟两个参数,一个是输入,一个是输出,这些目录是计算海量数据,这些海量数据存放于什么地方,数据的输入时hdfs,数据的输出也是hdfs,因为这些文件可能非常非常的大,所以应该先上传
hadoop fs -put words hdfs://itcast01:9000/words
查看是否已经上传成功hadoop fs -ls hdfs://itcast01:9000/发现已经有words目录,上传成功
现在命令hadoop jar hadoop-mapreduce-examples-2.6.0.jar wordcount hdfs://itcast01:9000/words hdfs://itcast01:9000/wcout
现在查看是否完成 先看看是否存在hadoop fs -ls / (注意写法)可以看到这里面出现了wcout
再看看浏览器中点开结果文件发现已经计算好了
hello 5
jerry 1
kitty 1
tom 2
word 1
如果在这过程中有错误,在日志文件中以log结尾的文件,如果以yarn开始的文件就看以yarn开始的文件,如果是root用户则看以yarn-root开始的文件
上面已经完全配置好了hadoop伪分布式集群,现在美中不足的就是开始或者结束过程中药输入很多次密码,也就是
./start-all.sh 和./stop-all.sh 都要输入密码,
假如通过ssh 登录到itcast01上面,ssh itcast01,回车之后发现也要密码
也就是自己登录自己也要密码,ssh的机制就是要用密码
这时得再在虚拟机上装一个ubuntu,跟原先的在一个网段上面,设置hostonly,并且ip 192.168.8.99
这时两台互相ping能ping通,这时再8.88上面,向8.99发送一个命令 ssh 192.168.8.99 mkdir /itcast0106
这个时候得输入yes,和99的密码然后99上将创建一个目录
一台向另一台发送命令,如果走的是ssh指令,必须输入密码,这时协议规定的,如果以后有很多机器,要输入密码非常麻烦
下面配置ssh免登陆,ls -la,将当前目录下所有文件以详细形式都显示出来
可以看到有个.ssh文件夹,进入文件夹 cd .ssh
ls 后发现只有一个文件 known_hosts,这里面存放的是我知道的主机名
生成一对密钥,一个公钥一个私钥 用linux给出的命令 ssh-keygen -t rsa //-t是指定加密的类型 rsa加密算法,即使计算机破解也将破解很多年
四次回车之后生成了类似于二维码的东西
这是新生成了两个文件,我的在、root/.ssh目录下面,所以转到此目录cd /root/.ssh
more id_rsa.pub 发现一堆字符串,是公钥,有字母有数字,下面看一看私钥more id_rsa,特别多的字符串
现在免登陆自己,要把公钥拷给自己cp id_rsa.pub authorized_keys //把公钥拷贝到已经认证里面,这个地方是一定的
回车后再ls 发现又多了一个文件,以前ssh itcast01 需要输密码,现在已经不要输入密码
现在./start-all.sh就不需要输入密码了,哈哈,爽
下面介绍一个命令 ssh-copy-id itcast01将我当前的公钥发送给itcast01
现在我想用8.88免登陆到8.99,只要把8.88的公钥发送给8.99就能免登陆
在8.88 下面输入命令ssh-copy-id 192.168.8.99//把我当前机器的公钥拷贝到8.99上面,回车后先输入99的密码,这时候99下面.ssh下面有一个文件是authorized_keys,里面是8.88的公钥,用more authorized_keys可以查看
现在就可以8.88上面免登陆8.99,在8.88上面输入ssh 192.168.8.99
这样就进入了8.99,还不用输密码。