Flume:日志收集工具,它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。总的来说,Flume是一个可扩展、适合复杂环境的海量日志收集系统。

Sqoop:数据同步工具,Sqoop是连接Hadoop与传统数据库之间的桥梁,它支持多种数据库,包括MySQL、DB2等;插拔式,用户可以根据需要支持新的数据库。Sqoop实质上是一个MapReduce程序,充分利用MR并行的特点,充分利用MR的容错性。

HDFS:Hadoop分布式文件系统,Hadoo的核心由HDFS(Hadoop Distributed File System)和MapReduce(分布式计算框架)构成。而在Hadoo中增加了Yarn(Yet Another Resource Negotiator),来负责集群资源的统一管理和调度。是Hadoop体系中数据存储管理的基础。它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。

Yarn:资源管理系统,Yarn是Hadoo新增的系统,负责集群的资源管理和调度,使得多种计算框架可以运行在一个集群中。

Zookeeper:分布式协作服务工具,Zookeeper解决分布式环境下数据管理问题:(1)统一命名(2)状态同步(3)集群管理(4)配置同步。

HBase:分布式列存数据库,HBase是一个针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。和传统关系数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。数据模型:Schema–>Table–>Column Family–>Column–>RowKey–>TimeStamp–>Value。

Hive:基于MR的数据仓库,Hive定义了一种类似SQL查询语言的HiveQL查询语言,除了不支持更新、索引和实物,几乎SQL的其他特征都能支持。它通常用于离线数据处理(采用MapReduce);我们可以认为Hive的HiveQL语言是MapReduce语言的翻译器,把MapReduce程序简化为HiveQL语言。但有些复杂的MapReduce程序是无法用HiveQL来描述的。Hive提供shell、JDBC/ODBC、Thrift、Web等接口。

Pig:数据仓库,已经被时代所抛弃,无需再了解。

Mahout:数据挖掘库,已经被时代所抛弃,无需再了解。

Mapreduce:分布式计算框架,笔者认为,此组件也将被Spark和Flink取代,无需花费太多精力在此上面。

2、为什么很多公司选择Hadoop作为自己的大数据平台解决方案?

  • 源码开源;
  • 社区活跃、全球参与者众多;
  • 涉及到分布式计算和存储的方方面面,从Flume开始数据采集到Spark、MR、Hive进行数据处理,再到HDFS/HBase数据存储,Hadoop生态提供了一整套的大数据解决方案。
  • 经过十几年的发展,已经得到企业界的验证。

3、分布式文件系统HDFS

架构:

HDFS具有主/从架构。HDFS集群由一个NameNode组成,它是一个主服务器,管理文件系统的名称空间和客户机对文件的访问。

此外,还有许多datanode,通常集群中的每个节点为一个datanode,它们管理附加到运行它们的节点上的存储。HDFS公开文件系统名称空间,并允许用户数据存储在文件中。在内部,文件被分割成一个或多个块(Blocks),这些块存储在一组DataNode中。NameNode执行文件系统命名空间操作,如打开、关闭和重命名文件和目录。它还决定了文件块到DataNode的映射。datanode负责为来自文件系统客户端的读写请求提供服务。datanode还根据NameNode的指令执行块创建、删除和复制操作。

概况的说:NameNode(NN)负责客户端(client)请求的响应,和元数据(文件的名称,副本系数,Blocks存放的位置)的管理;DataNode主要负责存储用户文件对应的数据块(Blocks),还要定期向NameNode发送心跳信息,汇报自己所存储的Blocks信息和自己的健康状况。

NameNode和DataNode是设计用于在商品机器(比较廉价的机器)上运行的软件。这些机器通常运行GNU/Linux操作系统(OS)。HDFS是使用Java语言构建的;任何支持Java的机器都可以运行NameNode或DataNode程序。使用高度可移植的Java语言意味着HDFS可以部署在各种各样的机器上。典型的部署方式是有一台专用的机器,它只运行NameNode进程,集群中的其他每台机器都运行一个DataNode软件实例,该架构还可以在同一台机器上运行多个datanode(伪分布式部署),但在实际部署中很少会出现这种情况。

