Hadoop学习及安装记录

一、 简单Hadoop的介绍

Hadoop的出现是源于Google大数据技术(采用普通PC即可完成一些小型机、大型机甚至是超级计算机完成的大数据处理技术)的模拟,Google的这项技术没有开源,而Hadoop是Apach旗下开源项目,主要用于分布式存储和分布式计算,可以用于搭建大型数据仓库,PB级数据的存储、处理、分析、统计等(搜索引擎、日志分析、数据挖掘、商业智能),在Hadoop中,有两个核心组成:
1. HDFS:分布式文件系统,存储海量数据
2. MapReduce:并行处理框架,实现任务分解和调度

Hadoop的优势主要有:
1. 高扩展:理论上可以做到无限,在Hadoop设计的框架下面增加一些硬件可以使它的性能和容量得到提升;
2. 低成本:借鉴于谷歌的思想,Hadoop不依赖于高端硬件,普通的PC就可以实现,通过软件的容错性来保证系统的可靠性;
3. 成熟的生态圈:得益于开源力量,Hadoop有很多周边的工具(所谓的生态圈就是指为了使Hadoop能够更加高效的运行而衍生出来的一系列工具),比如HIVE、HABSE、zookeeper等

二、 Hadoop的安装

之前3.0搞出各种问题,这里先记录一下hadoop2.5.1的安装过程,jdk为1.70u71版本,这里最好直接以root用户直接配置,我折腾了好久用的非root用户配置,特别麻烦!

1.Linux环境下的基本准备

所有的压缩包在/home/zkpk/Downloads/目录下

我本地虚拟机两个CentOS7.5,在配置好基本的配置后安装克隆即可,首先为两个虚拟机创建host:

vim /etc/hosts

# 追加主机和从机的别名和ip
192.xxx.xx.xxx master
192.xxx.xx.xxx slave

jdk和hadoop压缩包的位置:/home/jacksonary/resources/software/,JDK的解压目录为:/usr/java/jdk1.7.0_71,hadoop的解压缩目录为:/opt/hadoop-3.0.0,解压之后需要对环境变量进行设置:

1.jdk的环境配置
注意3.0版本是需要1.8版本的JDK作支撑,所以要安装1.8版本,如果是8以下的版本跑里面的example的时候将会报版本不一致的错误。

# 编译环境变量,当然这也可以配置为某个用户的环境变量:vim /home/zkpk/.bash_profile 
vim /etc/profile

# 在上述文件中添加下面的环境变量
export JAVA_HOME=/usr/java/jdk1.7.0_71
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

# 使环境变量生效
source /etc/profile

# 测试
java -version

2.关闭防火墙和配置主机名
直接关闭即可

setup 

# 选中Firewall configuration,然后Run Tool,如果前面有*号
# 那么按一下空格键然后OK、Yes即可

注意如果这一步有问题,转
http://blog.csdn.net/jacksonary/article/details/79069080第9点;

配置主节点和从节点的主机名为master和slave

vim /etc/sysconfig/network

# 增加如下内容,主节点为master,从节点为slave,自行更改
# start network
NETWORKING=yes
# setting hostname
HOSTNAME=master

# 配置及时生效,上述是要重启的但是是永久修改,下面的命令只是及时修改但会及时生效,两者配合即可永久修改并及时生效
hostname master # 从节点就是改为slave

最后配置一下hosts列表

vim /etc/hosts

# 添加主节点和从节点,IP+host的形式,主、从节点都要配置
# setting hosts
192.168.83.130 master
192.168.83.131 slave

3.免密登录
主要步骤如下,我这里是针对的zkpk用户,所以都是切回这个用户操作的su zkpk

# 生成密钥,一路点回车即可,目录在/root/.ssh/目录下面,如果是针对某个用户就在对用的/home/zkpk/.ssh/目录下
ssh-keygen -t rsa

# 进入.ssh目录复制公钥文件
cp -a id_rsa.pub authorized_keys

# 修改权限
chmod 600 authorized_keys

# 将密钥复制到从节点的用户目录下/home/zkpk/
scp ~/.ssh/authorized_keys zkpk@slave:~/

