搭建Hadoop环境( 我以hadoop 2.7.3 为例, 系统为 64bit Ubuntu14.04 ) hadoop 2.7.3 官网下载 , 选择自己要安装的版本。注意每个版本对应两个下载选项source和binary,我们暂时下载binary,我们下载编译好的文件hadoop-2.7.3.tar.gz , 解压后为 hadoop-2.7.3 , 这个可以直接安装部署. ( 如果下载源代码文件 hadoop-2.7.3-src.tar.gz , 需要先编译后才能进行安装部署. )
Hadoop有三种安装部署模式,分别是:第一,单机安装部署;第二,伪分布式安装部署;第三,全分布式安装部署. 我们还是以hadoop-2.7.3为例
第一以及第二在单个节点上部署集群,参见官网 Hadoop:设置单个节点集群。 参考 Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04
第三是要在多个节点上进行部署集群,参见官网 Hadoop集群安装
安装hadoop前的准备工作
(1) 安装jdk 参见我的博客 安装JDK+Eclipse+Maven(windows系统和linux系统)
(2) 安装openssl-server
集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server: ( 或者直接 sudo apt-get install openssh )
$ sudo apt-get install openssh-server
安装后,可以使用如下命令登陆本机:
$ ssh localhost
此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 ,这样就登陆到本机了。
(3) 免密码登陆
但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。
单台机器的无密码登录( 登录 localhost ): ( 单机安装部署以及伪分布式安装部署 )
首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:
$ exit # 退出刚才的 ssh localhost
$ cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
$ ssh-keygen -t rsa # 会有提示,都按回车就可以
$ cat ./id_rsa.pub >> ./authorized_keys # 加入授权
此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了
还有多台机器间的无密码登录: ( 全分布式安装部署 )
安装Hadoop2
接下来我们安装hadoop到/usr/local/目录下, ( 也可以是其他目录 )
$ cd /usr/local $ sudo cp ~/Desktop/hadoop-x.x.x.tar.gz . //别忽视最后的点,代表当前目录 $ sudo tar -zxvf hadoop-x.x.x.tar.gz $ sudo mv hadoop-x.x.x hadoop //简化名字而已,改不改都行
$ sudo chown -R hadoop ./hadoop // 修改文件权限
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
$ cd /usr/local/hadoop
$ ./bin/hadoop version
配置全局变量:
$ sudo vim /etc/profile // 设置全局变量, 不配置的话只能命令所在的文件夹下运行
添加如下代码:
export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib" export PATH=$HADOOP_HOME/bin:$PATH
如果出现链接错误请关闭防火墙:
service iptables save
service iptables stop
chkconfig iptables off
1 单机安装部署
Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。( 可以运行 bin 下的命令, 但不能用 sbin 下的start-all.sh ) , 比如可以用 bin/hadoop version 查看hadoop版本号.
也可以按如下配置Hadoop.
配置Hadoop
更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安装在/usr/lib/jvm下的), 还可以修改 mapred-env.sh 以及 yarn-env.sh 文件
#The java implementation to use. #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/usr/lib/jvm/java
core-site.xml文件配置
<configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration>
hdfs-site.xml文件配置
<--更改hadoop默认的副本个数,由于我们是单节点所以改为只有一个副本就好--> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
mapred-site.xml文件配置
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
yarn-site.xml文件配置
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
2 伪分布式安装部署
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
配置Hadoop
更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安装在/usr/lib/jvm下的), 还可以修改 mapred-env.sh 以及 yarn-env.sh 文件
#The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jvm/java
core-site.xml文件配置 ( 为hdfs的工作目录(可以不设)默认为hadoop的tmp目录下(重启后数据就会消失下次还得重新格式化) )
<configuration>
<property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> </configuration>
hdfs-site.xml文件配置
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
mapred-site.xml文件配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml文件配置
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置完成后,执行 NameNode 的格式化:( 只能进行一次格式化, 否则会出错 )
$ ./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。
接着开启所有的守护进程。
$ ./sbin/start-all.sh
若出现如下SSH提示,输入yes即可。
启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。该 WARN 提示可以忽略,并不会影响正常使用(该 WARN 可以通过编译 Hadoop 源码解决)。
启动完成后,可以通过命令 jps
来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode” , "ResourceManager" 和 "NodeManager"(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-all.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。 ( 类似下图的效果 )
3 全分布式安装部署
包括单台机器的虚拟机部署以及多个节点(即多台机器)的部署
3.1 单台机器的虚拟机安装部署
hadoop学习通过虚拟机安装hadoop完全分布式集群 , 虚拟机安装 Hadoop , VM虚拟机CentOS下hadoop集群安装过程 , 全分布式的Hadoop虚拟机安装 ,
3.2 多个节点(即多台机器)的安装部署
这个和虚拟机安装部署类似,只不过是虚拟机是一台机器虚拟出多台机器, 而多台机器的安装是实实在在的有多个机器.
3.1 和 3.2 如下所式: ( 3.1 比3.2 多出 安装Vmware WorkStation软件 以及 在虚拟机上安装linux操作系统 )
准备4个(虚拟)机器节点
配置好jdk以及ssh免密码登录之后. 一般HDFS的文件块默认是3个备份, 所有至少有3个节点. 而且用户名最好保持一致, 我的用户名设置为 hadoop ,我这里有4台机器,所以,在准备好这4个结点之后,需要分别将linux系统的主机名重命名,重命名主机名的方法:
$ vim /etc/hostname
通过修改hostname文件即可,这4个点结均要修改,以示区分:
以下是我对4个结点的ubuntu系统主机分别命名为:master, node1, node2, node3
安装过程主要有以下几个步骤:
(1) 配置hosts文件
(2) 建立hadoop运行帐号
(3) 配置ssh免密码连入
(4) 下载并解压hadoop安装包
(5) 配置namenode,修改site文件
(6) 配置hadoop-env.sh文件
(7) 配置masters和slaves文件
(8) 向各节点复制hadoop
(9) 格式化namenode
(10) 启动hadoop
(11) 用jps检验各后台进程是否成功启动
(12) 通过网站查看集群情况
下面我们对以上过程,各个击破吧!~~
(1) 配置hosts文件 ( /etc/hosts )
先简单说明下配置hosts文件的作用,它主要用于确定每个结点的IP地址,方便后续master结点能快速查到并访问各个结点。在上述4个(虚拟机)结点上均需要配置此文件。由于需要确定每个结点的IP地址,所以在配置hosts文件之前需要先查看当前虚机结点的IP地址是多少,可以通过ifconfig命令进行查看,( 假设所有主机都在192.168.1.X 网段内 )如实验中,master结点的IP地址为:192.168.1.100, node1结点的IP地址为:192.168.1.101, node2结点的IP地址为:192.168.1.102, node3结点的IP地址为:192.168.1.103.
如果IP地址不对,可以通过ifconfig命令更改结点的物理IP地址,示例如下:
hadoop@master:~$ sudo ifconfig eth0 192.168.1.100
通过上面命令可以将IP改为192.168.1.100。如果觉得这样做麻烦,可以固定IP. 将每个结点的IP地址设置完成后,就可以配置hosts文件了,hosts文件路径为 /etc/hosts,我的hosts文件配置如下,大家可以参考自己的IP地址以及相应的主机名完成配置, 每台机器都一样,这里以master主机为例:
127.0.0.1 localhost #127.0.0.1 master 192.168.1.100 master 192.168.1.101 node1 192.168.1.102 node2 192.168.1.103 node3
(2) 建立hadoop运行帐号
即为hadoop集群专门设置一个用户组及用户,这部分比较简单,参考示例如下:
$ sudo groupadd hadoop //设置hadoop用户组 $ sudo useradd –s /bin/bash –d /home/hadoop –m hadoop –g hadoop –G admin //添加一个hadoop用户,此用户属于hadoop用户组,且具有admin权限。 $ sudo passwd hadoop //设置用户hadoop登录密码 $ su hadoop //切换到hadoop用户中
上述4个虚机结点均需要进行以上步骤来完成hadoop运行帐号的建立。
(3) 配置ssh免密码连入
这一环节最为重要,而且也最为关键,因为本人在这一步骤裁了不少跟头,走了不少弯路,如果这一步走成功了,后面环节进行的也会比较顺利。 SSH主要通过RSA算法来产生公钥与私钥,在数据传输过程中对数据进行加密来保障数据的安全性和可靠性,公钥部分是公共部分,网络上任一结点均可以访问,私钥主要用于对数据进行加密,以防他人盗取数据。总而言之,这是一种非对称算法,想要破解还是非常有难度的。Hadoop集群的各个结点之间需要进行数据的访问,被访问的结点对于访问用户结点的可靠性必须进行验证, hadoop采用的是ssh的方法通过密钥验证及数据加解密的方式进行远程安全登录操作,当然,如果hadoop对每个结点的访问均需要进行验证,其效率将会大大降低,所以才需要配置SSH免密码的方法直接远程连入被访问结点,这样将大大提高访问效率。
OK,废话就不说了,下面看看如何配置SSH免密码登录吧!~~
参见 ssh 免密码登录 , ssh 免密码登录1 , ssh 免密码登录2 ,其中在第一个链接 ssh 免密码登录 中, 缺少 修改SSH配置文件 su root -->登陆root用户修改配置文件 vim /etc/ssh/sshd_config -->去掉下图中三行的注释
下面是我的配置:
(1) 生成公钥和私钥
在每台机器上
$ ssh-keygen // 等同于ssh-keygen -t rsa
运行上面的命令后,系统会出现一系列提示,可以一路回车,例如:
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/glowd/.ssh/id_rsa): Enter // 特别说明,要不要对私钥设置口令(passphrase),如果担心私钥的安全,可以设置一个。没有特殊需求直接Enter,为空
运行结束以后, 默认在 ~/.ssh目录生成两个文件:
id_rsa :私钥
id_rsa.pub :公钥
(2) 导入公钥到认证文件,更改权限
导入本机
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
导入本机后就可以无密码登录localhost
$ ssh localhost
导入要免密码登录的服务器, 我们以 master (192.168.1.100 ) 和 node1(192.168.1.101 ) 为例, 这之前已经设置/etc/hosts ,让主机名和IP对应, 这样主机名既是IP, 否则下面的主机名要用IP 代替.
要想 node1 免密码登录 master, 首先将 node1 的公钥复制到远端服务器 master,用户为hadoop . 把node1机下的id_rsa.pub复制到master机下,在master机的.ssh/authorized_keys文件里,我用scp复制。
$ scp ~/.ssh/id_rsa.pub hadoop@master:~
由于还没有免密码登录的,所以要输入密码。
在服务器上master上, master 机把从 node1 机复制的id_rsa.pub添加到.ssh/authorzied_keys文件里。
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub -->保险起见,删除传过来的公钥
在服务器master上更改权限(必须), authorized_keys的权限要是600。
$ chmod 755 ~ $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
以上执行之后,有些机器应该可以直接访问了,可以测试一下. node1 机登录 master 机。 ( 用户名相同的话, 可以直接用IP, 否则要用 ssh hadoop@master )
ssh 192.168.1.100 #ssh master
第一次登录是时要你输入yes。
现在 node1 机可以无密码登录 master 机了。
同理, 要想 master 也免密码登录 node1 , 只需要执行相同的操作,
要想 master 免密码登录 node1, 首先将 master 的公钥复制到远端服务器 node1,用户为hadoop . 把master机下的id_rsa.pub复制到node1 机下,在node1机的.ssh/authorized_keys文件里,我用scp复制。
$ scp ~/.ssh/id_rsa.pub hadoop@node1:~
由于还没有免密码登录的,所以要输入密码。
在服务器上node1上, node1 机把从 master 机复制的id_rsa.pub添加到.ssh/authorzied_keys文件里。
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub -->保险起见,删除传过来的公钥
在服务器node1上更改权限(必须), authorized_keys的权限要是600。
$ chmod 755 ~
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
以上执行之后,有些机器应该可以直接访问了,可以测试一下. master 机登录 node1 机。 ( 用户名相同的话, 可以直接用IP, 否则要用 ssh hadoop@node1 )
ssh 192.168.1.101 # ssh node1
第一次登录是时要你输入yes。
现在 master 机可以无密码登录 node1 机了。
这样, 这两台机器就可以相互免密码登录了.
(3) 常见问题及解决方案
生成密钥并上传至远程主机后,任然不可用.
这时打开服务器的 /etc/ssh/sshd_config 这个文件,取消注释。
重启服务器的ssh服务。
#RHEL/CentOS系统
$ service sshd restart
#ubuntu系统
$ service ssh restart
#debian系统
$ /etc/init.d/ssh restart
执行ssh-copy-id 命令
$ ssh-copy-id glowd@{remote ip}
#`如果不是默认端口22,是9001`
$ ssh-copy-id -p 9001 glowd@{remote ip}
.....
还有就是你的host key has just been changed,即主机码变了,比如node1的变了,那么node2链接node1就会出问题,这时候就需要把node2中的node1的码删除再重新添加。删除方法如下:
ssh-keygen -f "/home/hadoop/.ssh/known_hosts" -R node1
(4) 前面搞定了免密码登录,想想也是很激动了。但是,还要写ip,还要写用户名,是不是又有点不爽啦。搞定用户名和端口号
找到 ~/.ssh/config 文件,如果木有的话就自个儿建一个吧,内容如下:
Host {remote ip}
User {username}
Port {port}
现在连接就很简单了
$ ssh {remote ip}
(4) 下载并解压hadoop安装包
前面已经下好了
(5) 配置 namenode,修改site文件
先完成JDK配置, 在设置JDK 以及 Hadoop 的全局环境变量. 到目前为止,准备工作已经完成,下面开始修改hadoop的配置文件了,即各种site文件,文件存放在/hadoop/etc/hadoop下,主要配置core-site.xml、hdfs-site.xml、mapred-site.xml 以及 yarn-site.xml 这四个文件。
core-site.xml文件配置
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
hdfs-site.xml文件配置
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>Master:50070</value>
</property>
</configuration>
mapred-site.xml文件配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>
yarn-site.xml文件配置
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>Configuration to enable or disable log aggregation</description>
</property>
</configuration>
(6) 配置hadoop-env.sh文件
更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安装在/usr/lib/jvm下的), 还可以修改 mapred-env.sh 以及 yarn-env.sh 文件
#The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jvm/java
(7) 配置slaves文件 (在 /usr/local/hadoop/etc/hadoop 下)
slaves文件里默认有localhost , 修改成如下:
# localhost
master #可有可无, 有的话 master 既是主节点也作从节点,存储HDFS数据块. 没有的话,master只是主节点, 不进行数据块存储.
node1
node2
node3
(8) 向各节点复制hadoop ( 假设以上的hadoop 配置文件都是在 master 上配置)
这时向 node1, node2 以及 node3 节点复制hadoop: ( 以 node1 为例 )
$ sudo scp -r /usr/local/hadoop node1:~
然后进入 node1 , 把 hadoop 移动到 相应的位置, 在退出
$ ssh node1 $ sudo mv hadoop /usr/local/hadoop $ exit
然后 node2 以及 node3 同样.
这样,结点 node1 和结点 node2 以及 node3 也安装了配置好的hadoop软件了。
(9) 格式化namenode
一定要在主节点 master 上进行格式化, 而且只能进行一次, 否则会出错. 我们已经配置hadoop为全局变量.
$ hadoop namenode -format #如果没有设置全局变量,在 /usr/local/hadoop 目录下输入 ./bin/hadoop namenode -format
注意:成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。
(10) 启动hadoop
这一步也在主结点master上进行操作:
$ start-all.sh #如果没有设置全局变量,在 /usr/local/hadoop 目录下输入 ./sbin/start-all.sh
(11) 用jps检验各后台进程是否成功启动
在主结点master上查看namenode,resourcemanager,secondarynamenode进程是否启动。
$ jps
如果出现以上进程则表示正确。
在 node1 和 node2 以及 node3 结点了查看nodemanager和datanode进程是否启动。 ( 以node1 为例 )
$ jps
如果出现以上进程则表示正确。 node2 和 node3 也是 .
进程都启动成功了。恭喜~~~
(12) 通过网站查看集群情况
在浏览器中输入:http://192.168.1.100:50030,网址为master结点所对应的IP: ( http://master:50030 ,这两个等同)
在浏览器中输入:http://192.168.1.100:50070,网址为master结点所对应的IP:
在浏览器中输入:http://192.168.1.100:8088,网址为master结点所对应的IP:
至此,hadoop的完全分布式集群安装已经全部完成,