副本机制:

HDFS支持传统的分层文件架构。用户或应用程序可以创建目录并在这些目录中存储文件。文件系统名称空间层次结构与大多数其他现有文件系统相似;可以创建和删除文件,将文件从一个目录移动到另一个目录,或者重命名文件。HDFS支持用户配额和访问权限。HDFS不支持硬链接或软链接。NameNode维护文件系统的命名空间。对文件系统名称空间或其属性的任何更改都由NameNode记录。应用程序可以指定由HDFS维护的文件的副本数量。文件的拷贝数称为该文件的复本因子,此信息由NameNode存储。

HDFS是被设计成可以在大型集群中跨机器可靠地存储非常大的文件。它将为每个文件存储为一系列的块,并且复制这些文件块以实现容错。每个文件的块大小(默认128M)和复本因子(默认为3)都是可配置的。除了最后一个块之外,文件中的所有块大小都是相同的。应用程序可以指定文件的副本数量。复本因子可以在文件创建时指定,稍后可以更改。HDFS中的文件只写一次(追加和截断除外),并且在任何时候只有一个写入器。NameNode决定了文件块的复制。它定期接收来自集群中每个数据节点的心跳和块报告,接收到心跳意味着DataNode正在正常工作,块报告包含DataNode上所有块的列表。

4、Hadoop的安装和配置

下载地址:

详细安装步骤看下面博客介绍:

