IT技术互动交流平台

Hadoop那些事儿(一)–Hadoop初探

来源:IT165收集  发布日期:2016-12-26 20:23:16

前言

Hadoop是什么?
用百科上的话说:“Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。”
可能有些抽象,这个问题可以在一步步学习Hadoop的各种知识以后再回过头来重新看待。

Hadoop大家族

Hadoop不是一个单一的项目,经过10年的发展,Hadoop已经成为了一个拥有近20个产品的庞大家族。
其中最核心的包括以下9个产品,并且我们将按照下面的顺序一步步学习。

Hadoop:是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架构
Hive:基于Hadoop的一个数据仓库工具
Pig:基于Hadoop的大规模数据分析工具
Zookeeper:是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务
HBase:是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群
Mahout:基于Hadoop的机器学习和数据挖掘的一个分布式框架
Sqoop:是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Cassandra::是一套开源分布式NoSQL数据库系统
Flume:是一个分布的、可靠的、高可用的海量日志聚合的系统,可用于日志数据收集,日志数据处理,日志数据传输。


好,接下来开始正式学习Hadoop。

1 环境搭建

Hadoop安装有如下三种方式:

单机模式:安装简单,几乎不用作任何配置,但仅限于调试用途;
伪分布模式:在单节点上同时启动NameNode、DataNode、JobTracker、TaskTracker、 Secondary Namenode等5个进程,模拟分布式运行的各个节点;
完全分布式模式:正常的Hadoop集群,由多个各司其职的节点构成

接下来,我们进行伪分布式环境的搭建。

操作系统:Ubuntu 16.04 LTS
JDK: JDK1.8
Hadoop:2.6.0

S1 创建hadoop用户

首先切换到root用户

su root

创建用户,设置密码,并为其分配管理员权限

useradd -m hadoop -s /bin/bash
passwd hadoop
adduser hadoop sudo

创建成功后注销当前用户,使用hadoop用户重新登入。

S2 更新apt

后续需要使用apt进行软件的安装,在这里先更新一下apt,执行如下命令:

sudo apt-get update

S3 安装vim

安装用于修改文件的vim

sudo apt-get install vim

S4 安装SSH

安装SSH用于远程登陆控制。
ubuntu默认安装了SSH client,我们需要安装SSH server,使用如下命令:

sudo apt-get install openssh-server

使用如下命令即可登入本机

ssh localhost

S5 安装JDK

首先在官网下载jdk1.8安装包,我下载的是:
jdk-8u111-linux-x64.tar.gz
在usr/lib目录下新建jvm文件夹并授权:

cd /user/lib
sudo mkdir jvm
sudo chown hadoop ./jvm
sudo chmod -R 777 ./jvm

将下载的安装包拷贝到jvm目录下。
在jvm目录下,执行下面命令进行解压,并重命名

sudo tar zxvf jdk-8u111-linux-x64.tar.gz
sudo mv jdk1.8.0_111 java

继续在jvm目录下执行下面命令进入vim编辑器,按”I”进入编辑模式,

vim ~/.bashrc

光标移到最前面,输入下面内容(必须写到开头,写在末尾在后边会出现找不到java_home的情况):

