安装vmware,务必以管理员身份运行
操作系统(CentOS 6.5)的配置
准备工作:虚拟机安装三台linux 本次测试是 centos 6.5,(三台虚拟机的系统时间保持一致)
*安装jdk(在另外一个文档中)
*克隆虚拟机
*在vmware设置-克隆(虚拟机要关机,jdk要配置好)
*选择克隆当前状态的虚拟机
**克隆完之后关机,点击重新生成mac地址
克隆2台虚拟机完成后:新的2台虚拟机,请务必依次修改3台虚拟机的ip地址和主机名称【建议三台主机名称依次叫做:master、node1、node2 】
1修改ip地址:
其他克隆的虚拟机实际上只需要改address地址就可以,后面两项不变
*修改主机名命令: vi /etc/sysconfig/network (三台都要修改)
上述修改完成后,请依次重启三台虚拟机:重启命令:reboot
重启完成后依次在虚拟机上执行下面命令:
1.设置ip(上述步骤)(三台都要操作)
使用命令 重启网卡:service network restart
2.关闭防火墙(三台都要操作),使用命令:service iptables stop
3.关闭防火墙的自动启动(三台都要操作),使用命令:chkconfig iptables off
设置主机名与ip的映射,修改配置文件命令(三台都要操作):vi /etc/hosts
将hosts文件拷贝到node1和node2节点
命令:
scp /etc/hosts node1:/etc/hosts
scp /etc/hosts node2:/etc/hosts
4.设置ssh免密码登录(只在Master 这台主机操作)
4.1主节点执行命令ssh-keygen -t rsa 产生密钥 一直回车
执行命令
将密钥拷贝到其他两个子节点,命令如下:
ssh-copy-id -i node1
ssh-copy-id -i node2
实现免密码登录到子节点。
4.2 实现主节点master本地免密码登录
首先进入到/root 命令:cd /root
再进入进入到 ./.ssh目录下
命令:cd ./.ssh/
然后将公钥写入本地执行命令:
cat ./id_rsa.pub >> ./authorized_keys
如图
--------------------------------------(以下操作都在master 这台主机操作)-------------------
6将hadoop的jar包先上传到虚拟机/usr/local/soft目录下,主节点。可以使用xshell拖拽
7,解压。tar -zxvf hadoop-2.6.0.tar.gz 解压完后会出现 hadoop-2.6.0的目录
- 修改master中hadoop的一个配置文件/usr/local/soft/etc/hadoop/slaves
删除原来的所有内容,修改为如下
node1
node2
9,修改hadoop的几个组件的配置文件 进入/usr/local/soft/hadoop-2.6.0/etc/hadoop 目录下(请一定要注意配置文件内容的格式,可以直接复制过去黏贴。不要随意改)
* 修改hadoop-env.sh文件
加上一句
export JAVA_HOME=/usr/local/soft/jdk1.8.0_171
***修改 core-site.xml
将下面的配置参数加入进去修改成对应自己的
<configuration>
<!-- 这个属性用来指定namenode的hdfs协议的文件系统通信地址,可以指定一个主机+端口,也可以指定为一个namenode服务(这个服务内部可以有多台namenode实现ha的namenode服务) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<!-- 指定hadoop临时目录,前面用file:表示是本地目录。hadoop在运行过程中肯定会有临时文件或缓冲之类的,必然需要一个临时目录来存放,这里就是指定这个的。-->
<name>hadoop.tmp.dir</name>
<value>/usr/local/soft/hadoop-2.6.0/tmp</value>
</property>
<!--fs.trash.interval是在指在这个回收周期之内,文件实际上是被移动到trash的这个目录下面,而不是马上把数据删除掉。-->
<!--等到回收周期真正到了以后,hdfs才会将数据真正删除。默认的单位是分钟,1440分钟=60*24,刚好是一天。-->
<!--fs.trash.checkpoint.interval则是指垃圾回收的检查间隔,应该是小于或者等于fs.trash.interval。-->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
</configuration>
***
修改 hdfs-site.xml 将dfs.replication设置为1
<configuration>
<!-- hdfs的副本数设置。也就是上传一个文件,其分割为block块后,每个block的冗余副本个数-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- namenode数据的存放地点。也就是namenode元数据存放的地方,记录了hdfs系统中文件的元数据-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop-2.6.0/data/name</value>
</property>
<!-- datanode数据的存放地点。也就是block块存放的目录了-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop-2.6.0/data/data</value>
</property>
<property>
<!--是否在HDFS中开启权限检查。-->
<name>dfs.permissions</name>
<value>false</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.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
**修改 mapred-site.xml(将mapred-site.xml.template 复制一份为 mapred-site.xml
命令:cp mapred-site.xml.template mapred-site.xml)
<configuration>
<property>
<!---- 指定mr框架为yarn方式,Hadoop二代MP也基于资源管理系统Yarn来运行 -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!---- 指定mr框架jobhistory的内部通讯地址。目前还不知道是做什么的 -->
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<!---- 指定mr框架web查看的地址 -->
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
12,将hadoop的安装目录分别拷贝到其他子节点
scp -r /usr/local/soft/hadoop-2.6.0 node1:/usr/local/soft/
scp -r /usr/local/soft/hadoop-2.6.0 node2:/usr/local/soft/
13 启动hadoop
首先看下hadoop-2.6.0目录下有没有tmp文件夹。
如果没有 执行一次格式化命令:
cd /usr/local/soft/hadoop-2.6.0目录下
执行命令:
./bin/hdfs namenode -format
会生成tmp文件。
然后
/usr/local/soft/hadoop-2.6.0目录下
启动执行:./sbin/start-all.sh
启动完成后验证进程
主节点进程:namenode/ secondarnamenode/resourcemanager
子节点进程 datanode /nodenodemanager
验证hdfs:
可以登录浏览器地址:192.168.1.80:50070 (ip地址是master的地址)
看到下面页面证明 hdfs装好了
下图是我已经创建了一个hdfs上的目录,刚装好的hadoop应该是空的什么都没有
******* 如果第一次启动失败了,请重新检查配置文件或者哪里步骤少了。
再次重启的时候
需要手动将每个节点的tmp目录删除:
rm -rf /usr/local/soft/hadoop-2.6.0/tmp
然后执行将namenode格式化
在主节点执行命令:
./bin/hdfs namenode -format
常见错误及解决方案
1)防火墙没关闭、或者没有启动yarnx
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)ip地址配置错误
4)ssh没有配置好
5)root用户和其他两个用户启动集群不统一
6)配置文件修改不细心
7)未编译源码
Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
8)datanode不被namenode识别问题
Namenode在format初始化的时候会形成两个标识,blockPoolId和clusterId。新的datanode加入时,会获取这两个标识作为自己工作目录中的标识。
一旦namenode重新format后,namenode的身份标识已变,而datanode如果依然持有原来的id,就不会被namenode识别。
解决办法,删除datanode节点中的数据后,再次重新格式化namenode。
9)不识别主机名称
java.net.UnknownHostException: hadoop102: hadoop102
at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
解决办法:
(1)在/etc/hosts文件中添加192.168.1.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称
10)datanode和namenode进程同时只能工作一个。
11)执行命令 不生效,粘贴word中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴word中代码。
12)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。原因是在linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
13)jps不生效。
原因:全局变量hadoop java没有生效,需要source /etc/profile文件。
14)8088端口连接不上
[root@hadoop102 桌面]$ cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102