Hadoop生态圈十分庞大,最近Spark又很火热并且速度也是Hadoop的百倍级别的,曾想就只看Spark吧,后来发现还是需要从基础打起,Spark是基于内存的,其没有存储系统,需要添加第三方分布式存储,而大多数Spark项目都安装在Hadoop上,因此学习Hadoop是必然的,学习Hadoop生态圈也是必须的。
Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算.
Hadoop2.x相比较于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了很大的提高,Hadoop2中有两个重要的变更:
Hadoop1.x与Hadoop2.x在架构上是不同的,hadoop社区对这两个版本都在提供维护更新,所以Hadoop2.x的某些版本不一定比Hadoop1.x要新。
过去很多公司都在使用Hadoop1.x,目前在逐步进行Hadoop2.x的更新换代,因此在学习hadoop时,hadoop1.x的版本也是有必要去学习的。
Hadoop主要由HDFS、MapReduce、HBase组成。
HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系统。
NameNode:保存整个文件系统的目录信息、文件信息及分块信息,这是由唯一一台主机专门保存,当然这台主机如果出错,NameNode就失效了。在Hadoop2.*开始支持activity-standy模式—-如果主NameNode失效,启动备用主机运行NameNode。
DataNode:分布在廉价的计算机上,用于存储Block块文件。
Block:将一个文件进行分块,通常是64M。
SecondayNameNode:它不是NameNode的备份(但可以做备份),它的主要工作是帮助NameNode合并edits log,减少NameNode的启动时间。
edits:日志文件,记录引发元数据改变的操作。
fsimage:元数据的镜像文件,可以理解为元数据保存在磁盘上的一个副本。
SecondaryNameNode合并fimage与edits log时间:
A)根据配置文件设置的时间间隔fs.checkpoint.period默认3600秒。
B)根据配置文件设置edits log大小fs.checkpoint.size规定edits文件的最大值默认是64MB。
SecondaryNameNode合并流程:
注:
第一步:secondary namenode请求namenode停止使用edits,暂时记录在edits.new文件中
第二步:secondary namenode从namenode复制fsimage、edits到本地
第三步:secondary namenode合并fsimage、edits为fsimage.ckpt
第四步:secondary namenode发送fsimage.ckpt到namenode
第五步:namenode用新的fsimage覆盖旧的fsimage,用新的edits覆盖旧的edits
第六步:更新checkpoint时间
到这里fsimage更新完毕,即保证了primary正常服务,也完成了fsimage的更新。
注:Rack 是指机柜的意思,一个block的三个副本通常会保存到两个或者两个以上的机柜中(当然是机柜中的服务器),这样做的目的是做防灾容错,因为发生一个机柜掉电或者一个机柜的交换机挂了的概率还是蛮高的。
安装好Ubuntu后,默认是不开启root用户的,下面开启root用户:
ctrl+alt+T开启控制台
$ sudo -s #进入root用户权限模式 #在文件中开启root登录模式,在文件中添加greeter-show-manual-login=true $ sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
#修改root用户密码 $ sudo passwd root
#解压jar包到/usr/lib文件夹中 tar -zvxf jdk-8u66-linux-i586.tar.gz /usr/lib
解压后,目录为/usr/lib/jdk1.8.0_66
编辑Ubuntu环境变量文件~/.bashrc,在其中添加JAVA环境变量
我们在此安装的是hadoop1.2.1版本,根据其官方文档http://hadoop.apache.org/docs/r1.2.1/cluster_setup.html 我们完成如下操作。
$ sudo apt-get install ssh $ sudo apt-get install rsync
$ tar -zvxf hadoop-1.2.1.tar.gz $ mv hadoop-1.2.1 /usr/lib/hadoop
#查看主机名 $ hostname #或 $ uname -n #临时修改主机名 $ hostname 新主机名 #永久修改主机名,编辑文件添加入主机名 $ gedit /etc/hostname
/etc/hostname与/etc/hosts的区别 /etc/hostname中存放的是主机名,hostname文件的一个例子:
namenode/etc/hosts存放的是域名与ip的对应关系,域名与主机名没有任何关系,你可以为任何一个IP指定任意一个名字,hostname文件的一个例子:
127.0.0.1 localhost
127.0.1.1 namenode
注:上述的步骤在datanode中的节点也是一样的,就不在此在祥写了,如下图datanode的hostname、ip地址、hosts的设置。
datanode2的配置仅是IP地址不一样。
SSH免密码登录主要是为了方便集群间互相访问。
#生成免密码登录秘钥 $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
#将生成的公共秘钥拷贝到 ~/.ssh/authorized_keys目录下 $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
从图中我们可以看到,ssh localhost登录就是免密码的了,但是我们假设的是伪分布模式的集群,因此需要将此公钥拷贝到datanode节点下面。
#将namenode下生成的公共秘钥id_dsa.pub放到datanode1的/root/tool目录下 $ scp ~/.ssh/id_dsa.pub >> root@ datanode1:/root/tool
#在datanode1 /root/tool目录下的id_dsa.pub文件内容加入到~/.ssh/authorized_keys文件中 $ cat /root/tool/id_dsa.pub >> ~/.ssh/authorized_keys
我们再在root@namenode中登录datanode1,此时则不用在输入密码
修改conf/hadoop-env.sh文件,定义JAVA_HOME变量
修改conf/core-site.xml文件,配置namenode信息,修改HDFS的工作目录
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 设置namenode访问路径 --> <property> <name>fs.default.name</name> <value>hdfs://namenode:9000</value> </property> <!-- 设置HDFS工作目录,默认的工作目录会在Linux的tmp工作目录,由于Linux的tmp目录在Linux重启时会自动清空,因此需要对其进行设置 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-1.2.1</value> </property> </configuration>
修改conf/hdfs-site.xml文件,修改hadoop的文件存储副本数
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>
修改slaves文件,添加datanode节点ip
修改masters文件,添加seconderynode节点
格式化,在/usr/lib/hadoop-1.2.1/bin目录下运行下面命令
#namenode format操作是使用hadoop分布式文件系统前的步骤。如果不执行这个步骤,无法正确启动分布式文件系统。 $ ./hadoop namenode -format
启动hadoop
$ ./start-dfs.sh
下图为启动后的截图:
在datanode1虚拟机上也可看到启动的进程
hadoop启动后,我们可以通过浏览器去访问,默认hadoop的http的端口是50070,而端口9000是其ipc协议端口
停止hadoop服务
$ ./stop-dfs.sh
登录不成功的原因是因为SSH默认是只允许证书登陆的方式,所以我们需要修改/etc/ssh/sshd_config文件,开启root用户登录权限,解决方法是:
#重启SSH服务 $ sudo service ssh restart
#查询防火墙版本 $ sudo ufw version #查询防火墙状态 $ sudo ufw status #开启/关闭防火墙 $ sudo ufw enable/disable #打开或关闭某个端口 $sudo ufw allow smtp #允许所有的外部IP访问本机的25/tcp (smtp)端口 $sudo ufw allow 22/tcp #允许所有的外部IP访问本机的22/tcp (ssh)端口 $sudo ufw allow from 192.168.1.100 #允许此IP访问所有的本机端口 $sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53 $sudo ufw deny smtp #禁止外部访问smtp服务
jps(Java Virtual Machine Process Status Tool)是JDK 1.5版本及以后提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。一般可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。