一、环境
- vmware
- 三台Linux64位虚拟机
- jdk1.8
- hadoop2.7
- ssh
二、步骤
1、配置hosts和hostname
hosts中添加
192.168.179.129 master
192.168.179.130 slave1
192.168.179.131 slave2
hostname中添加
master
其他两台相应的为slave1和slave2
2、给三台Linux配置ssh无密码登录,可以互相登录
安装ssh
sudo apt-get install openssh-server
生成RSA密钥对
ssh-keygen -t rsa
在/root/.ssh下找到生成的两个密钥文件id_rsa.pub 和id_rsa,前者是公钥,后者是私钥,把这个公钥添加到另外两台的~/.ssh目录下的authorized_keys文件里面,如果没有的话自己生成,同时要添加的本台~/.ssh目录下的authorized_keys文件里面,也要实现登陆自己的无密码登陆
可以使用
scp id_rsa.pub root@slave1:/home/root/Desktop
把公钥发送到slave1的桌面路径下,再使用命令
cat /home/root/Desktop/id_rsa.pub >> ~/.ssh/authorized_keys
把公钥添加到authorized_keys文件中
其他主机的添加是一样的方法。
3、安装jdk,通过使用ssh进行传输进行其他两台的安装
- 解压
tar xvf jdk1.8
- 配置环境变量
#set java environment
export JAVA_HOME=/home/root/java/jdk1.8
export JRE_HOME=/home/root/java/jdk1.8/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASS_PATH=./:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
其中有一部分是hadoop的环境变量,注意分辨
- 测试jdk是否安装成功
java -version
4、安装hadoop,通过使用ssh进行传输进行其他两台的安装
- 解压
tar xvf hadoop2.7.3
- 配置环境变量
#set java environment and hadoop environment
export JAVA_HOME=/home/root/java/jdk1.8
export JRE_HOME=/home/root/java/jdk1.8/jre
export HADOOP_HOME=/home/root/hadoop/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export CLASS_PATH=./:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
- 测试hadoop是否安装成功
hadoop version
- hadoop相关文件配置
路径/hadoop/etc/hadoop/下的hadoop-env.sh和yarn-env.sh中将JAVA_HOME改为相应路径
export JAVA_HOME=/home/root/java/jdk1.8
配置core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml如下
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/root/hadoop/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/root/hadoop/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/roothadoop/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
</configuration>
将配置好的hadoop和profile复制到另外两台计算机上面,使用scp命令
scp -r hadoop root@slave1:/home/root/hadoop/
在scp复制文件夹的时候要使用-r,意思是循环复制。
5、格式化namenode,启动hadoop,检查进程是否都已启动
- 格式化namenode
hadoop namenode -format
- 启动hadoop
在这个版本里面bin目录下面的start-all.sh已经摒弃,最好使用sbin目录下面的
start-dfs.sh
start-yarn.sh
6、验证hadoop是否已经全部启动
查看java进程
jps
在master下可以看到
6149 ResourceManager
5768 NameNode
7148 Jps
5982 SecondaryNameNode
在slave下可以看到
4401 Jps
4169 DataNode
4301 NodeManager
表明hadoop已经启动
7、将hdfs文件复制到本地,本地文件导入hdfs
- hdfs文件复制到本地
建立想要存放导出文件的目录,然后使用命令来导出
hdfs dfs -get /data/output/result/part-r-00000 output/
或者
hdfs dfs -copytolocal /data/output/result/part-r-00000 output/
其中copytolocal后面对应的是hdfs文件目录,本地目录
- 本地文件复制到hdfs
hdfs dfs -put README.txt /data/input
或者
hdfs dfs -copyfromlocal README.txt /data/input
三、在安装过程中出现的问题
问题1:
在使用
hdfs dfs -put README.txt /data/input
的时候,出现错误
17/02/24 16:03:13 WARN hdfs.DFSClient: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /data/input/README.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.
使用
hdfs dfsadmin -report
查看存储容量情况发现全部为零
Configured Capacity: 0 (0 B)
Present Capacity: 0 (0 B)
DFS Remaining: 0 (0 B)
DFS Used: 0 (0 B)
DFS Used%: NaN%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
在slave中查看启动log发现datanode连接不到master
在master中查看9000端口监听情况
tcp 0 0 127.0.1.1:9000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:52680 127.0.1.1:9000 TIME_WAIT
这样就发现了问题出在hosts配置的问题在hosts中把
127.0.1.1 master
那行删除,在slave1和slave2中删除相应行,重启hadoop就好了
问题二:
将文件放到hdfs目录下,在运行mapreduce程序的时候,
hdfs dfs -put README.txt /data/input
在hadoop/share/hadoop/mapreduce下运行示例程序
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /data/input /data/output/result
程序一直挂起,不能运行,发现是nodemanager没有运行,查看log
NodeManager from slave1 doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager
可见是内存分配的问题,yarn-site.xml中的内存设置必须大于1G ,而这里设置的是768mb,可能是因为给虚拟机分配的内存较少,导致的,将这个更改为1G就好了
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>