在安装hadoop-3.0.1的时候碰到了各种坑,在这里我给你们踩平了,珍惜作为小白的日子,让小白不再迷茫!废话不多说,开始安装!
一. 硬件
三台电脑,装了Centos 7.0系统,一个作主节点(主机名是:master),两个作从节点分别是slave1和slave2。
二 . 安装
1 JDK安装和配置(这步操作在主机master,从机slave1,slave2上都要操作)
安装jdk前要卸载系统内置的jdk:
rpm -qa | grep java #查找包含Java的文件
rpm -e --nodeps 前面查出来的包名 #卸载对应安装,卸载掉headless的文件就行
我这里安装的是jdk1.8版本的,一般hadoop版本>=2.7,那么要求安装jdk1.7及以上版本的才行(说明一下jdk1.7,jdk7,java7其实是一个意思)
-
将下载好的jdk解压:tar -xzvf jdk-8u162-linux-x64.tar.gz
-
移动:mv jdk1.8.0_162 /usr/local/jdk`
-
切换到root用户
可以通过~/.bash_profile和/etc/profile两个配置文件进行配置,为了方便操作我们通过编辑/etc/profile来实现环境变量的配置,那么可以参考如下配置(在文件的末行添加就行):
export JAVA_HOME=/usr/local/jdk1.7.0_71
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
-
然后使配置的环境变量生效:
source /etc/profile
或者source ~/.bash_profile -
使用命令查看是否配置成功(注意都需要在root目录底下使用,普通用户底下使用的话还是显示OpenJDK version 1.8…bla bla bla):
java -version
2 关闭防火墙(这步操作在主机master,从机slave1,slave2上都要操作)
- 使用命令:systemctl stop firewalld #临时关闭防火墙
- 使用命令: systemctl disable firewalld #关闭防火墙开机自启动
- 使用命令: firewall-cmd --state #查看防火前状态
- 或者使用: systemctl status firewalld #查看防火前状态(如果没有关闭防火墙的话会导致ssh免密操作失败)
Active显示为inactive(dead)即可
3 修改主机名,只是说把主机名改为master,slave1,slave2更容易理解,也方便以后的维护(这步操作在主机master,从机slave1,slave2上都要操作)。
-
vi /etc/hostname 将里面的值改成你的要设置的主机名
-
同时修改/etc/hosts和/etc/sysconfig/network配置信息(这一步可以不用):
如果配置有多个ip和主机名,除了本身的master,其他的两个字节点的ip和主机名也要添加进来。如下图
注意下面的HOSTNAME改成自己对应的主机名
-
最后使用命令看看自己修改之后的主机名:hostname
可以使用下面命令永久修改主机名:
hostnamectl set-hostname 主机名;
4 接下来就是比较关键的一步了,大家认真仔细看了!这一步我们要配置SSH无密码登陆(也就是免密登陆),这一步是因为我们要配置多个子节点(slave1,slave2),就是说需要master主节点(namenode)通过SSH来启动和停止各个节点上的各种守护进程,所以在节点之间执行指令的时候不能有密码,我们需要配置免密码的操作!
-
使用root用户操作:ssh -keygen -t rsa #这里一路按回车
(执行完这条后会自动在/home/用户名/.ssh处生成id_rsa和id_rsa.pub)
-
然后在两台子节点上(slave1,slave2上分别如下操作),注意子节点也是要使用root用户进行操作:
ssh-keygen -t rsa (注意ssh和Keygen之间没有空格)
另外一台slave2操作跟slave1一样! -
这里是将从机上的id_rsa.pub远程传给master主机,传给他的slave1.pub和slave2.pub上(slave1.pub和slave2.pub在执行上面命令时会自动在主机的./.ssh底下生成,这里只是为了方便将两个从机的密钥添加到主机的authorized_keys上而建的pub)
scp root@slave1:~/.ssh/id_rsa.pub slave1.pub
scp root@slave2:~/.ssh/id_rsa.pub slave2.pub
这里的"root@slave1:/.ssh"解释:root表示当前的登陆的用户,@可以理解为是一个分隔符号,slave1是主机名,表示你当前所在的目录
-
将两个子节点(slave1,slave2)的复制过来的pub(其实就是id_rsa.pub)追加到authorized_keys中(这里的*.pub直接就把主机的id_rsa.pub,两个从机的slave1.pub slave2.pub里面的密钥都追加在一起了):
cat *.pub >> authorized_keys
然后给authorized_keys目录赋权限:
chmod 600 authorized_keys
-
将主机的authorized_keys复制到从机上(在主机上操作,所有的节点都操作这一步):
scp authorized_keys root@slave1:~/.ssh/
scp authorized_keys root@slave2:~/.ssh/
-
然后在每个从机上(slave1和slave2)给authorized_keys赋权限:
chmod 600 authorized_keys
到这里已经配置好免密操作了! -
最后判断是否成功设置好免密了,使用ssh slave1和ssh slave2命令,如果不需要输入密码了就表示免密已经设置成功!恭喜恭喜
5 这一步是最重要的配置步骤,大家打起十分的精神,之前要是配置累了先休息会儿~~我们开始配置本节的核心,配置hadoop,在hadoop-3.0.1中,我们需要配置6个文件,分别是:hadoop-env.sh, core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml,workers(注意workers也是一个配置文件,我刚开始配置的时候一直不知道这是什么,找了好久才发现就和上述几个配置文件在同一个文件夹下,==!,它和之前版本的hadoop不一样,这里的workers就是之前版本安装目录下的slaves),上面的配置文件都在hadoop安装目录底下的etc/hadoop/文件夹下。
安装前咱们先提前建好几个文件夹:
这里提前建好chadoop,chadoop底下的dfs目录,dfs底下的data和name目录,chadoop底下的tmp目录,chadoop底下的hadoop目录(这些目录都可以自己定义,不用跟我的一样,主节点master和两个子节点slave1,slave2都要建,目录三台电脑目录形式都一样)
使用命令:mkdir 文件名
- 然后继续使用命令 : vi ~/.bash_profile #配置hadoop的环境变量,在之前配置过jdk环境变量的基础上再加上下面的配置
export HADOOP_HOME=/usr/local/chadoop/hadoop
export PATH=,:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
配置完后使用命令:source ~/.bash_profile #使配置生效
然后使用命令: hadoop version #查看安装版本,命令有效表示环境变量配置好了
另外也可以使用命令: echo $HADOOP_HOME查看是否配置成功
好,准备工作都做好拉,接下来开始真正的配置,honghonghong,come on !
-
首先解压hadoop安装包
使用命令:tar -zxvf hadoop-3.0.1.tar.gz #解压安装包
使用命令:mv hadoop-3.0.1 chadoop/hadoop #移动到自己建的文件夹下,就是上面建的chadoop和子文件夹hadoop
使用命令: chwon -R root:root hadoop #给hadoop目录赋所有者权限 -
hadoop-env.sh
export JAVA_HOME=/usr/local/jdk #就是jdk的安装路径
-
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.8.50:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/chadoop/tmp</value>
</property>
这里的hadoop.tmp.dir请务必写上自己定义的目录,如果我们没有自己定义tmp存储目录的话,启动hadoop集群的时候相关文件会自动存储在根目录/底下的tmp文件夹下,以后重新格式化节点的时候比较麻烦(不好找)
- hdfs-site.xml
<configuration>
<property>
<name> dfs.namenode.name.dir</name>
<value>/usr/local/chadoop/dfs/name</value>
</property>
<property>
<name> dfs.datanode.name.dir</name>
<value>/usr/local/chadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
这里最好提前建好namonode和datanode目录,就是提前建好chadoop,chadoop底下的dfs目录,dfs底下的data和name目录(这些目录都可以自己定义,不用跟我的一样),
- yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<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.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
这里的yarn.resourcemanager.hostname的value值写你的主机名,其他都照着填就行!
- mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
照填就行!
- workers
在里面直接添加两个子节点的主机名就行了,直接使用命令:vi workers
然后添加两个子节点的主机名
下图是相关的编辑命令
上述配置文件的一些相关属性和属性值如果想要具体了解都是什么意思,可以上hadoop官网左下角查看:http://hadoop.apache.org/docs/r3.0.1/
- 到这里基本上配置完了,但是还有四个文件需要另外再添加点东西,不然后面启动hadoop各个节点的时候会报错。这四个文件在hadoop安装目录的sbin目录底下
- 使用命令:vi start-dfs.sh和vi stop-dfs.sh
在两个文本里面都添加:
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
start-dfs.sh
stop-dfs.sh
2) 使用命令:vi start-yarn.sh和vi stop-yarn.sh
在start-yarn.sh和stop-yarn.sh里面都添加:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
start-yarn.sh
stop-yarn.sh
接下来就是使用远程拷贝命令scp将配置好的hadoop复制到两个子节点的对应目录中(要和主节点的hadoop目录一致)。
scp -r /usr/local/chadoop root@slave1:/usr/local/
scp -r /usr/local/chadoop root@slave2:/usr/local/
- 然后我们需要格式化namenode,注意这里格式化一次就行了,下次再重新启动handoop集群的时候不要再执行这条命令,不然会出问题,要重新格式化的话需要在设置的tmp目录里面删东西。这一步要在hdoop安装目录下的bin目录下执行。
使用命令:hadoop namenode -format
- 启动handoop集群:这一步要切换到hadoop安装目录的sbin目录底下。
使用命令:start-all.sh #启动hadoop集群,对应的停止hadoop集群的话使用stop-all.sh,下一次重新启动handoop集群前用stop命令把hadoop给停了。
最后使用命令:jps查看的当前进程
都已经启动咯,恭喜你安装成功啦,赶紧发个朋友圈装装逼~~
问题1:
另外再强调一下在下面所有配置文件配置value属性值的时候千万不要有空格,否则这个将会报错,而且最主要的是还找不到这个错,谨记谨记!
上面这个错就是因为在core-site配置文件中,fs.defaultFS对应的hdfs://master:9000的前面加了个空格,当时真是崩溃至极啊~~找了好久才发现这个问题!
问题2:
如果没添加上面的那些配置可能运行脚本会报如下错误,
ERROR: Attempting to launch hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting launch.
Starting datanodes
ERROR: Attempting to launch hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting launch.
Starting secondary namenodes [localhost.localdomain]
ERROR: Attempting to launch hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting launch.
解决方案
(缺少用户定义而造成的)因此编辑启动和关闭
$ vim sbin/start-dfs.sh
$ vim sbin/stop-dfs.sh
顶部空白处
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
如果启动时报如下错误,
Starting resourcemanager
ERROR: Attempting to launch yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting launch.
解决方案
(也是由于缺少用户定义)
是因为缺少用户定义造成的,所以分别编辑开始和关闭脚本
$ vim sbin/start-yarn.sh
$ vim sbin/stop-yarn.sh
顶部添加
YARN_RESOURCEMANAGER_USER=root
HDFS_DATANODE_SECURE_USER=yarn
YARN_NODEMANAGER_USER=root
安装成功后在浏览器输入 主机名:8088 查看
查看web界面:
http://主机名:9870/
三 安装过程中常用的linux命令及解释:
-
权限不够的时候直接使用su root,然后输入密码(),切换到超级用户就行
-
退出vi编辑器:ESC退出编辑 :wq保存并退出 :q直接退出不保存。
-
cat file1 >> file2:把file1的内容输出追加到file2的末尾。
ssh 主机名 cat file1 >> file2:远程到主机执行命令,在这个主机上把file1的内容输出追加到file2的末尾。重定向输出,只不过用>>是在尾部追加。>也是重定向输出,是在头部追加。 -
cat filename:一次显示整个文件
-
Chown用来更改所属用户(组)
将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie :
chown jessie:users file1.txt -
chmod用来更改权限
chmod o+wx a.txt #指的是为其他用户(other)增加写和执行权限
chmod u+rw a.txt #指的是为所属用户(user,)增加写和执行权限
chmod 753 a.txt #指的是为所有的用户(user,)增加读,写和执行权限 #其实就是chmod rwxr-xrw- a.txt
-
scp [可选参数] file_source file_target
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
如果一个文件底下有好多文件,那么使用scp -r可以把其底下的文件夹一起复制过去! -
ssh [可选参数] 远程主机名:是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器.也可以远程ssh服务器上执行指令。就是直接使用ssh 主机名 远程连接其他主机,然后就可以使用命令操作其他主机了,非常的方便。
-
centos下在路径中
./指当前目录
…/指上级目录
~代表你的/home/用户名目录
例:
./crack.py指当前目录的crack.py文件
…/start指上级目录的start文件
-删除一个目录及其下面的文件:
rm -rf 目录名 (r表示递归删除,f表示直接强行删除,不做任何提示)
删除一个目录及其下面的文件:
cp -r 要拷贝的目录名 目标文件夹 -
root@slave1:~/.ssh
“root”:表示当前的登录的用户
“@”:可以理解为是一个分隔符号
“slave1”:你的主机名
“~”:表示你当前所在的目录 -
在命令行里面:
“#”:表示你当前登录用户的身份是root超级用户
“$”:表示你是普通用户 -
Ctrl +c 强制退出所有正在执行的操作
-
touch 是创建一个可编辑新的空文件(注意不是目录),创建目录用mkdir 目录名
有问题欢迎留言!