目录
Hadoop简介
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
Hadoop的架构
在其核心,Hadoop主要有两个层次,即:
- 加工/计算层(MapReduce),以及
- 存储层(Hadoop分布式文件系统)。
MapReduce
MapReduce是一种并行编程模型,用于编写普通硬件的设计,谷歌对大量数据的高效处理(多TB数据集)的分布式应用在大型集群(数千个节点)以及可靠的容错方式。 MapReduce程序可在Apache的开源框架Hadoop上运行。
Hadoop分布式文件系统
Hadoop分布式文件系统(HDFS)是基于谷歌文件系统(GFS),并提供了一个设计在普通硬件上运行的分布式文件系统。它与现有的分布式文件系统有许多相似之处。来自其他分布式文件系统的差别是显著。它高度容错并设计成部署在低成本的硬件。提供了高吞吐量的应用数据访问,并且适用于具有大数据集的应用程序。
除了上面提到的两个核心组件,Hadoop的框架还包括以下两个模块:
-
Hadoop通用:这是Java库和其他Hadoop组件所需的实用工具。
-
Hadoop YARN :这是作业调度和集群资源管理的框架.
Hadoop如何工作?
建立重配置,处理大规模处理服务器这是相当昂贵的,但是作为替代,可以联系许多普通电脑采用单CPU在一起,作为一个单一功能的分布式系统,实际上,集群机可以平行读取数据集,并提供一个高得多的吞吐量。此外,这样便宜不到一个高端服务器价格。因此使用Hadoop跨越集群和低成本的机器上运行是一个不错不选择。
Hadoop运行整个计算机集群代码。这个过程包括以下核心任务由 Hadoop 执行:
- 数据最初分为目录和文件。文件分为128M和64M(128M最好)统一大小块。
- 然后这些文件被分布在不同的群集节点,以便进一步处理。
- HDFS,本地文件系统的顶端﹑监管处理。
- 块复制处理硬件故障。
- 检查代码已成功执行。
- 执行发生映射之间,减少阶段的排序。
- 发送排序的数据到某一计算机。
- 为每个作业编写的调试日志。
Hadoop的优点
-
高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
-
高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
-
高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
-
高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
-
低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。
Hadoop集群搭建
1个master,2个slaver
3个节点的IP地址及角色
节点主机名 | IP地址 | 角色 |
lb01 | 192.168.231.141 | namenode节点 |
web01 | 192.168.231.142 | datanode节点 |
web02 | 192.168.231.143 | datanode节点 |
注意:本机节点主机名可以修改为master,slaver01,slaver02,好辨识一些,当然,下边修改配置文件时,也要进行替换。
1.创建hadoop用户及用户组
[root@lb01 ~]# groupadd hadoop
[root@lb01 ~]# useradd -g hadoop hadoop
[root@lb01 ~]# passwd hadoop
Changing password for user hadoop.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
再创建一个hadoop用户一是为了怕不熟悉的人误操而损坏操作系统核心内容
二是为了方便同一个组的用户可以共享hadoop集群
上传hadoop和jdk压缩包到/usr /local目录下
[root@lb01 local]# ls
hadoop-2.7.7.tar.gz jdk-8u191-linux-x64.tar.gz
进行解压:
[root@lb01 local]# tar xf hadoop-2.7.7.tar.gz
[root@lb01 local]# tar xf jdk-8u191-linux-x64.tar.gz
[root@lb01 local]# mv hadoop-2.7.7 /home/hadoop/hadoop2.7
[root@lb01 local]# mv jdk1.8.0_191 /home/hadoop/jdk1.8
修改权限
[root@lb01 hadoop]# chown -R hadoop.hadoop hadoop2.7/
[root@lb01 hadoop]# chown -R hadoop.hadoop jdk1.8/
导入JAVA环境
[root@lb01 local]# vim /etc/profile
export JAVA_HOME=/home/hadoop/jdk1.8
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=.:$JAVA_HOME/bin:$PATH
使配置立即生效
[root@lb01 local]# source /etc/profile
查看JAVA是否安装成功
[root@lb01 lib]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
导入hadoop环境
export JAVA_HOME=/home/hadoop/jdk1.8
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export HADOOP_HOME=/home/hadoop/hadoop2.7
export PATH=.:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
使用hadoop命令,查看hadoop是否安装成功,若出现如下内容,则说明安装成功
[root@lb01 local]# hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
CLASSNAME run the class named CLASSNAME
or
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
note: please use "yarn jar" to launch
YARN applications, not this command.
checknative [-a|-h] check native hadoop and compression libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath prints the class path needed to get the
credential interact with credential providers
Hadoop jar and the required libraries
daemonlog get/set the log level for each daemon
trace view and modify Hadoop tracing settings
Most commands print help when invoked w/o parameters.
修改hadoop2.7的配置文件:
1、配置/home/hadoop/hadoop2.7/etc/hadoop目录中的hadoop-env.sh、yarn-env.sh、mapred-env.sh的JAVA_HOME值,向文件中添加:
[hadoop@lb01 hadoop]$ vim hadoop-env.sh
[hadoop@lb01 hadoop]$ vim yarn-env.sh
[hadoop@lb01 hadoop]$ vim mapred-env.sh
export JAVA_HOME=/home/hadoop/jdk1.8
2、配置/home/hadoop/hadoop2.7/etc/hadoop下的slavers,这个文件中保存了所有slaver节点:
把其中的localhost删除了,添加slave节点
[hadoop@lb01 hadoop]$ vim slaves
web01
web02
添加后,向/etc/hosts中添加主机名解析
192.168.231.142 web01
192.168.231.143 web02
192.168.231.141 lb01
3、配置core-site.xml文件:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/hadoop2.7/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://lb01:9000</value>
</property>
</configuration>
4、配置hdfs-site.xml文件:
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hadoop2.7/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hadoop2.7/hdfs/data</value>
</property>
<property>
#设置HDFS存储文件的副本数
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>lb01:50090</value>
</property>
</configuration>
5、配置mapred-site.xml
[hadoop@lb01 hadoop]$ mv mapred-site.xml.template mapred-site.xml
[hadoop@lb01 hadoop]$ vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>lb01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>lb01:19888</value>
</property>
</configuration>
6、配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.acl.enable</name>
<value>false</value>
</property>
<property>
<name>yarn.admin.acl</name>
<value>*</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>false</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>lb01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>lb01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>lb01:8035</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>lb01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>lb01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>lb01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
修改完配置之后,向/etc/hosts文件中添加解析(三台主机都进行添加):
192.168.231.160 MASTER
192.168.231.161 SLAVER01
192.168.231.162 SLAVER02
SSH免密码登录
hadoop集群交互时,要进行输入密码,很麻烦,而用SSH提供公钥登录,就会省去输入密码的步骤,下面进行配置SSH免密码登录:
生成秘钥和公钥:
[hadoop@lb01 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
32:63:b7:b0:db:80:29:59:aa:7d:4d:11:d7:00:fb:5d hadoop@lb01
The key's randomart image is:
+--[ RSA 2048]----+
| ...o |
| ... . |
| .o E |
| .. . . |
| . *.S . |
| + +.B . |
| + ooo . |
| o .. .+ |
|. .. . . |
+-----------------+
[hadoop@lb01 ~]$ cd .ssh/
[hadoop@lb01 .ssh]$ ls
id_rsa id_rsa.pub
然后把公钥分配给slave节点:
[hadoop@lb01 ~]$ ssh-copy-id -i .ssh/id_rsa.pub hadoop@web01
[hadoop@lb01 ~]$ ssh-copy-id -i .ssh/id_rsa.pub hadoop@web02
测试:
[hadoop@lb01 ~]$ ssh web01
Last login: Thu Nov 8 23:11:56 2018 from 192.168.231.141
[hadoop@web01 ~]$
配置两个从节点
将主节点的hadoop2.7和jdk1.8复制到两个从节点(web01,web02,已添加hadoop用户,传完之后,修改属主,属组):
[hadoop@lb01 ~]$ scp -r hadoop2.7/ hadoop@web01:/home/hadoop
[hadoop@lb01 ~]$ scp -r jdk1.8/ hadoop@web01:/home/hadoop
[hadoop@lb01 ~]$ scp -r hadoop2.7/ hadoop@web02:/home/hadoop
[hadoop@lb01 ~]$ scp -r jdk1.8/ hadoop@web02:/home/hadoop
两个从节点都进行chown -R hadoop.hadoop hadoop2.7/
chown -R hadoop.hadoop jdk1.8/
传输完之后,添加java和hadoop的安装环境(root用户进行添加,并进行hadoop命令测试),参考上边
格式化hadoop
[hadoop@lb01 ~]$ hdfs namenode -format
18/11/08 23:23:21 INFO util.ExitUtil: Exiting with status 0
出现 status 0 时为正确
用jps查看已启动的hadoop进程
[hadoop@lb01 ~]$ jps
12884 ResourceManager
13141 Jps
12535 NameNode
12734 SecondaryNameNode
[hadoop@web01 ~]$ jps
8949 DataNode
9175 Jps
9051 NodeManager
[hadoop@web02 ~]$ jps
8949 DataNode
9175 Jps
9051 NodeManager
这样一个简单的Hadoop集群就搭建完成了。