- 配置网络
- 修改主机名
- 关闭防火墙
- 关闭SELinux
- 安装jdk
- 增加hadoop用户
- 配置ssh信任
配置hadoop
前言,我在部署hadoop2.8出了很多问题,所以重新部署低版本2.7.3。在vmware上打开三台机器,装好centos7系统后,选定一台机器作为 master.hadoop,另外两台机器分别为slave1.hadoop,slave2.hadoop。前面6步三台机器上一样操作。vmware的使用这儿不展开。
这是我的主机对应ip,每个人的主机ip都不一样,可以通过ifconfig查看。
在应用程序中找到终端打开,输入ifconfig可以看到主机ip地址。
master.hadoop 192.168.220.128
slave1.hadoop 192.168.220.128
slave2.hadoop 192.168.220.128
通过远程终端登录到一台linux服务器,我这里使用SecureCRT。输入ip addr,可以看到我的ip地址是192.168.220.128
禁用ipv6网络,因为hadoop不支持ipv6。但是启用ipv6,有些服务会监听到ipv6,这样使用集群的时候可能会出问题。配置两个内核参数
vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
退出保存
退出保存方法:先Esc,再:x ,最后回车
使用sysctl工具使配置生效 sysctl -p
其他两台机器执行同样操作。
使用hostnamectl修改主机名hostnamectl set-hostname master.hadoop,使用hostname查看。若@后面未改变,退出终端重新登录就可以看到
另外两台机器分别执行
hostnamectl set-hostname slave1.hadoop
hostnamectl set-hostname slave2.hadoop
查看防火墙是否关闭,这里注意CentOs7关闭防火墙与CentOs6.x是不同的
systemctl status firewalld ——–>centos7
systemctl status iptables ——–>centos6.x
我这儿已经关闭,未关闭的执行下两条关闭防火墙
systemctl stop firewalld.service ———>停止firewall
systemctl disable firewalld.service ——>禁止firewall开机启动
使用sestatus查看状态
setenforce 0 临时关闭selinux,下次开机启动又会打开。这里修改配置文件vim /etc/selinux/config,把SELINUX设置为disabled
安装SSH Secure Shell Client客户端传输文件,安装即可登录直接拖拉到linux。下面给出工具链接,安装不给予说明。
链接:https://pan.baidu.com/s/1dHaqZmD 密码:s58m
直接将jdk拖到2位置
jdk8 链接:https://pan.baidu.com/s/1bqtHEj1 密码:g4f7
将下载好的jdk直接拖到连接的虚拟机内。安装jdk,下图可以看到jdk安装完毕,可以使用java检验是否安装成功
rpm -ivh jdk-8u151-linux-x64.rpm
增加hadoop用户,useradd hadoop。增加密码passwd hadoop。由于我之前已将创建了hadoop用户,所以显示已经存在。密码是不显示的,输完回车即可
给hadoop用户增加sudo权限,方便后面操作—>visudo,增加
hadoop ALL=(ALL) ALL
保存。切换hadoop用户 su - hadoop
接下来设置免密码登录
执行ssh-keygen -t rsa生成密钥对,接下来都按回车
把公钥复制到authorized_keys里面—–>cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
可以通过—–>cat .ssh/authorized_keys 查看是否复制成功
修改权限—–>chmod 600 .ssh/authorized_keys,可以看到下图-rw状态改变
取消免密提示有两种方式,我这里使用第二种
第一种:针对全局——>cat /etc/ssh/ssh_config 改为no
第二种:只对hadoop用户生效,添加配置文件
vi .ssh/config
Host localhost
StrictHostKeyChecking no
Host 0.0.0.0
StrictHostKeyChecking no
Host *hadoop*
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
修改权限——>chmod 600 .ssh/config,然后查看.ssh目录下的文件
修改hosts文件——>vi /etc/hosts
ip可以通过ipconfig或ip addr查看
把master.hadoop的公钥拷贝到slave1.hadoop,slave2.hadoop上
scp id_rsa.pub slave1.hadoop:/home/hadoop
scp id_rsa.pub slave1.hadoop:/home/hadoop
这里是需要输入密码的slave1.hadoop或slave2.hadoop的密码的
打开slave1.hadoop,slave2.hadoop终端拷贝master公钥内容到authorized_keys中
注意主机之间的切换
接下来最后一步配置hadoop,连接上hadoop用户,把hadoop-2.x传到主机上。我这儿使用hadoop-2.7.5,直接把hadoop包拖进主机,下面可以看到上传进度
链接:https://pan.baidu.com/s/1mkikpDI 密码:gecn
把hadoop部署到usr/local下,先拷贝安装包,需要sudo权限
sudo cp hadoop-2.7.5.tar.gz /usr/local,进到/usr/local目录下,可以看到已经传到/usr/local下了。注意这儿/usr/local前面必须有/。若出现“没有/usr/local这个文件”,可以使用mkdir手动创建文件夹
解压——–>sudo tar xzvf hadoop-2.7.5.tar.gz
删除tar——>rm -r hadoop-2.7.5.tar.gz
创建软连接——->sudo ln -s hadoop-2.7.5 hadoop
配置环境变量,全局 sudo vim /etc/profile
加载配置文件—–>source /etc/profile
### SET HADOOP_HOME
export JAVA_HOME=/usr/java/default
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
### Hadoop Environment Variables
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
修改所有者 sudo chown -R hadoop:hadoop hadoop-2.7.5
修改hadoop脚本,vim etc/hadoop/hadoop-env.sh,把JAVA_HOME和HADOOP_CONF_DIR改为具体目录
export JAVA_HOME=/usr/java/default
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop/
执行hadoop fs -ls / 看是否配置成功。
发现出现警告,可以忽视。或者可以在在/usr/local/hadoop/etc/hadoop/log4j.properties文件中添加
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
下面写个例子感受下hadoop的运行,照着我的步骤直接执行就可以了
进入hadoop目录—–>cd /usr/local/hadoop
创建input文件夹——>mkdir ./input
添加一个test.txt——–>vim input/test.txt
下面内容可以随意填写
hello hadoop
how do you do
are you ok
i am ok
执行下wordcount的MapReduce程序,wordcount在下面目录里是有的,直接执行以下代码。统计单词数
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount ./input ./output
很尴尬,报以下的错误
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/util/Apps
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:93)
at org.apache.hadoop.mapred.LocalJobRunner$Job.<init>(LocalJobRunner.java:163)
at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:731)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:536)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
at WordCount.main(WordCount.java:70)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.yarn.util.Apps
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 24 more
看异常是相应的jar没找到,有两种解决方法。我采用第二种
1、凡是出现 classNotFound、NoClassDefFoundError之类的错误异常,多是jar包未导入引起的。根据相应提示找相应目录下的jar包即可。
2、配置环境变量
vi /etc/profile增加
我这儿全部给出,需要的自己添加便可,最后source /etc/profile
### Hadoop Environment Variables
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
cd output
ll
cat part-r-00000
查看下执行结果
以上是单节点配置(非分布式)执行
下面在以上基础上配置集群