上面是主节点的配置过程,从节点配置如下:

# 生成密钥
ssh-keygen -t rsa

# 将主节点复制过来的密钥移至用户的.ssh目录下
mv authorized_keys ~/.ssh/

# 更改权限
chmod 600 authorized_keys

好了,最后验证一下,主节点下

# 如果可以免密登录说明成功,否则返回检查
ssh slave

【注意】这里主节点起的作用主要是对从节点的管理,所以在主节点下可以对各个从节点进行免密登录,而反过来就不行了

4.hadoop环境配置
一下所有的配置文件都在hadoop-3.0.0/etc/hadoop目录下,主要有如下的几个文件需要配置:
hadoop-env.sh;
yarn-env.sh;
core-site.xml;
hdfs-site.xml;
yarn-site.xml;
mapred-site.xml;

好了,开始吧,
1.对hadoop-env.sh文件添加jdk的环境

vim /opt/hadoop-3.0.0/etc/hadoop/hadoop-env.sh

# 添加jdk的路径
export JAVA_HOME=/usr/java/jdk1.7.0_71/

2.对yarn-env.sh追加jdk的路径

vim yarn-env.sh

# 文件里有相关jdk的配置,去掉注释符号,略微修改即可
export JAVA_HOME=/usr/java/jdk1.7.0_71/

3.配置hadoop的核心配置文件core-site.xml

# 在configuration标签下添加如下内容
    <!--配置name的目录-->
    <property>
        <name>hadoop.temp.dir</name>
        <value>/home/zkpk/hadoopdata</value>
    </property>

    <!--配置访问端口-->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:9000</value>
        </property>

4.配置hdfs-site.xml文件:

vim hdfs-site.xml

# 添加如下配置
<!--配置副本数量,默认为3-->
<property>
      <name>dfs.replication</name>
      <value>1</value>
</property>

5.配置yarn-site.xml

vim yarn-site.xml

# 主要添加如下配置
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

<property>
        <name>yarn.resourcemanager.address</name>
        <value>master:18040</value>
</property>

<property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:18030</value>
</property>

<property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:18025</value>
</property>

<property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:18141</value>
</property>

<property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:18088</value>
</property>

6.配置计算框架mapred-site.xml
主要这个版本是存在mapred-site.xml.template文件,先要复制一份命名为mapred-site.xml再修改

vim mapred-site.xml

# 主要添加如下配置
<property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
</property>

最后呢,要把从节点都放到slave文件中并且删除原有内容:

vim slave 

# 删除原有内容再添加
slave

好了最好扫尾工作,将主节点的hadoop直接复制一份到各个从节点:

scp hadoop-2.5.2 zkpk@slave:/usr/

然后配置hadoop的环境变量(主从节点都要配置):

# setting env and path
export JAVA_HOME=/usr/java/jdk1.7.0_71/
export HADOOP_HOME=/usr/hadoop-2.5.1

PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export PATH

创建数据目录(主从节点):

mkdir /home/zkpk/hadoopdata

最后加验证一下吧(主节点操作):

# 格式化文件系统,注意看退出状态码为0即可
hdfs namenode -format

# 启动hadoop
/usr/hadoop-2.5.1/sbin/start-all.sh 

# 一路yes,有密码输密码即可

【注】在启动的时候发现有一个警告消息,说不能载入本地库,Unable to load native-hadoop library for your platform…如下:

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

这个问题后来在部署Spark的时候也遇见同样的警告,主要由于依赖的java环境中缺少两个文件:libhadoop.so和libsnappy.so,前者可以在hadoop根目录下的lib\native中找到,将这个文件复制到$JAVA_HOME/jre/lib/amd64即可,后者需要下载snappy-1.1.0.tar.gz,然后./configure,make编译出来,编译成功之后在.libs文件夹下,同样复制到$JAVA_HOME/jre/lib/amd64目录下即可。

执行jps查看,应该有如下的4个进程,并且执行样例:

hadoop jar /usr/hadoop-2.5.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar pi 10 10

会出现下面的结果
这里写图片描述

