前言
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
本次教程所需软件包
- hadoop-2.6.0-cdh5.16.2.tar.gz
- jdk-8u181-linux-x64.tar.gz
部署与入门实战
官网:hadoop.apache.org
如果需要查看其他生态圈软件的详细内容网址,以hive为例:hive.apache.org
官方文档:hadoop.apache.org/docs/r2.10.…
三种部署模式
- Local (Standalone) Mode 本地模式
- Pseudo-Distributed Mode 伪分布式模式√
- Fully-Distributed Mode 分布式模式 集群
1、HDFS
1、设置节点的hosts⽂件:
[root@localhost /]# vim /etc/hosts
2、关闭防火墙及Selinux
[root@localhost /]# systemctl stop firewalld
[root@localhost /]# systemctl disable firewalld
[root@localhost /]# vim /etc/sysconfig/selinux
[root@localhost /]# reboot
3、创建hadoop用户及所需目录
[root@xinxing001 /]# useradd hadoop
[root@xinxing001 /]# su - hadoop
[hadoop@xinxing001 ~]$ mkdir tmp sourcecode software shell log lib data app
- tmp:用于存放临时、缓存文件
- sourcecode:存放源代码
- software:存放软件包
- shell:存放脚本
- log:存放日志
- lib:存放第三方jar包
- data:存放第三方数据
- app:存放hadoop软件
4、配置JAVA环境变量
配置
参考我的另一片文章> java环境变量配置
5、解压缩软件以及软连接
[root@xinxing001 software]#su - hadoop
[hadoop@xinxing001 software]# tar -zxvf hadoop-2.6.0-cdh5.16.2.tar.gz -C ../app/
[hadoop@xinxing001 software]# cd ../app/
[hadoop@xinxing001 app]# ln -s hadoop-2.6.0-cdh5.16.2/ hadoop
修改hadoop配置文件,指定jdk路径
[hadoop@xinxing001 hadoop]# vim /home/hadoop/app/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_181/
6、配置无密码认证(不配置则启动每个服务时需输入用户密码)
[hadoop@xinxing001 ~]# cd ~
[hadoop@xinxing001 ~]# ssh-keygen
回车回车回车
[hadoop@xinxing001 ~]$ cd .ssh
[hadoop@xinxing001 .ssh]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[hadoop@xinxing001 .ssh]$ chmod 0600 ~/.ssh/authorized_keys
#测试是否配置成功
[hadoop@xinxing001 .ssh]$ ssh [你的主机名] [command]
7、修改配置文件
namenode配置文件
[hadoop@xinxing001 /]$ cd /home/hadoop/app/hadoop/etc/hadoop
[hadoop@xinxing001 hadoop]$ vim core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://[你自己的主机名]:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp/</value>
</property>
SecondaryNameNode配置文件
[hadoop@xinxing001 hadoop]$ vim hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>[你自己的主机名]:9868</value>
</property>
<property>
<name>dfs.namenode.secondary.https-address</name>
<value>[你自己的主机名]:9869</value>
</property>
dadanode配置文件
[hadoop@xinxing001 hadoop]$ vim slaves
#把localhost更改为自己设置的主机名
8、格式化HDFS
[hadoop@xinxing001 hadoop]$ hdfs namenode -format
如果显示没有该命令,请配置hadoop的环境变量后再执行
[hadoop@xinxingdata hadoop]$ vim ~/.bashrc
#hadoop
HADOOP_HOME=/home/hadoop/app/hadoop
PATH=$PATH:$HADOOP_HOME/bin/
export HADOOP_HOME PATH
[hadoop@xinxingdata hadoop]$ source ~/.bashrc
9、启动服务
[hadoop@xinxing001 /]$ cd /home/hadoop/app/hadoop/sbin
[hadoop@xinxing001 sbin]$ ./start-dfs.sh
OpenWeb http://172.18.12.252:50070/
10、测试HDFS
创建文件夹
[hadoop@xinxing001 sbin]$ hdfs dfs -mkdir /wordcount
20/05/12 11:23:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@xinxing001 sbin]$ hdfs dfs -mkdir /wordcount/input
20/05/12 11:24:00 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@xinxing001 sbin]$
上传文件到hdfs
[hadoop@xinxing001 sbin]$ hdfs dfs -put /home/hadoop/app/hadoop/etc/hadoop/*.xml /wordcount/input
20/05/12 11:24:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@xinxing001 sbin]$
词频统计
[hadoop@xinxing001 /]$ hadoop jar /home/hadoop/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.16.2.jar grep /wordcount/input /wordcount/output 'dfs[a-z.]+'
[hadoop@xinxing001 /]$ hdfs dfs -get /wordcount/output ~/tmp/
[hadoop@xinxing001 /]$ cd /home/hadoop/tmp/output
[hadoop@xinxing001 output]$ ll
总用量 4
-rw-r--r-- 1 hadoop hadoop 90 5月 12 11:31 part-r-00000
-rw-r--r-- 1 hadoop hadoop 0 5月 12 11:31 _SUCCESS
[hadoop@xinxing001 output]$ cat part-r-00000
2、YARN
1、修改配置文件
mapred-site.xml
[hadoop@xinxingdata ~]$ cd ~/app/hadoop/etc/hadoop/
[hadoop@xinxing001 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[hadoop@xinxing001 hadoop]$ vim mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
[hadoop@xinxing001 hadoop]$ vim yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>xinxing001:18088</value>
</property>
此处修改默认端口:由于yarn端口存在远程执行漏洞,防止被当做肉鸡执行矿力运算
2、启动yarn服务
[hadoop@xinxing001 /]$ cd /home/hadoop/app/hadoop/sbin
[hadoop@xinxing001 sbin]$ ./start-yarn.sh
open web: http://172.18.12.252:18088
3、测试YARN-词频统计
创建几个文件并输入内容
上传至hdfs
[hadoop@xinxing001 ~]$ hdfs dfs -mkdir /wordcount2
20/05/12 11:56:38 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@xinxing001 ~]$ hdfs dfs -mkdir /wordcount2/input
20/05/12 11:56:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@xinxing001 testcount]$ hdfs dfs -put * /wordcount2/input
20/05/12 12:01:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@xinxing001 testcount]$ hadoop jar \
~/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.16.2.jar \
wordcount /wordcount2/input /wordcount2/output
[hadoop@xinxing001 testcount]$ hdfs dfs -get /wordcount2/output/ ./
20/05/12 12:03:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@xinxing001 testcount]$ cd output/
[hadoop@xinxing001 output]$ ls
part-r-00000 _SUCCESS
[hadoop@xinxing001 output]$ cat part-r-00000
[hadoop@xinxing001 output]$
引申:
1、mapreduce中split(map)的个数是由什么影响的
2、reduce由什么决定
-
在map阶段读取数据前,FileInputFormat会将输入文件分割成spilt,而spilt的个数决定了map的个数。
- 文件的大小。比如,当文件大于128M(block默认值)而小于256M时,文件会被划分成两个spilt。
- 文件的个数。FileInputFormat按文件进行分割,如果单个文件大于128M会被划分为多个spilt,反之,如果单个文件小于128M,FileInputFormat会把小文件单独划分成一个spilt。
- splitsize的大小。分片是按照splitsize的大小进行的,默认情况下,splitsize的大小等同于hdfs的block大小。但可以通过参数调节。
-
reduece的数量
- reduce在运行时往往需要从相关map端复制数据到reduce节点来处理,因此相比于map任务。reduce节点资源是相对比较缺少的,同时相对运行较慢,正确的reduce任务的个数应该是0.95或者1.75 *(节点数 ×mapred.tasktracker.tasks.maximum参数值)。