1. 创建虚拟机、安装Cen操作系统(此过程省略);
2. 将虚拟机克隆三个;
3. 把克隆出来的三个虚拟机修改主机名;vi /etc/sysconfig/network
4. 配置网卡:vi /etc/sysconfig/network-scripts/ifcfg-eth0
注意:在VMware里克隆出来的CentOS Linux,开机执行命令:ifconfig…没有看到eth0网卡。然后重启网卡又报以下错误:
Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization. [FAILED]
解决办法:
首先,打开/etc/udev内容如下面所示:
记录下eth1网卡的mac地址
接下来,打开/etc/sysconfig/network-scripts/ifcfg-eth0网卡配置文件
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
将 DEVICE="eth0" 改成 DEVICE="eth1" ,
HWADDR="00:0c:29:8f:89:97" 改成上面的mac地址 HWADDR="00:0c:29:50:bd:17"
最后,重启网络# /etc restart正常了。
5. 添加主机名和IP地址映射关系:sudo vi /etc/hosts添加“主机名 IP地址”
192.168.46.120 hadoop0
192.168.46.121 hadoop1
192.168.46.122 hadoop2
192.168.46.123 hadoop3
6. 关闭防火墙:sudo service iptables stop
7. 检查防火墙关闭情况:service iptables status
8. 关闭防火墙自启动:chkconfig iptables off
9. 查看防火墙自启动情况:chkconfig iptables –list
10. 关闭Slinx:(修改配置文件需要重启机器)
修改/etc/selinux/config 文件(vi /etc/selinux/config )将SELINUX=enforcing改为SELINUX=disabled重启机器即可
11. 配置SSH免密码登录:
1) 查看是否安装ssh服务命令:yum list installed | grep ssh
2) 查看进程中是否启动了ssh:ps -Af | grep sshd
3) 生成当前用户下公私密钥对:ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
4) 复制粘贴主节点的公钥到其他三台主机(从节点)的authorized_keys(文件名位置固定就在~/.ssh下面)中(authorized_keys文件自建,也可以id_r改名字为authorized_keys)
5) 修改authorized_keys权限为644:chmod 644 authorized_keys
12. 根目录下建个soft文件夹用来存放jdk和hadoop的安装包:mkdir /soft
13. 进入soft文件夹下面,上传jdk和hadoop的安装包:rz 文件名
14. 解压:tar -xzvf jdk-8u144-linux-x64.
15. 解压:tar -xzvf .
16. 可以删除压缩包. 和jdk-8u144-linux-x64.了:rm –rf .,rm -rf . 。jdk1.8.0_144、太长,配置环境变量的时候麻烦,修改一下名字:mv jdk1.8.0_144 jdk,mv hadoop。
17. 在/soft/tmp创建一个文件夹,用来存放HDFS临时文件:mkdir tmp
18. 配置JDK环境变量:编辑/etc/profile文件:vi /etc/profile在文档的最后面添加
export JAVA_HOME=/soft/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/soft/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
19. 配置生效:source /etc/profile
20. 配置core-文件(先建立文件夹/soft/hadoop/tmp): vi core-
<configuration>
<property>
<name>;/name>
<value>/soft/tmp</value>
</property>
<property>
<name>;/name>
<value>hdfs://hadoop0:9000</value>
</property>
</configuration>
21. 配置hdfs-文件:vi hdfs-
<configuration>
<property>
<name>d;/name>
<value>hadoop0:50070</value>
</property>
<property>
<name>d;/name>
<value>hadoop0:50090</value>
</property>
<property>
<name>d;/name>
<value>3</value>
</property>
</configuration>
22. 配置vi mapred-文件(先改名:mv mapred-.template mapred-)
<configuration>
<property>
<name>ma;/name>
<value>hadoop0:9001</value>
</property>
<property>
<name>ma;/name>
<value>20</value>
</property>
<property>
<name>ma;/name>
<value>4</value>
</property>
<property>
<name>ma;/name>
<value>yarn</value>
</property>
<property>
<name>ma;/name>
<value>hadoop0:10020</value>
</property>
<property>
<name>ma;/name>
<value>hadoop0:19888</value>
</property>
</configuration>
23. 配置:vi
这个文件要修改的地方就是JAVA_HOME环境变量,刚才我们设置过JAVA_HOME的,在我的案例里改成如下——
# The java implementation to use.
export JAVA_HOME=/soft/jdk
24. 配置yarn-env.sh: vi yarn-env.sh
yarn的环境配置,同样只需要修改JAVA_HOME就行,找到下面这行——
# some Java parameters
export JAVA_HOME=/soft/jdk
25. 配置slaves: vi slaves
这是设置从节点hostname的地方,一行一个,我们的例子里只要在文件里写上如下两行就行了
hadoop1
hadoop2
hadoop3
26. 配置yarn-文件:vi yarn-
<configuration>
<!– Site specific YARN configuration properties –>
<property>
<name>yarn.re;/name>
<value>hadoop0:8032</value>
</property>
<property>
<name>yarn.re;/name>
<value>hadoop0:8030</value>
</property>
<property>
<name>yarn.re;/name>
<value>hadoop0:8088</value>
</property>
<property>
<name>yarn.re;/name>
<value>hadoop0:8031</value>
</property>
<property>
<name>yarn.re;/name>
<value>hadoop0:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-;/name>
<value>org.a;/value>
</property>
</configuration>
27. 格式化namenode: ./bin/hdfs namenode –format(在/soft/hadoop下进行)

5、Hadoop常用命令

所有HDFS命令都由bin/ HDFS脚本调用。运行没有任何参数的hdfs脚本将打印所有命令的描述。

  • mv:使用方法:hadoop fs -mv URI [URI …] <dest>
  • 将文件从源路径移动到目标路径。命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。

示例:hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2

hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1

  • mkdir:接受路径指定的uri作为参数,创建这些目录。
  • 示例:hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
  • ls:hadoop fs -ls <args>;如果是文件,则返回文件信息,如果是目录,则返回它直接子文件的一个列表
  • lsr:hadoop fs -lsr <args>;ls命令的递归版本。
  • get:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>;复制文件到本地文件系统;
  • hadoop fs -get /user/hadoop/file localfile
  • hadoop fs -get hdfs://host:port/user/hadoop/file localfile
  • put:hadoop fs -put <localsrc> … <dst>:从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir;hadoop fs -put – hdfs://host:port/hadoop/hadoopfile
  • rm:hadoop fs -rm URI [URI…],删除指定的文件,rmr:hadoop fs -rmr URI [URI …];rm的递归版本。hadoop fs -rmr hdfs://host:port/user/hadoop/dir
  • cat:使用方法:hadoop fs -cat URI [URI …];将路径指定文件的内容输出到stdout。
  • 示例:hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2
  • copyFromLocal:使用方法:hadoop fs -copyFromLocal <localsrc> URI:除了限定源路径是一个本地文件外,和put命令相似。
  • copyToLocal:使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>:除了限定目标路径是一个本地文件外,和get命令类似。
  • cp:使用方法:hadoop fs -cp URI [URI …] <dest>:将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。示例:hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
  • tail:使用方法:hadoop fs -tail [-f] URI;将文件尾部1K字节的内容输出到stdout。支持-f选项,行为和Unix中一致。
  • 示例:hadoop fs -tail pathname
  • test:使用方法:hadoop fs -test -[ezd] URI;选项:-e 检查文件是否存在。如果存在则返回0。-z 检查文件是否是0字节。如果是则返回0。-d 如果路径是个目录,则返回1,否则返回0。示例:hadoop fs -test -e filename
  • getmerge:使用方法:hadoop fs -getmerge <src> <localdst> [addnl]:接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于指定在每个文件结尾添加一个换行符。
  • setrep:使用方法:hadoop fs -setrep [-R] <path>;改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。
  • 示例:hadoop fs -setrep -w 3 -R /user/hadoop/dir1
  • stat:使用方法:hadoop fs -stat URI [URI …];返回指定路径的统计信息。示例:hadoop fs -stat path
  • touchz:使用方法:hadoop fs -touchz URI [URI …];创建一个0字节的空文件。示例:hadoop -touchz pathname

6、MapReduce介绍

MapReduce在工作中仍然有使用,但是已经越来越少了,我们仅了解一下,想要从事大数据事业,我们需把学习重心放在Spark和Flink上面。MapReduce也是源自于一篇谷歌2004年发表的论文。MapReduce不擅长实时计算和迭代计算,Spark的处理速度通常在MapReduce的10-100左右,至于Flink的速度,则更快。MapReduce过于低层化,一个简单的查询,需要写Map和reduce函数,复杂且耗费时间,如下一个简单的WordCount程序,需要50行左右的程序。

编程模型:

import java.io.IOException;
import java.u;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
public class WordCount {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer());
while ()) {
word.se());
con(word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
re(sum);
con(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByCla);
job.setMapperCla);
job.setCombinerCla);
job.setReducerCla);
job.setOutputKeyCla);
job.setOutputValueCla);
FileIn(job, new Path(args[0]));
FileOu(job, new Path(args[1]));
Sy(true) ? 0 : 1);
}
}

7、资源调度框架YARN介绍

Hadoo时候的架构图:

旧版本中,一个Hadoop集群可以分解为两个抽象实体:MapReduce计算引擎和HDFS分布式文件系统,当一个客户端向一个Hadoop集群发出一个请求时,此请求首先由JobTracker管理,JobTracker 与 NameNode 联合将任务分发到离它所处理的数据尽可能近的位置。然后JobTracker 将 Map 和 Reduce 任务安排到一个或多个 TaskTracker 上的可用插槽中。TaskTracker 与 DataNode一起对来自 DataNode 的数据执行 Map 和 Reduce 任务。当 Map 和 Reduce 任务完成时,TaskTracker 会告知 JobTracker,后者确定所有任务何时完成并最终告知客户作业已完成。

在旧版本中,由于只有一个JobTracker和NameNode,单一Namenode,单一JobTracker的设计严重制约了整个Hadoop 1.0可扩展 性和可靠性。首先,Namenode和JobTracker是整个系统中明显的单点故障源(SPOF)。再次单一Namenode的内存容量有限,使得Hadoop集群的节点数量被限制到4000个左右,能支持的文件系统大小被限制在10-50PB, 最多能支持的文件数量大约为1.5亿 左右(注,实际数量取决于 Namenode的内存大小)。

