为了做实验,自己在自己的电脑上安装了虚拟机来尝试玩一下Hadoop,安装Hadoop,熟悉Hadoop的运行方式。
提前准备
安装环境:
Windows 7 Enterprise 64 bit
Memory: 8G
Process: i7-3770 3.4GHz
Software: VMware Workstation
虚拟机系统:
Ubuntu 10.04 64bit
Hadoop 2.6.0
JDK 1.8.0
hadoop安装
1. 安装虚拟机,64位的Ubuntu 10.04,分别命名为
NameNode: compute-n
DataNode: compute-0-1, compute-0-2, compute-0-3, compute-0-4
user: hadoop
password:123
2. 进入系统,安装SSH,方便传输文件
2.1 首先安装SSH,命令 sudo apt-get install openssh-server
3. 更改各个VM的名称
/etc/hostname
更改机器的名称,方便SSH的时候好沟通
NameNode: compute-n
DataNode: compute-0-1, compute-0-2, compute-0-3, compute-0-4
/etc/hosts
将整个cluster所有的机器和对应的IP加入进来,这样的话 ,机器就知道了其他机器在系统中的位置
127.0.0.1 localhost.localdomain localhost
192.168.31.128 compute-0-1.local compute-0-1
192.168.31.129 compute-0-2.local compute-0-2
192.168.31.130 compute-0-3.local compute-0-3
192.168.31.131 compute-0-4.local compute-0-4
192.168.31.133 compute-n.local compute-n
安装sshd
sudo apt-get install openssh-server
使用以下命令进行检测
ssh localhost
修改一个节点后,可以通过scp命令直接拷贝到其他的电脑
sudo scp /etc/hosts hadoop@192.168.31.128:/home/hadoop/Downloads
4. 修改SSH,互相之间可以相互建立信任的通信
4.1 首先在每台机器上运行,以后命令,生成每台电脑的公钥
ssh-keygen -t rsa
cd ~/.ssh
会有id_rsa, id_rsa.pub 两个文件
4.2 将所有节点上的id_rsa.pub 拷贝到compute-n节点上
scp compute-0-1:~/.ssh/id_rsa.pub compute-0-1
scp compute-0-2:~/.ssh/id_rsa.pub compute-0-2
scp compute-0-3:~/.ssh/id_rsa.pub compute-0-3
scp compute-0-4:~/.ssh/id_rsa.pub compute-0-4
4.3 将所有的密钥放入到authorized_keys文件中
cat compute-0-1 compute-0-2 compute-0-3 compute-0-4 id_rsa.pub >> authorized_keys
4.4 之后将anthorized_keys拷贝到其他的所有的节点上
scp authorized_keys compute-0-1:/home/hadoop/.ssh/
scp authorized_keys compute-0-2:/home/hadoop/.ssh/
scp authorized_keys compute-0-3:/home/hadoop/.ssh/
scp authorized_keys compute-0-4:/home/hadoop/.ssh/
4.5 检验之间是否可以互相信任的通信
ssh compute-0-1
ssh compute-0-2
5. 安装JDK,这是运行环境,必须的
5.1 下载JDK,对应为64bit, 现在已经JDK1.8.0
解压:
tar xvf jdk-8u25-linux-x64.tar.gz
5.2 移动到/usr/java
mv jdk1.8.0_40 /usr/java/
5.4 修改配置文件/etc/profile,进行环境配置,将以下内容加入到文件最后
JAVA_HOME=/usr/java/jdk1.7.0_75
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
java -version
6. 安装hadoop,配置开发环境
6.1 下载Hadoop安装包,解压安装包
tar -zxvf hadoop-2.6.0.tar.gz
将安装包放入到/home/hadoop目录下
mv hadoop-2.6.0 /home/hadoop
6.2 修改配置文件
6.2.1 masters
compute-n
6.2.2 slaves
compute-0-1
compute-0-2
compute-0-3
compute-0-4
6.2.3 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>compute-n</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/hadoopdata/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///home/hadoop/hadoopdata/dfs/data</value>
</property>
<property>
<name>dfs.http.address</name>
<value>compute-n:50085</value>
</property>
</configuration>
配置namenode和data的目录 /home/hadoop/hadoopdata/dfs/name 和 /home/hadoop/hadoopdata/dfs/data
6.2.4 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://compute-n:8025</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoopdata/tmp</value>
</property>
<property>
<name>hadoop.native.lib</name>
<value>true</value>
</property>
</configuration>
6.2.5 mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx2048m</value>
</property>
-->
<property>
<name>mapreduce.map.memory.mb</name>
<value>128</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>128</value>
</property>
<property>
<name>mapred.reduce.slowstart.completed.maps</name>
<value>0.75</value>
</property>
<property>
<name>mapreduce.reduce.cpu.vcores</name>
<value>1</value>
</property>
<property>
<name>mapreduce.map.java.opts></name>
<value>-Xmx100m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx100m</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>compute-n:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>compute-n:19888</value>
</property>
</configuration>
6.2.6 yarn-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>compute-n</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>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>300</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
-->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>450</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>file:///home/hadoop/hadoopdata/yarn/logs</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>file:///home/hadoop/hadoopdata/yarn/data</value>
</property>
</configuration>
配置nodemanager的log和本地目录,分别为 /home/hadoop/hadoopdata/yarn/logs 和 /home/hadoop/hadoopdata/yarn/data
6.2.7 hadoop-env.sh
添加如下内容,指定配置文件的位置
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/home/hadoop/hadoop-2.6.0/etc/hadoop"}
如果运行的时候提醒找不到JDK的话,添加如下
export JAVA_HOME=/usr/java/jdk1.8.0_40
6.3 将hadoop-2.6.0 文件夹拷贝到其他所有的节点
sudo scp -r /home/hadoop/hadoop-2.6.0 hadoop@compute-0-1:/home/hadoop
sudo scp -r /home/hadoop/hadoop-2.6.0 hadoop@compute-0-2:/home/hadoop
sudo scp -r /home/hadoop/hadoop-2.6.0 hadoop@compute-0-3:/home/hadoop
sudo scp -r /home/hadoop/hadoop-2.6.0 hadoop@compute-0-4:/home/hadoop
7. 启动hadoop
7.1 当hadoop安装完成之后,进入/home/hadoop/hadoop-2.6.0/sbin, 用start-all.sh启动所有的作业,首先启动namenode 和 datanode ,之后启动 ResourceManager 和 nodeManager
之后启动historyServer
mr-jobhistory-daemon.sh start historyserver
7.2 检测是否启动
在namenode使用命令jps,查看有哪些启动
NameNode
ResourceManager
Jps
在datanode使用命令jps,查看有哪些启动
DataNode
NodeManager
Jps
8. 在HDFS中为用户新建账目
hadoop fs -mkdir -p /user/[current login user]
如果没有这段话的话,hadoop fs -ls 是无法使用的,会提醒"No such file or directory"
之后就可以享受hadoop框架了,开始好好的做实验,如果是初学,最好是弄个WordCount,这就和刚学JAVA,编写一个HelloWorld 一样
参考
2. YARN加载本地库抛出Unable to load native-hadoop library解决办法
感受:
安装这个cluster 我用了不到半天的时间,但是为了结果一个我看起来是个bug的东西,我鼓捣了两天,但是仅仅是个WARN
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
当时我使用 hadoop fs -ls 这个命令的时候,发现无法使用,所以主观的认定现在这个WARN的问题,导致我无法使用HDFS,所以去想办法结果这个问题,但是现在我才发现,这个WARN和我无法使用这个命令没有半毛钱关系,我浪费了好多的时间,我现在知道为什么高级技工收费那么高了,熟练真的是一种技能
当时解决问题的方式:
首先查找这个WARN是怎么回事,原因是版本不一致,在 /lib/native 中的文件是64bit,而当时我的系统是32bit ubuntu 10.04,
2. 版本不一致,那就重新编译hadoop 2.6.0 ,下载hadoop的src文件,之后编译,编译需要安装mvn,还有一堆其他的软件
3. 开始安装mvn,是用的系统提示,结果安装了mvn2,在hadoop-src文件目下mvn的时候,发现无法mvn,提示需要mvn 3.0以上版本,而当时我只是mvn 2.0
4. 换mvn版本,先卸载原来的mvn2,要不然命令行输入mvn,使用的命令一直是mvn 2,安装完成后,将mvn 3.0 安装路径写入到 path中,OK,现在mvn安装好了,之后下一步想mvn hadoop-src,结果还是有问题,经过查找,发现是安装的一堆软件中,有一个版本有问题,当这个时候,火了,直接放弃了
5. 既然这么多的版本有问题,那么我直接安装一个64bit 的系统不就好了,就不用那么麻烦了,所有就去安装最新的Ubuntu 14.10 开始分配的内存是1G,五台机器,结果发现整个不行了,我现在的系统是Win 7 64bit, 内存是8G,被虚拟机分去5G,整个电脑卡成狗了,虚拟机里面基本上也没有反应速度,直接换成低版本 10.04 的64位版本,每台电脑512M内存,运行速度依旧不错
6. 之后按照正常的流程安装Hadoop之后,还是有那个WARN,我火就大了,真心的,我鼓捣了整整一天了,还出现这个问题,让我火受不了了,接下来我又通过关键字 "No such file or directory" 知道根本就仅仅是个WARN,没有其他的问题,当用 hadoop fs -mkdir /user/hadoop 之后,一切正常了。写下这段文字,让我自己感受一下
7. 打开原来的虚拟机,32位的虚拟机,发现32位虚拟机有这个问题,但是HDFS是可用的,我当时发现HDFS不能用的时候,首先想到的居然是WARN造成的,没有找到真正的问题,之后的所有的努力都是无用功
8. 当出现问题的时候,方向错了,真的比任何时候都严重,不仅仅是浪费了时间,精力,同时在解决问题中,不知道何时停下来才是合适的,我这次停下来的时候,真的是有点晚,耽误了整整一天的时间