前期准备
- 安装3台虚拟机ubuntu14.04,装机的时候分别将3台主机命名为:namenode、datanode1、datanode2
- 设置root密码,输入
sudo passwd root
,接着重复输入好几次root密码即可 - 登陆root用户,终端
su root
,给虚机安装vmware tools,以便后续共享文件 - 修改三台虚机的hostname以及hosts,执行
vi /etc/hostname
,修改hostname分别为namenode、datanode1、datanode2。执行vi /etc/hosts
,分别查看3台虚机的ip地址,一一对应写入hosts文件(3台虚机均需要执行) - 为保证后续使用host名访问无误,需要设置虚拟机的静态ip地址
- 配置免密SSH登陆
- 安装jdk
- 安装、配置hadoop
- hadoop启动及查看节点运行情况
VMware Fusion设置ubuntu静态ip
网上的资料几乎都是在虚拟机内修改resolv.conf或者interfaces文件,笔者修改完后均不能正常上网。重新查找资料才发现在VMware Fusion中设置才行得通,设置步骤如下:
- 查询虚拟机的mac地址,在虚机的settings里面找到network adapter,找到advanced options,可以查看到当前虚机的mac地址
- 在本机的
/Library/Preferences/VMware Fusion/vmnet8
文件夹中找到dhcpd.conf文件修改- 注意:命令行中的空格需要用转义字符\,所以上句其实应该是
cd /Library/Preferences/VMware\ Fusion/vmnet8
- 注意:命令行中的空格需要用转义字符\,所以上句其实应该是
- 在配置文件中添加:
host (你的虚机名,需要完全一样) {
hardware ethernet (你的虚机mac地址);
fixed-address (你的虚机ip地址);
}
- 注意:虚机名最好不要有空格
- 修改完成后重启VMware Fusion即可
配置免密SSH登陆
- 三台虚机均需要安装ssh server,在终端执行:
apt-get install openssh-server
- 关闭防火墙,并且默认开启ssh server,在终端新建文件:
vi /etc/profile.d/hadoop.sh
,然后在文件内写入:
#关闭防火墙
ufw disable
#设置自动启动ssh server
/etc/init.d/ssh start
-
用三台虚机分别产生公钥,并且都互相加入到各自的authorized_keys中。这一步用来保证三个节点可以互相免密访问:
- 在三个节点中均执行:
ssh-keygen -t dsa -P ''
- 生成的公钥保存在~/.ssh文件夹中
- 在三个节点中均执行:
-
接下来把三个节点各自生成的公钥拷贝到共享文件夹,以便于其他节点粘贴到自己的authorized_keys文件夹
-
在namenode中执行:
scp ~/.ssh/id_dsa.pub /mnt/hgfs/share/id_dsa0.pub
在datanode1和datanode2中分别执行该操作,注意把粘贴后的名字改为id_dsa1.pub和id_dsa2.pub即可 -
在三个节点中均执行:
cat /mnt/hgfs/share/id_dsa0.pub >> ~/.ssh/authorized_keys
cat /mnt/hgfs/share/id_dsa1.pub >> ~/.ssh/authorized_keys
cat /mnt/hgfs/share/id_dsa2.pub >> ~/.ssh/authorized_keys
这一步的目的是把其他节点生成的公钥放入自己的authorized_keys中
- 接下来可以测试:
ssh localhost
,输入一次yes后不需要密码即可登陆。也可测试ssh datanode1
,同样yes过后下次可以直接登陆
出现的问题总结
- 输入
ssh localhost
时出现ssh: connect to host localhost port 22: Connection refused:刚配置完需要重启才可以用ssh登陆
再次登陆时,需要先将host加入可信节点,下次再登陆就不用yes了
安装vmware tools方法
- 在虚拟机设置中找到vmware tools安装选项,点击后进入光盘内,打开终端,将压缩包解压到/usr/src中(
tar zxvf 压缩包名 -C /usr/src
) - 如果虚拟机设置中安装vmware tools的选项不可选,关掉虚拟机再开即可。(重启有时没用,最好关机,再开启)
- 进入/usr/src/vmware(具体的名字具体分析)文件夹内,执行
./vmware-install.pl
即可(该语句在光盘内有说明)
安装jdk流程
- 将jdk压缩包解压到/usr/src文件夹中,并给jdk文件夹改名:
mv jdk1.8.0_161 jdk1.8
,此处改名的原因在于:原先解压的文件名比较长,配置环境变量的时候打字很麻烦,所以环境变量都用jdk1.8代替了,此处解压后的文件夹也需要改名 - 配置环境变量,执行:
vi /etc/profile
- 添加:
#set java environment
export JAVA_HOME=/usr/src/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
- 运行
source /etc/profile
使更新后的profile生效
安装、配置hadoop
安装hadoop
- 将hadoop-2.6.0.tar.gz解压到/home/hadoop文件夹下(文件夹路径可以自由选择,但注意三个主机最好相同,后期可以省掉很多麻烦)
- 修改/etc/profile文件,增加下面的部分:
#set hadoop environment
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export HADOOP_MAPARED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export YARN_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop
- 需要在PATH路径中添加HADOOP_HOME,即将文件上方的
export PATH=$PATH:$JAVA_HOME/bin
改为export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
- 执行
source /etc/profile
使文件生效 - tips: 在一个机器上写好,复制到共享文件夹,其他3个粘贴,或者用ssh传递都可以
配置hadoop
- 在namenode中新建3个文件夹,其中-p表示,如果父文件夹不存在的话,也一起创建父文件夹:
mkdir /home/hadoop/tmp
mkdir -p /home/hadoop/dfs/name
mkdir -p /home/hadoop/dfs/data
这3个文件夹在hadoop的配置文件中需要使用,如果和笔者的文件夹名称不同,在后面配置文件中做相应修改即可
- 一般情况下需要修改7个hadoop的配置文件:
- /home/hadoop/hadoop-2.6.0/etc/hadoop/hadoop-env.sh
- /home/hadoop/hadoop-2.6.0/etc/hadoop/yarn-env.sh
- /home/hadoop/hadoop-2.6.0/etc/hadoop/slaves
- /home/hadoop/hadoop-2.6.0/etc/hadoop/core-site.xml
- /home/hadoop/hadoop-2.6.0/etc/hadoop/hdfs-site.xml
- /home/hadoop/hadoop-2.6.0/etc/hadoop/mapred-site.xml
- /home/hadoop/hadoop-2.6.0/etc/hadoop/yarn-site.xml
- 修改hadoop-env.sh文件:找到JAVA_HOME修改为:
JAVA_HOME=/usr/src/jdk1.8
- 修改yarn-env.sh文件:找到JAVA_HOME修改为:
JAVA_HOME=/usr/src/jdk1.8
- 修改slaves文件:写入:
namenode
datanode1
datanode2
该文件的作用是指定datanode运行在哪些机器上,笔者设置在三台虚机上均运行datanode。如果虚机的host名与笔者不同,此处需要修改为自己的虚机host名
- 修改core-site.xml文件,在configuration部分增加:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
</configuration>
-
注意事项:
- fs.defaultFS是图形可视化界面的地址,具体值为namenode:9000,如果虚机host名不是namenode,则需要改为承载namenode的虚机host名
- hadoop.tmp.dir属性里可以看到之前新建的文件夹目录,如果目录不同,此处也需做相应修改
-
修改hdfs-site.xml文件,在configuration部分增加:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>namenode:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
-
注意事项:
- dfs.namenode.secondary.http-address项的值需要根据虚机host名修改
- dfs.namenode.name.dir和dfs.namenode.data.dir正是之前新建的文件夹目录
-
修改mapred-site.xml文件,在configuration部分增加:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>namenode:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>namenode:19888</value>
</property>
</configuration>
-
注意事项:
- 同样mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address的值里面,根据虚机的host名自行修改
-
修改yarn-site.xml文件,在configuration部分增加:
<configuration>
<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.resourcemanager.address</name>
<value>namenode:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>namenode:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>namenode:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>namenode:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>namenode:8088</value>
</property>
</configuration>
- 注意事项:
- 同样注意修改部分地址的host名
配置2个datanode节点
- 按照namenode的方式新建3个文件夹,并且配置好hadoop-env.sh和yarn-env.sh文件
- 从namenode上将剩余文件复制到datanode1和datanode2的相应文件夹内,执行:
scp slaves datanode1:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp core-site.xml datanode1:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp hdfs-site.xml datanode1:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp mapred-site.xml datanode1:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp yarn-site.xml datanode1:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp slaves datanode2:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp core-site.xml datanode2:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp hdfs-site.xml datanode2:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp mapred-site.xml datanode2:/home/hadoop/hadoop-2.6.0/etc/hadoop
scp yarn-site.xml datanode2:/home/hadoop/hadoop-2.6.0/etc/hadoop
至此hadoop配置结束,可以启动hadoop进行验证了
hadoop启动
进入home/hadoop/hadoop-2.6.0,初始化namenode,执行:./bin/hdfs namenode -format
,命令行最终有successfully字样即为初始化成功
启动hadoop,执行:./sbin/start-all.sh
启动后可以执行:./bin/hadoop dfsadmin –report
查看节点运行情况
或者登陆http://namenode:50070查看
hadoop关闭
执行:./sbin/stop-all.sh
经验教训
单纯按照某个教程走,除非所有文件、文件夹命名完全一样,不然总容易出问题,还是需要关注一下配置文件的具体内容,搞懂这里为什么这么写,就没那么多问题了……
另外,发现如果是使用自己编译的源码,那么每次在源码上有修改后,都需要初始化namenode,同时注意,初始化namenode时需要保证/home/hadoop/dfs/name、/home/hadoop/dfs/data、/home/hadoop/tmp三个文件夹为空,不然会导致2次初始化的namenodeID不同而没有分配相应空间。datanode上的这几个文件也需要清空。