Hadoop介绍
Hadoop
是一个开源的、可靠的、可扩展的系统架构,可利用分布式架构来存储海量数据,以及实现分布式的计算。Doug Cutting
是创始人,同时也联合开发了Lucence
、Nutch
。
Hadoop作用简概
- 存储海量数据。
- 计算海量数据。
nutch到Hadoop的发展
nutch
是Apache
的一个搜索引擎。搜索引擎必然离不开爬虫,爬虫分为聚焦爬虫和通用爬虫。而爬虫得来的数据是没有结构的,存储到传统的关系型数据库中必然不可行。后来Cutting
基于Google的一篇论文《Google File System》设计了NDFS
。
并在nutch
0.8之后,将NDFS
模块独立出来,重命名Hadoop
。
Hadoop包含1. HDFS (Hadoop Distributed File System)存储模块。2. MapReduce,基于Google《Google MapReduce》文章开发。
2008年Cutting
带着Hadoop
去了Yahoo
,在Yahoo
供职期间,又创立了Hive pig
、Hbase
。
后来又贡献给了Aapche
。
Hadoop简单架构
Flume
收集web
中的数据,并存储到HDFS
(hadoop分布式文件存储系统),通过MapReduce
计算海量数据。选择将数据存储到Mysql
,Hbase
。Hbase
可以做到低延迟的查询。
如下图:
Hadoop在国内的应用
- 百度使用
Hadoop
构建数据处理平台,Hadoop
集群节点数超过20000
个,每天处理数据量可达到20PB
(1)做网页内容的分析处理。
(2)做用户访问行为的分析处理,可以借此建立用户画像。(根据用户定向推送)。
(3)用户推荐系统的数据分析和处理。
(4)在线广告的点击分析和流量分析。可以分析出用户的点击热力图,按照用户的点击位置来重新规划页面。
(5)定向推送广告。根据地区、爱好。
- 淘宝在
2008
年用Hadoop
构建了数据平台,做商铺信息的存储,商品信息、用户信息、交易信息。
Hadoop版本介绍
1.0
时,只包含存数据的HDFS
和算数据的MapReduce
。在2.0
时,又加入了YARN
和Others
。
Yarn
是资源调度框架,实现了对资源的细粒度封装,引入Yarn
之后,Hadoop
的计算框架不只是MapReduce
,还可以引入Spark
等等。
文件存储方法
对于大文件存储,传统上,大致分为两种方式。
纵向扩展
在一台服务器做硬件的扩展,比如加内存条,搭磁盘阵列,这种扩展方式有上限,硬件瓶颈。
横向扩展
用分布式思想,即多台机器来处理,先将文件切块,然后各个机器分别存储。切块存储是分布式文件系统存储的特点。
hadoop
的hdfs
即是按照这种方式存储的。
hadoop分布式存储的结构
hadoop分为两种节点
namenode
: 首先,管理整个分布式文件系统的元数据信息,比如文件名,文件多大,文件被切成几块,每个块多大,每个块的存储位置,块id等;此外,通过RPC心跳机制(datanode发来的数据包),来监测datanode节点的状态。datanode
:存储分块的文件。向namenode
发送心跳数据包,与namenode
交互,并接收客户端的数据上传
、下载
请求等。
为了实现数据存储的可靠性,引入副本冗余机制,副本数量不易过多,因为副本数量越多,整个集群的磁盘利用率越低。一般有三个副本。
datanode
在分块存储时,多个副本的存在,以及存储在不同机架上,可以保证在某个节点挂掉以后系统的稳定性。
namenode
作为管理者,也需要有备份,通过zookeeper集群监听namenode
的状态,一旦namenode
挂掉后,它对应的临时节点也会删掉,zookeeper集群马上就会重新选举出一个leader
,让整个分布式文件系统的集群正常运行。
HDFS
之所以能够存储海量数据,原因是它是一个分布式的可扩展的架构,而且是可靠的。
Hadoop安装配置
1、关闭防火墙
如果是centos 6.x
,则输入service iptables stop
。如果是centos 7.x
,则输入systemctl stop filewall.service
。
2、配置主机名
临时生效
通过hostname
查看主机名,如果为localhost
需要更改。可以临时设置,直接输入hostname hadoop1
即可。
永久生效
永久生效,需要首先,找到etc/sysconfig/network
,将HOSTNAME
改名。如下:
NETWORKING=yes
HOSTNAME=hadoop1
NOZEROCONF=yes
然后,找到etc/hosts
文件中,配置hadoop
集群节点的别名,留下类似的如下内容,其中192.168.1.4
为当前机器的内网
ip,即通过ifconfig
看到的ip地址即可:
127.0.0.1 localhost
::1 localhost
192.168.1.4 hadoop1
192.168.1.5 hadoop2
192.168.1.6 hadoop3
如果是centos 7
,还要修改/etc/hostname
文件中,改成hadoop1
,即主机名。
上述配置,曾经在自己阿里云ESC服务器上
配置成了外网ip时,namenode
没有启动成功。后来改成了阿里云的内网ip
才成功。
如果为伪分布式,那只会有一个,即当前机器的ip
和别名
,然后保存退出。
最后重启机器,有人说是重启网卡,貌似我重启网卡无效。reboot
即可。
3、设置免密登录
输入ssh-keygen
然后一直回车。
输入ssh-copy-id root@hadoop1
将密码发送给自己,首次发送需要密码验证,验证成功后,可以使用ssh
不需要密码登录服务器了。
4、配置jdk环境
hadoop
运行需要jdk环境,需要配置jdk,下载下jdk包后解压,配置etc/profile
文件环境变量如下:
JAVA_HOME=/home/software/jdk1.8
CLASSPATH=.
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH CLASSPATH
5、 配置hadoop环境变量
由于执行hadoop
环境变量必须要在bin
或者sbin
目录下,为了在任意目录下都可以执行hadoop
命令,需要配置hadoop
环境变量到系统中。
再找到/etc/profile
文件,补充HADOOP_HOME
,具体如下内容:
JAVA_HOME=/home/software/jdk1.8
HADOOP_HOME=/home/software/hadoop-2.7.1
CLASSPATH=.
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export JAVA_HOME PATH CLASSPATH HADOOP_HOME
配置完之后,执行source /etc/profile
,使之生效。
6、配置hadoop
下载hadoop-2.7.1
并解压,bin
和sbin
为hadoop
的命令,lib
和share
为安装包,etc/hadoop
为配置文件。
进入 etc/hadoop
文件中,输入vim hadoop-env.sh
,进入文件,修改JAVA_HOME
路径,将该路径指向自己服务器jdk
安装目录,配置如下:
export JAVA_HOME=/home/software/jdk1.8
同样在该文件中,修改HADOOP_CONF_DIR
指向hadoop
的安装包路径即可。配置完成后,保存退出。,配置如下:
HADOOP_CONF_DIR=/home/software/hadoop-2.7.1/etc/hadoop
注意以上配置,必须要写明具体的路径,比如原本里边的$JAVA_HOME
,是读不到这个环境变量的。配置完之后执行下边的命令,使配置文件生效
source hadoop-env.sh
然后vim core-site.xml
,在<configration>
标签内加入如下内容:
<!--指定namenode服务器的ip地址和通信端口-->
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop1:9000</value>
</property>
<!--指定namenode存放元数据的目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/software/hadoop-2.7.1/tmp</value>
</property>
添加完之后,保存退出,注意上边的hdfs://hadoop1:9000
,hadoop1
即是前边配置的主机名,这里是hdfs
的配置端口。
然后vim hdfs-site.xml
,还是找到<configration>
标签内加入如下内容:
<!--用于配置副本数量,如果是伪分布式配置1,如果是真实分布式配置3-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
如果伪分布式,必须设置为1,否则会造成进入安全模式,一直无法结束,而且也没有意义,设置成多个副本。
配置完之后保存退出,以上配置的core-site.xml
和hdfs-site.xml
相当于在配置namenode
。
然后输入vim slaves
,slaves
配置的是创建块的机器,即工作的节点,当为集群时,添加多个,但是如果为1个节点伪分布式配置,那就添加1个即可,添加如下内容:
hadoop1
因为当前为伪分布式,只有一台机器,即配置一个。
&emsp: 再找到mapred-site.xml.template
文件,然后将其重命名为mapred-site.xml
,并打开,添加如下内容:
<!--指定mapreduce运行在yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
&emsp: 最后,再打开yarn-site.xml
配置文件,并添加如下内容:
<!--指定yarn的老大 resoucemanager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<!--NodeManager获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
然后回到bin
目录下,输入如下命令格式化hadoop
,当为新配置的hadoop
集群时需要格式化集群。
sh hadoop namenode -format
如果出现successfully formatted
字样,表示格式化成功。
格式化后会看到tmp
文件夹多出了一个dfs
文件夹。如果没出现dfs
文件夹说明配置有问题。
7、hadoop
启动命令
启动命令在sbin
目录下,进入sbin
目录,输入如下命令启动hadoop
,首次启动时会提示,输入yes
即可:
sh start-all.sh
如果前边已经配置了HADOOP_HOME
,并且也source
了,那可以在任意路径下直接输入执行start-all.sh
命令即可。
多补充一句,有些说是启动start-dfs.sh
命令,它和start-all.sh
是有区别的,前者仅仅启动三个,即namenode
、datanode
、SecondaryNameNode
。后者是启动连yarn
、mapreduce
一起启动的。
启动日志打印完之后,输入jps
,如果出现下面标识的进程,则表示启动成功:
28128 ResourceManager
27970 SecondaryNameNode
28456 Jps
27822 DataNode
27694 NameNode
28223 NodeManager
启动成功后,通过浏览器访问http://192.168.1.4:50070
也能访问到hadoop
页面。
上述启动命令是把所有hdfs
相关的都启动了,如果想单独启动可以采用下边的命令。
hadoop-daemon.sh start namenode //启动namenode
hadoop-daemon.sh start datanode //启动datanode
hadoop-daemon.sh start secondarynamenode //启动secondarynamenode
如果启动失败则需要把tmp文件夹删掉,重新建一下,然后格式化。注意格式化命令不能随便执行。会清掉元数据。
8、hadoop
关闭命令
同样在sbin
目录下,输入如下命令,如果已经配置了HADOOP_HOME
,则可以在任意路径下直接执行stop-dfs.sh
即可。:
sh stop-dfs.sh
如果想单独关闭某个可以使用下边这个命令:
hadoop-daemon.sh stop namenode|datanode|secondarynamenode
当然一般使用最简单的kill -9
杀死进程了,先jps
看进程号,然后再kill -9
9、启动失败处理步骤
启动过程中,会打印部分日志,其中包含日志文件的位置,还有抛出的异常,如果异常没有,则到日志文件中找日志,查看异常。
如果日志和异常都没有,那首先停掉hadoop
,然后找到上边配置的tmp
文件夹,先查看tmp
文件夹中是否有东西,如果它下边连dfs
文件夹都没有,说明可能是hadoop-env.sh
和core-site.xml
文件中配置有问题,查看一下;如果tmp
中有内容,则将其删掉,然后再重新建一个该文件。
最后回到bin
目录下,输入格式化hadoop
命令,即:
sh hadoop namenode -format
如果不报错,则重新启动hadoop
启动脚本。