本地模式
特点:只需要一台服务器,没有HDFS、只能测试 MapReduce 程序,MapReduce 处理的是本地 Linux 的文件数据。
配置步骤:
-
修改 hadoop-2.7.3/etc/hadoop 目录下的 hadoop-env.sh 文件,在第 25 行做如下修改(配置JAVA_HOME):
export JAVA_HOME=/root/training/jdk1.8.0_144
-
测试 MapReduce 程序:
2.1. 创建目录 mkdir ~/input 作为测试数据的存放目录。
2.2. 在 input 目录下创建 data.txt 文件,内容如下:
I love Beijing I love China Beijing is the capital of China
2.3. 运行 hadoop 自带的一个 MapRecue 程序中的词频统计程序:
首先切换到 /root/training/hadoop-2.7.3/share/hadoop/mapreduce/ 目录下。
执行如下命令:
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount ~/input ~/output
该命令会运行 hadoop-mapreduce-examples-2.7.3.jar 中的 wordcount 程序,统计 ~/input 目录下所有文件中所有单词出现的频率,结果会保存到 ~/output 目录下。
注:不要事先创建 ~/output 目录,否则程序会抛出异常,程序在运行的时候会自动创建 ~/output 目录。
2.4. 运行成功的话会在 ~/output 目录下产生两个文件:part-r-00000,_SUCCESS。_SUCCESS 这个文件是一个空文件,出现这个文件说明词频统计成功。part-r-00000 这个文件里面存储的是 ~/input 目录下每个单词出现的次数,内容如下:
伪分布模式
特点:只需要一台服务器,模拟一个分布式的环境,具备 Hadoop 的主要功能。
配置步骤:
-
修改 hadoop-2.7.3/etc/hadoop 目录下的 hadoop-env.sh 文件,在第 25 行做如下修改(配置JAVA_HOME):
export JAVA_HOME=/root/training/jdk1.8.0_144
-
修改 hdfs-site.xml 文件,添加的内容如下:
<!-- 原则:一般数据块的冗余度跟数据节点(DataNode)的个数一致;最大不超过3 --> <!--表示数据块的冗余度,默认:3--> <property> <name>dfs.replication</name> <value>1</value> </property> <!--是否开启HDFS的权限检查,默认true,先不设置--> <property> <name>dfs.permissions</name> <value>false</value> </property>
-
修改 core-site.xml 文件,添加内容如下:
<!--配置NameNode地址,9000是RPC通信端口--> <property> <name>fs.defaultFS</name> <value>hdfs://bigdata111:9000</value> </property> <!--HDFS数据保存在Linux的哪个目录,默认值是Linux的tmp目录--> <property> <name>hadoop.tmp.dir</name> <value>/root/training/hadoop-2.7.3/tmp</value> <!-- 该目录必须事先创建 --> </property>
-
修改 mapred-site.xml 文件,添加内容如下:
<!--MapReduce程序运行在yarn里面--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
注:hadoop-2.7.3/etc/hadoop/ 目录下默认是没有 mapred-site.xml 文件的,需要复制一份 mapred-site.xml.template 文件,执行如下命令:
cp mapred-site.xml.template mapred-site.xml
。 -
修改 yarn-site.xml 文件,添加内容如下:
<!--Yarn的主节点ResourceManager的位置--> <property> <name>yarn.resourcemanager.hostname</name> <value>bigdata111</value> </property> <!--MapReduce运行方式:shuffle洗牌--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
-
格式化 HDFS:
执行命令:
hdfs namenode -format
看到打印的日志中显示:Storage directory /root/training/hadoop-2.7.3/tmp/dfs/name has been successfully formatted 就说明格式化成功。
-
启动停止 Hadoop 环境:
启动:
start-all.sh
停止:
stop-all.sh
ps:启动和停止 Hadoop 都会让你输入四次当前服务器的密码。因此我们需要配置免密码登录服务器。
免密码登录
原理
使用非对称加密算法。
-
从 ServerA 登录到 ServerB。
-
ServerB 随机产生一个字符串,使用 ServerA 给的公钥进行加密。
-
ServerB 把加密后的字符串发给 ServerA。
-
ServerA 用私钥解密收到的字符串。
-
ServerA 将解密后的字符串回发给ServerB。
-
ServerB 将收到的字符串与最开始生成的字符串对比,匹配则直接登录,不匹配则需要 ServerA 重新输入密码进行登录。
配置
-
使用
ssh-keygen -t rsa
命令产生一个密钥对:公钥(给别人,用于加密),私钥(给自己,用于解密)。 -
在当前用户的家目录下会产生一个 .ssh 隐藏目录,里面会产生两个文件:id_rsa(私钥),id_rsa.pub(公钥)。
-
把公钥拷贝给要登录的服务器:
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata111
-
在对方服务器的 .ssh/ 目录下就会多一个 authorized_keys 文件,里面存储着别的服务器发来的所有公钥。
-
-
通过 Web 界面访问:
HDFS:http://192.168.220.111:50070
Yarn:http://192.168.220.111:8088ps:具体的服务器地址取决于自己的配置。
记录下这历史性的一刻:
ps:再运行一下之前那个 wordcount 程序,看看会发生什么。
抛出异常,原因:原来数据的目录时本地 Linux 上的,现在已经开启伪分布式模式,需要使用 HDFS 的目录。
hdfs dfs -mkdir /input
,该命令会在 HDFS 的根目录 / 下创建一个 input 目录。(执行该命令时,需要启动 HDFSstart-all.sh
)hdfs dfs -put ~/input/data.txt /input
,该命令会把我们本地的 ~/input/data.txt 文件上传到 HDFS 的 /input 目录下。- 查看 HDFS 根目录下的文件:
hdfs dfs -ls /
。 - 查看 HDFS 根目录下的文件(包含子目录):
hdfs dfs -lsr /
。 - 执行原来的 mapreduce 程序:
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/1117
,该命令会读取 HDFS 的 /input 目录下的 data.txt 文件,进行词频统计,统计的结果会输出到 HDFS 的 /output/1117 目录下。 - 在程序运行的过程中可以访问:http://192.168.220.111:8088/ 查看运行中的 mapreduce 程序。
- 最后程序执行完毕,执行
hdfs dfs -ls /output/1117
查看里面生成的文件内容。
全分布模式
特点:需要多台服务器构建集群,真正的分布式环境,用于生产。
准备工作
-
关闭防火墙:
本次停止:
systemctl stop firewalld.service
永久关停:systemctl disable firewalld.service
-
安装JDK
-
为集群中的每台机器配置IP到主机名的映射:
192.168.220.112 bigdata112 192.168.220.113 bigdata113 192.168.220.114 bigdata114
-
配置免密码登录,两两之间都要配置
4.1. 每台机器产生自己的公钥和私钥:
ssh-keygen -t rsa
4.2. 每台机器把自己的公钥给别人和自己:
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata112 ssh-copy-id -i .ssh/id_rsa.pub root@bigdata113 ssh-copy-id -i .ssh/id_rsa.pub root@bigdata114
-
保证每台机器的时间同步:
同时向三个终端发送如下命令:
date -s "2018-11-18 14:47:57"
,来协调时间的一致,如果时间不一致,后续在执行 mapreduce 程序的时候有可能出现问题。
在主节点上进行安装
-
解压 tar 包,向 .bash_profile 中设置 Hadoop 的环境变量:
tar -zxvf hadoop-2.7.3.tar.gz -C ~/training/
集群中的每台机器都要设置环境变量
HADOOP_HOME=/root/training/hadoop-2.7.3 export HADOOP_HOME PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export PATH
-
修改 hadoop-env.sh 文件,将第 25 行的内容修改为:
export JAVA_HOME=/root/training/jdk1.8.0_144
-
修改 hdfs-site.xml 文件:
<!--表示数据块的冗余度,默认:3--> <property> <name>dfs.replication</name> <value>2</value> </property>
-
修改 core-site.xml 文件:
<!--配置NameNode地址,9000是RPC通信端口--> <property> <name>fs.defaultFS</name> <value>hdfs://bigdata112:9000</value> </property> <!--HDFS数据保存在Linux的哪个目录,默认值是Linux的tmp目录--> <property> <name>hadoop.tmp.dir</name> <value>/root/training/hadoop-2.7.3/tmp</value> </property>
-
拷贝 mapred-site.xml.template 生成一份 mapred-site.xml:
cp mapred-site.xml.template mapred-site.xml
修改内容如下:
<!--MR运行的框架--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
修改 yarn-site.xml 文件:
<!--Yarn的主节点RM的位置--> <property> <name>yarn.resourcemanager.hostname</name> <value>bigdata112</value> </property> <!--MapReduce运行方式:shuffle洗牌--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
-
修改 slaves 文件,配置从机的位置:
bigdata113 bigdata114
-
格式化 namenode:
hdfs namenode -format
-
把主节点上配置好的 hadoop 复制到从节点上:
scp -r hadoop-2.7.3/ root@bigdata113:/root/training scp -r hadoop-2.7.3/ root@bigdata114:/root/training
-
在主节点上启动:
start-all.sh
值得纪念的一刻:
也可以通过执行
hdfs dfsadmin -report
命令,查看 HDFS 的 namenode 和 datanode 节点的状态。[root@bigdata113 ~]# hdfs dfsadmin -report Configured Capacity: 100865679360 (93.94 GB) Present Capacity: 96658509824 (90.02 GB) DFS Remaining: 96658493440 (90.02 GB) DFS Used: 16384 (16 KB) DFS Used%: 0.00% Under replicated blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 Missing blocks (with replication factor 1): 0 ------------------------------------------------- Live datanodes (2): Name: 192.168.220.113:50010 (bigdata113) Hostname: bigdata113 Decommission Status : Normal Configured Capacity: 50432839680 (46.97 GB) DFS Used: 8192 (8 KB) Non DFS Used: 2103767040 (1.96 GB) DFS Remaining: 48329064448 (45.01 GB) DFS Used%: 0.00% DFS Remaining%: 95.83% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Sun Nov 18 15:05:23 CST 2018 Name: 192.168.220.114:50010 (bigdata114) Hostname: bigdata114 Decommission Status : Normal Configured Capacity: 50432839680 (46.97 GB) DFS Used: 8192 (8 KB) Non DFS Used: 2103402496 (1.96 GB) DFS Remaining: 48329428992 (45.01 GB) DFS Used%: 0.00% DFS Remaining%: 95.83% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Sun Nov 18 15:05:23 CST 2018
安装过程中出现的问题
-
value 标签错写成 valual,导致执行 start-all.sh 的时候抛异常。
-
之前在主节点上搭建了伪分布式环境,已经格式化了 hdfs,导致在搭建全分布式环境启动 HDFS 和 Yarn 的时候,从节点虽然已启动了 DataNode 进程但是在 web 页面上却显示存活的节点数为 0。按照网上的教程,删除存储数据的目录,重新格式化无果。删除 hadoop 重装,问题解决。