YARN将资源管理和作业监控/调度这两个功能拆分开来,交由不同的守护进程完成。具体来说就是有一个全局的资源管理者(ResourceManager or RM)和N个NodeManager。

ResourceManager的职责:一个集群中Active状态的RM只有一个,负责整个集群的资源管理和调度。主要是:处理客户端的请求,启动/监控ApplicationMaster(AM)的运行,一个作业对应一个AM,另外一个职责是监控NodeManager。

NodeManager:整个集群中有N个,主要负责单个节点的资源管理和Task的运行情况,并定期向ResourceManager 汇报本节点的资源使用情况和各个Container的运行状态,接受并处理ResourceManager 的Container的启停的各种命令。

ApplicationMaster:每一个应用/作业对应一个ApplicationMaster,负责应用程序的管理,数据切分,为应用程序向RM申请资源,并分配给内部任务,还负责与NameNode通信以及启停、监控Task,Task是运行在Container中的。

Container:对任务运行情况的描述,包括CPU需要多少、内存需要多少、需要什么样的环境变量啊等等。

工作流程:

①用户向YARN提交作业(使用hadoop jar命令提交)

②RM为该作业分配第一个Container(启动ApplicationMaster)

③RM会与对应的NM通信,要求NM在这个Container上启动应用程序的AM

④AM首先向RM注册,然后AM将为各个任务申请资源,并监控运行情况

⑤AM采用轮询的方式通过RPC协议向RM申请和领取资源

⑥AM申请到资源以后,便和相应的NodeManager通信,要求NM启动任务

⑦NodeManager启动我们作业对应的Task。

8、Hive介绍

Hive的产生是为了解决MapReduce编程的不便性,MapReduce实现一个简单的功能,需要编写好多冗余的程序,如上面的WordCount例子所示。Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,使得查询和分析更加的方便。定义了一种类SQL的查询语言,提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。最初,Hive是由Facebook开发,后来由Apache软件基金会开发,并作为进一步将它作为名义下Apache Hive为一个开源项目。它用在好多不同的公司。例如,亚马逊使用它在 Amazon Elastic MapReduce。Hive通常用于进行离线数据处理,底层支持多种执行引擎(默认是MapReduce),包括MapReduce、Tez、Spark等。

Hive采用统一的元数据管理,可以与Presto/Impala/SparkSQL等共享数据。

架构图:

单元名称操作用户接口/界面Hive是一个数据仓库基础工具软件,可以创建用户和HDFS之间互动。用户界面,Hive支持是Hive的Web UI,Hive命令行,HiveHD洞察(在Windows服务器)。元存储Hive选择各自的数据库服务器,用以储存表,数据库,列模式或元数据表,它们的数据类型和HDFS映射。HiveQL处理引擎HiveQL类似于SQL的查询上Metastore模式信息。这是传统的方式进行MapReduce程序的替代品之一。相反,使用Java编写的MapReduce程序,可以编写为MapReduce工作,并处理它的查询。执行引擎HiveQL处理引擎和MapReduce的结合部分是由Hive执行引擎。执行引擎处理查询并产生结果和MapReduce的结果一样。它采用MapReduce方法。HDFS 或 HBASEHadoop的分布式文件系统或者HBASE数据存储技术是用于将数据存储到文件系统。

Hive工作原理

下图描述了Hive 和Hadoop之间的工作流程。

下表定义Hive和Hadoop框架的交互方式:

Step No.操作1Execute Query

Hive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。

2Get Plan

在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。

3Get Metadata

编译器发送元数据请求到Metastore(任何数据库)。

4Send Metadata

Metastore发送元数据,以编译器的响应。

5Send Plan

编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。

6Execute Plan

驱动程序发送的执行计划到执行引擎。

7Execute Job

在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。

7.1Metadata Ops

与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。

8Fetch Result

执行引擎接收来自数据节点的结果。

9Send Results

执行引擎发送这些结果值给驱动程序。

10Send Results

驱动程序将结果发送给Hive接口。

(备注:Hive相关介绍取自于博客: ,非常感谢作者,如有侵权,请联系删除,谢谢!)

相关推荐