export JAVA_HOME=/usr/lib/jvm/java
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib;${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

先按ESC键,然后按shift+zz保存退出,回到命令行模式输入下面命令使修改生效

source ~/.bashrc

这样就配置完了,可以使用下面命令验证是否安装成功。

echo ¥JAVA_HOME
java -version
$JAVA_HOME/bin/java -version

S6 安装Hadoop2

在http://mirror.bit.edu.cn/apache/hadoop/common/ 页面下载hadoop-2.6.0.tar.gz和hadoop-2.6.0.tar.gz.mds

新建hadoop文件并授权

cd /usr/local
sudo mkdir hadoop
sudo chown hadoop ./hadoop
sudo chmod -R 777 ./hadoop

将下载好的文件拷贝到该目录下
执行下面命令(我也不清楚干嘛用)

cat /usr/local/hadoop/hadoop-2.6.0.tar.gz.mds|grep 'MD5'
md5sum /usr/local/hadoop/hadoop-2.6.0.tar.gz|tr 'a-z' 'A-Z'

切换到/usr/local/hadoop目录,进行解压并重命名:

cd /usr/local/hadoop
sudo tar -zxf hadoop-2.6.0.tar.gz
sudo mv hadoop-2.6.0 hadoop2

hadoop解压后即可用,使用下面命令验证:

cd /usr/local/hadoop/hadoop2
./bin/hadoop version

S7 伪分布式配置

Hadoop的运行方式是以配置文件决定的。
文件位于/usr/local/hadoop/hadoop2/etc/hadoop/中,需要对core-site.xmlh和hdfs-site.xml文件进行修改。
先为用户授权:

cd /usr/local/hadoop
sudo chown hadoop ./hadoop2
sudo chmod -R 777 ./hadoop2

执行下面命令:

cd /usr/local/hadoop/hadoop2
gedit ./etc/hadoop/core-site.xml

修改为如下配置并保存:

<configuration>
        <property>
             <name>dfs.replication</name>
             <value>1</value>
        </property>
        <property>
             <name>dfs.namenode.name.dir</name>
             <value>file:/usr/local/hadoop/hadoop2/tmp/dfs/name</value>
        </property>
        <property>
             <name>dfs.datanode.data.dir</name>
             <value>file:/usr/local/hadoop/tmp/dfs/data</value>
        </property>
</configuration>

执行下面命令:

gedit ./etc/hadoop/hdfs-site.xml

修改为如下配置并保存:

<configuration>
        <property>
             <name>dfs.replication</name>
             <value>1</value>
        </property>
        <property>
             <name>dfs.namenode.name.dir</name>
             <value>file:/usr/local/hadoop/tmp/dfs/name</value>
        </property>
        <property>
             <name>dfs.datanode.data.dir</name>
             <value>file:/usr/local/hadoop/tmp/dfs/data</value>
        </property>
</configuration>

如果需要改为非分布式,再把修改的内容删掉即可。
执行下面命令进行namenode的格式化(hadoop2目录下执行)

./bin/hdfs namenode -format

看到Successfully formatted即为成功。
执行下面命令开去NameNodeDataNode的守护进程

./sbin/start-dfs.sh

按提示一步步操作,启动完成后使用下面命令验证:

jps

出现“NameNode”、”DataNode” 和 “SecondaryNameNode”即表示启动成功。SecondaryNameNode没有启动的话请重新启动,其他两个没有启动的话检查之前的配置。
启动成功后,浏览器地址栏输入:localhost:50070可以查看NameNode和Datanode的信息。

2 Hadoop初探

把环境搭建好,心里就踏实了,接下来先了解一些必要的理论知识。

2.1 为什么用Hadoop?

任何事物的产生都有其必然性。
从2012年开始,大数据这个词被越来越多的提及,现在我们已经进入了大数据时代。在这个信息爆炸的时代,每天产生的数据量十分庞大。而大数据也不仅仅只是说数据多,大数据有四个特点:
数据量大,类型繁多,价值密度低,速度快时效高。
根据这几个特点,我们需要一个东西,具备以下功能:
1.可以存储大量数据
2.可以快速处理大量数据
3.可以从大量数据中进行分析
于是就产生了Hadoop这个模型:
这里写图片描述
看起来就像一个系统,HDFS和MapReduce是底层,Hive,Pig,Mathout,Zookeeper,Flume,Sqoop,HBase是基于底层系统的一些软件。
所以Hadoop核心中的核心是HDFS和MapReduce。

所以说:
Hadoop就是一个用于处理大数据的计算框架,Hadoop具有分布式、可靠、可伸缩的特性。
分布式:Hadoop通过将文件和任务分配到众多的计算机节点上来提高效率。
可靠:由于是分布式的,所以其中一个或几个节点出现故障,并不会影响整个程序的运行。
可伸缩:任何一个节点的添加和删除都不会影响程序的运行。

2.2 单节点体系

实际应用中我们是使用一个有N多台计算机构成的集群(也可以使用多个创建多个虚拟机来模拟)来使用Hadoop的,如果仅仅只有一台计算机,那就失去了Hadoop存在的意义。
每台计算机,我们称之为一个节点,我们需要为每一个节点都配置Hadoop,通过上边的配置过程,我们可以知道,单节点(即每一台计算机)adoop的体系结构就像下面的图;
这里写图片描述

2.2 HDFS

HDFS全称是Hadoop Distribute file system ,即Hadoopp分布式文件系统。
现在的数据量已经达到了PB级(1PB=1024T),对于单个硬盘来说,存储这个数量级的数据具有相当大的压力。所以很自然的我们就会想到将数据切割开来,存储到多个计算机中,由此诞生了分布式文件系统。
为了实现数据的可靠性安全性,HDFS会对每份数据创建副本,默认值是3,及默认情况下一份数据存储在三个不同的节点上,由此导致HDFS具有如下特点:
1**.高度的数据冗余**:这也是没有办法的事,要提高可靠性,冗余是必不可少的。
2.适合一次写入,多次读取:由于在写入数据的时候需要为数据创建副本,所以写入的成本很高,如果涉及到了高频率的IO写入,不适合使用Hadoop
3.适合存储大文件,不适合小文件:在HDFS中存在Block的概念,Block是HDFS的存储单元,默认是64M,很多企业已经调整为128M。在存储文件时,会把大文件分割开来存储在一个个的Block块中,一个Block块只会存储一个文件。所以如果存储的小文件过多将造成大量存储空间的浪费。
4.对硬件的要求低:可以运用于廉价的商业服务器上,不需要使用性能很高但昂贵的服务器。

2.2.1 NameNode,dataNode以及secondary namenode

HDFS集群是以Master-Slave模式运行的,其实也可以像nginx中那样说成是Master-worker,一个意思。主要涉及到两种节点,一是nameNode,即Master,另一个是大量的dataNode即worker.
下图是Apache官网关于NameNode和dataNode的关系图:
这里写图片描述
NameNode只有一个,负责维护整个文件系统的元数据,这里的元数据包含每个文件、文件位置以及这些文件及其所在的DataNode内的所有数据块的内存映射。
dataNode存在于每一个节点中,负责具体的工作,包括为读写请求提供服务以及按照NameNode的指令执行数据块创建、删除和复制。
客户端(client)代表用户与namenode和datanode交互来访问整个文件系统。客户端提供了一些列的文件系统接口,因此我们在编程时,几乎无须炸ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq1wGRhdGFub2Rlus1uYW1lbm9kZaOsvLS/yc3qs8nO0sPHy/nQ6NKqtcS5psTcoaM8YnIgLz4KPHN0cm9uZz5zZWNvbmRhcnkgTmFtZU5vZGU8L3N0cm9uZz4g0qrBy73ic2Vjb25kYXJ5IE5hbWVOb2Rlo6zK18/I0OjSqs/Iwcu94m5hbWVub2RltcTI3bTtu/rWxqGjPGJyIC8+CrTTyc/NvL/J0tS/tLP2o6zSu7j2SGFkb29wvK/IutbQ1rvSqtK7uPZuYW1lTm9kZSzSu7WpbmFtZW5vZGWz9s/WucrVz6Os1fu49ryvyLq9q7vhzLG7vqOsy/nS1G5hbWVub2RlsdjQ69Kq09DBvLrDtcTI3bTtu/rWxqGjPGJyIC8+CrXa0rvW1re9yr3Kx9S2s8yxuLfdo7q8tNTabmFtZW5vZGW9q8r9vt3QtMjrtMXFzMqxo6zNrLK91NrSu7j21LazzLf+zvHG98nPtLS9qMr9vt21xLixsb6hozxiciAvPgq12rb+1ta3vcq9ysfKudPDuKjW+m5hbWVub2RlvLRzZWNvbmRhcnkgbmFtZW5vZGU6IMrXz8jO0sPH0OjSqtaqtcC1xMrHbmFtZW5vZGW9q8r9vt2xo7Tm1NrBy05hbWVzcGFjZb61z/G6zbLZ1/fI1da+1tCjrHNlY29uZGFyeSBuYW1lbm9kZbXE1vfSqtf308PKx72r1eLBvbj2zsS8/raoxtq9+NDQus+yoqGjPGJyIC8+CrWrysfTydPayse2qMba1rTQ0KOsc2Vjb25kYXJ5bmFtZbKisrvE3Mq1yrHNrLK91vduYW1lbm9kZbXEyv2+3aOsy/nS1NK7taluYW1lbm9kZbnStfSjrLK7v8mx3MPitcS74dTss8nK/b7dtqrKp6Osy/nS1M7Izde1xLe9yr2+zcrHveG6z8G91ta3vbeoo6y1sdb3bmFtZW5vZGXltLX0yrGjrL2rc2Vjb25kYXJ5IG5hbWVub2RltcTK/b7dv72xtLW9c2Vjb25kYXJ5IG5hbWVub2Rlo6zIu7rz1NnIw3NlY29uZGFyeW5hbWVub2Rls+S1sW5hbWVub2RltcTX99PDoaM8L3A+CjxoNCBpZD0="23-mapreduce">2.3 MapReduce

MapReduce是Hadoop的分布式计算框架,现在我们只做初步的了解。
MapReduce=Map+Reduce,即MapReduce分为Map的过程和Reduce的过程。这两个刚才都是需要我们通过程序来控制的。
先看下面这张图:
这里写图片描述
这张图是在网上找的。
如上图所示就是MapReduce处理的一个完整的过程。
Input:最左边是输入的过程,输入了图示的数据。
Split分片:mapreduce会根据输入的文件计算分片,每个分片对应与一个map任务。而分片的过程和HDFS密切相关,比如HDFS的一个block大小为64M,我们输入的三个文件分比为10M,65M,128M,这样的话第一个文件生成一个10M的分片,第二个文件生成一个64M的分片和一个1M的分片,第三个文件生生成两个64M的分片,这样的话就会一共生成5个分片。
Map:map阶段是由编程人员通过代码来控制的,图中所示的大概内容就是将字符串分割开来,作通ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq8/LTmtKLU2m1hcNbQo6zWtbXEzrvWw7TmtKIxo6yx7cq+yv3Bv6GjPGJyIC8+CjxzdHJvbmc+c2h1ZmZsZc+0xcY8L3N0cm9uZz6jus+0xca917bOo6zTydPa1q7HsMn6s8ltYXDW0LTm1Nq63LbgvPzP4M2stcRtYXCjrNTaz7TFxr3Xts69q7z8z+DNrLXEvfjQ0LrPsqKhozxiciAvPgo8c3Ryb25nPlJlZHVjZTwvc3Ryb25nPqO6cmVkdWNlvde2ztKyysfT0L+qt6LIy9Sxzai5/bT6wuu/2NbGo6yxvsD91tDKx72rvPzP4M2stcRtYXC1xHZhbHVl1rW9+NDQx/O6zaOstcOz9tfu1tW1xG1hcDxiciAvPgrV4tH51+6688rks/a1xMr9vt2+zcrHw7+49tfWt/u0rrP2z9a1xLTOyv2hozwvcD4KPGgzIGlkPQ=="总结">总结

写到这里,这篇文章就基本上告一段落了,这篇文章主要包含两个内容:
1.在Ubuntu环境搭建伪分布式Hadoop环境。
2.关于Hadoop的一些简单的必要的理论知识,主要是HDFS和MapReduce.
【如有不当的地方,希望各位不吝指出】

Tag标签: 事儿  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规