3. 环境安装
3.1 安装方式
-
单机模式
只能启动MapReduce
-
伪分布式
能启动HDFS、MapReduce 和 YARN的大部分功能
-
完全分布式
能启动Hadoop的所有功能
3.2 安装JDK
3.2.1 JDK安装步骤
下载JDK安装包(下载Linux系统的 .tar.gz 的安装包)
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
[root@vm ~]# tar -xf jdk-8u251-linux-x64.tar.gz -C /usr/local/
[root@vm ~]# cd /usr/local/
[root@vm local]# mv jdk1.8.0_251/ jdk8
[root@vm local]# cd
[root@vm ~]# vim .bashrc
...
export JAVA_HOME=/usr/local/jdk8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=.:$JAVA_HOME/bin:$PATH
[root@vm ~]# source .bashrc
[root@vm ~]# java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
3.3 安装Hadoop并配置伪分布式
3.3.1 Hadoop安装配置步骤
-
配置免登录认证,避免使用Hadoop时的权限问题
[root@vm ~]# ssh-keygen -t rsa [root@vm ~]# cd ~/.ssh;cat id_rsa.pub >> authorized_keys [root@vm .ssh]# ssh localhost [root@vm ~]# exit
下载Hadoop 2.10(374M)
https://archive.apache.org/dist/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz
-
解压到 /usr/local 目录中,并将文件夹重命名为 hadoop,
[root@vm ~]# tar xf hadoop-2.10.0.tar.gz -C /usr/local/ [root@vm ~]# cd /usr/local [root@vm local]# mv hadoop-2.10.0/ hadoop2.10 #非root用户可能需要执行 chown -R user:user hadoop2.10 [root@vm local]# cd /usr/local/hadoop2.10/bin [root@vm bin]# ./hadoop version Hadoop 2.10.0 Subversion ssh://git.corp.linkedin.com:29418/hadoop/hadoop.git -r e2f1f118e465e787d8567dfa6e2f3b72a0eb9194 Compiled by jhung on 2019-10-22T19:10Z Compiled with protoc 2.5.0 From source with checksum 7b2d8877c5ce8c9a2cca5c7e81aa4026 This command was run using /usr/local/hadoop2.10/share/hadoop/common/hadoop-common-2.10.0.jar
-
设置JAVE_HOME环境变量
[root@vm bin]# vim /usr/local/hadoop2.10/etc/hadoop/hadoop-env.sh export JAVA_HOME=/usr/local/jdk8 #修改前JAVA_HOME=${JAVA_HOME}
-
设置Hadoop环境变量
[root@vm bin]# cd [root@vm ~]# vim .bashrc #在末尾追加 export HADOOP_HOME=/usr/local/hadoop2.10 export CLASSPATH=.:{JAVA_HOME}/lib:${HADOOP_HOME}/sbin:$PATH export PATH=.:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH [root@vm ~]# source .bashrc
-
伪分布式配置,修改2个配置文件(core-site.xml 和 hdfs-site.xml)
补充如下内容
[root@vm ~]# vim /usr/local/hadoop2.10/etc/hadoop/core-site.xml <configuration> <property> <!--数据目录配置参数--> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop2.10/tmp</value> </property> <property> <!--文件系统配置参数--> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
[root@vm ~]# vim /usr/local/hadoop2.10/etc/hadoop/hdfs-site.xml <configuration> <property> <!--副本数量--> <name>dfs.replication</name> <value>1</value> </property> <property> <!--namenode数据目录--> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop2.10/tmp/dfs/name</value> </property> <property> <!--datanode数据目录--> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop2.10/tmp/dfs/data</value> </property> </configuration> #/usr/local/hadoop2.10/tmp/dfs/name/current/VERSION记录clusterid,与 /usr/local/hadoop2.10/tmp/dfs/data/current/VERSION记录clusterid 必须是相同的,否则启动失败
-
配置YARN,修改mapred-site.xml、yarn-site.xml
补充如下配置
[root@vm ~]# cd /usr/local/hadoop2.10/etc/hadoop [root@vm hadoop]# cp mapred-site.xml.template mapred-site.xml [root@vm hadoop]# vim mapred-site.xml <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
[root@vm hadoop]# vim yarn-site.xml <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> #计算方式 </property>
-
执行NameNode格式化
[root@vm hadoop]# cd /usr/local/hadoop2.10/bin [root@vm bin]# ./hdfs namenode -format 出现 Storage directory /usr/local/hadoop2.10/tmp/dfs/name has been successfully formatted 则表示格式化成功
-
启动Hadoop所有组件
[root@vm bin]# cd /usr/local/hadoop2.10/sbin [root@vm sbin]# ./start-all.sh 启动时可能会出现警告,直接忽略即可,不影响正常使用 [root@vm sbin]# jps #查看Hadoop相关组件进程 14513 DataNode 14882 NodeManager 14643 SecondaryNameNode 14789 ResourceManager 14425 NameNode 14921 Jps
启动成功后,可访问Web页面查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件 http://localhost:50070
-
测试 - 将本地文件上传至hdfs
[root@vm ~]# hadoop fs -put jdk-8u251-linux-x64.tar.gz / [root@vm ~]# hadoop fs -ls / Found 1 items -rw-r--r-- 1 root supergroup 195132576 2024-03-10 /jdk-8u251-linux-x64.tar.gz #也可以在浏览器中Utilities->Browse the file system查看,及上传下载删除操作
4. HDFS Shell操作
hadoop fs -ls / #查看HDFS系统目录
hadoop fs -mkdir -p 绝对路径 #创建文件夹
hadoop fs -put 本地文件 HDFS目录 #上传文件
hadoop fs -get HDFS文件 本地目录 #下载文件
hadoop fs -rm -r 目录 #删除文件或目录
haddop fs -text 文件绝对路径 #查看文件内容
hadoop fs -mv 源文件 目标目录
hadoop fs -cp 源文件 目标目录
5. MapReduce详解
5.1 MapReduce概述
5.1.1 MapReduce定义
- MapReduce是Hadoop提供的一套进行分布式计算的框架,用于大规模数据集(大于1TB)的并行运算
- MapReduce将计算过程拆分为2个阶段:Map(映射)阶段和Reduce(规约)阶段
5.1.2 MapReduce编程模型
-
MapReduce分而治之思想
【示例1】 需要在一堆扑克牌(张数未知)中统计四种花色的牌有多少张 思路:需要找几个人(比如说四个人),每人给一堆,数出来四种花色的张数,然后汇总 【示例2】 一堆钞票,请查找出各种面值的钞票分别有多少张? 思路:每个人分一部分钞票,数出各种面值的分别有多少张,然后再汇总
-
统计文件中每个单词出现的次数原理图
5.2 MapReduce编程实现
5.2.1 相关库安装
sudo pip3 install mrjob
5.2.2 Python实现wordcount案例(了解)
-
新建words.txt,并写入如下内容
hello world hello tarena I am world and tarena I love tarena world
-
python代码实现wordcount
from mrjob.job import MRJob class WordCount(MRJob): #重写mapper reducer 方法 完成自己的需求, hive可以实现sql转方法的实现 def mapper(self, _, line): #def mapper(self, key, line): # _: key,每行行首的偏移量,一般不使用,这里写成_ # line: 每行的内容 #重写功能 for word in line.split(): yield word, 1 # shuffle 和 sort 过程不用关注,hadoop自动去做,看不到 # hi 1 1 # hello 1 1 1 1 # world 1 def reducer(self, key, values): # key: map shuffle和sort之后的单词 # values: 每个单词出现次数的序列 yield key, sum(values) if __name__ == '__main__': WordCount.run()
-
运行MapReduce程序的两种方式
[1]本地模式(一次启动多个进程) python3 wordCount.py -r local word.txt #本地运行-r local,不会排序 [2]Hadoop模式 (比较消耗内存) python3 wordCount.py -r hadoop word.txt #会排序 "I" 2 "am" 1 "and" 1 "hello" 2 "love" 1 "tarena" 3 "world" 3
[1]本地模式(一次启动多个进程) python3 wordCount.py -r local word.txt #本地运行-r local,不会排序 [2]Hadoop模式 (比较消耗内存) python3 wordCount.py -r hadoop word.txt #会排序 "I" 2 "am" 1 "and" 1 "hello" 2 "love" 1 "tarena" 3 "world" 3