最后最后,用WEB查看集群是否启动成功,由于防火墙已经关闭直接可以再windows上输入如下地址即可查看namenode和datanode是正常,端口号为50070:
http://master的IP:50070,出现如下界面:
这里写图片描述
检查Yarn是否正常,端口为18088,注意存活节点应该是从节点的数目1:
这里写图片描述
好啦,完成

三、理论基础

在hadoop中包含两个组成部分:hadoop的文件系统HDFS和MapReduce并行计算框架。
1.HDFS
HDFS的文件总是被切分成块(Block)进行存储,默认块的大小为64MB,就是文件来了将其拆分成块进行存储处理,在HDFS中有两类节点:NameNode和DataNode,其中NameNode是管理节点,存放元数据(元数据包含了文件与数据块的映射表以及数据块和数据节点的映射表),而DataNode是真正的工作节点,存放真正的数据块的。整体的架构如下
这里写图片描述
在HDFS的数据管理与容错方面,采取的策略是每个数据块都是存3份(即3个副本),在上图也可以看到数据块A、B、C、D、E是各有3份的,这主要是为了硬件上的容错,因为任何一个节点又有可能发生故障,为了不让数据丢失,至于它们是怎么存储的,从上面也同样可以看到,在机架1上存储了2份,在另一份机架上存储1份。另外NameNode和DataNode之间是存在心跳检测的,这里主要是指DataNode会定期向NameNode发送心跳消息。除了上述的NameNode外还有一个二级NameNode:SecondaryNameNode,它会定期同步元数据映像文件和修改日志,这个也是一种备份机制,和DataNode3个副本的机制相差不多,在NameNode正常工作的时候SecondaryNameNode不会接受任何消息,但是当NameNode发生故障挂掉后,SecondaryNameNode会进行一个同步转移变成NameNode,下面又是上述的一个轮回了,HDFS主要特点有:
1.数据冗余,硬件容错(多个备份)
2.流式的数据访问(顺序写入,一次写入,多次读取,几乎不好修改)
3.适合存储大文件,小文件使用的话NameNode的压力会比较大。

当然了,HDFS也提供了Shell接口,可以像Linux中操作,前面只要带上hadoop即可,比如:

# 格式化
hdfs namenode -format

# 查看hdfs文件夹
hadoop fs -ls /

# 在HDFS中新建input的目录
hadoop fs -mkdir input

# 往HDFS中的input中存放数据
hadoop fs -put /home/zkpk/text input/

# 查看文件是否存进去
hadoop fs -ls /user/root/input

# 查看文件具体内容
hadoop fs -cat input/text 

# 从hdfs中下载到本地
hadoop fs -get /user/root/input/text /home/zkpk/text2

# 查看HDFS的整体信息,和50070端口界面信息一致
hadoop dfsadmin -report

2.MapReduce框架
主要用于大型任务的拆分成多个小型任务(这就是map),并行执行后再合并结果(这就是Reduce),有点类似于归并排序的思想。它是一种工作流程,主要有如下的几个概念:
Job:就是最初的提交的作业,即上述的大型任务,譬如在10PB数据中找出指定数据出现的次数;
Task:一个作业会被拆分为多个Task(每个Task又分为MapTask和ReduceTask),就是上面说的小型任务;
JobTracker:也是master的管理节点,当客户端提交Job时,JobTracker将Job提交到候选队列中,在合适的时候进行调度,选择一个Job出来,然后将Job拆分为Map任务和Reduce任务分发给TaskTracker;
TaskTracker:这个是真正在做任务的东西。
在实际部署中,Tracker节点往往和HDFS中的DataNode节点部署到一起,这样可以让数据跟着计算走,可以最快读取数据
这里写图片描述
其中MapReduce的作业执行流程主要如下:
这里写图片描述
MapReduce中容错机制主要有两种:
1.重复执行
每个任务进行4次重复执行,这样一来就允许执行过程中出现一些错误。
2.推测执行
推测执行主要是指在执行过程中,有一个或几个执行的特别慢,那就再分配一个同样的任务去执行,哪个先执行结束就获取它的结果,另一个的执行慢的任务直接终止。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值