五分钟搞懂Hadoop

转载自知乎专栏的文章,原文章链接https://zhuanlan.zhihu.com/p/20176725
括号中被高亮标识出来的是我批注的内容

「大数据」,想必大家经常听到这个被炒得很热的话题。随之而来的是各种看似高大上的专业术语,比如「扩展性」、「可靠性」、「容错性」,好像真的很高深,要积累多年经验才能学习。


但另一方面,很多同学都刚刚进入互联网这个行业,对分布式计算还没有很多了解,那是不是就要花很多力气才能搞懂「大数据」呢?不必担心,包子老师在这里用浅显易懂深入浅出的语言,帮助没有基础的同学快速的入手「大数据」,让每位同学都能迅速学会最前沿的技术。今天,我们先学习当前使用最广泛的大数据处理框架 Hadoop.


Hadoop,你是怎么来的?


今天的社会产生越来越多的数据,比如:你登录Facebook以后点击了哪些好友,你在Amazon上浏览了哪些产品,你在linkedin上浏览了哪些公司,甚至到从石油矿井里的钻头收集了哪些地质信息。


我们还发现,通过分析这些数据总结规律,我们可以让Facebook和Amazon显示让用户更感兴趣的广告,公司HR会更准确找到合适的求职者,石油公司也能用更低的成本开采更多的石油。


那找个软工写算法不就行了吗?


确实,这些决策都是通过算法找到规律的。可问题是现在的数据量太大了,一台机器要完成一个问题要算好久好久。


那用多台机器处理不就行了吗?


确实,Hadoop以及其他任何大数据框架都是多台机器共同处理的。可问题是,这些算法都要完成一个特定的问题,给出一个答案,多台机器不能自己算自己的,他们要有不同的分工,联合起来共同算完这个问题。这里就是Hadoop等框架的特长。


我们举个例子吧:


Google是大家常用的搜索引擎,作为业务的重要特征,它自然想知道大家对哪些关键字感兴趣,比如以天为单位,收集所有人搜过的关键字,统计其出现的次数。


这听起来像个哈希表就能干的问题对吧?可是,每天那么多人使用Google,它不可能把这些关键字都放在内存里,而且Google也是用很多服务器为大家完成搜索的,所以一天里所有搜过的关键字,都以文件的形式存在多台机器上。我们就叫这些机器1, 2, 3......n.


比如在机器1上存储了一个文件,内容是所有搜过的关键字:Deer, Bear, River …...



图1


既然Log文件存放在多台机器中,那如何计算关键字出现的总次数呢?


一种直观的算法,就是先让每台机器统计本机上每个关键字的搜索次数,写段算法统计一个文件里的关键字很简单。比如机器1的处理结果为:


  • Deer 150000

  • River 110000

  • Car 100000

(参见图1的mapping)


注意到这里,每台机器知道的是本机上关键字的搜索次数,而我们关心的是所有机器上的关键字的搜索总次数。


那下一步再找一组机器,不妨称其为:A, B, C, D......


每台机器只统计一部分关键字出现在所有机器上的总次数,比如:

  • 让机器A统计 在机器1, 2, 3.......n上“Bear”出现的总次数;

  • 让机器B统计,在机器1, 2, 3.......n上“Car”出现的总次数;

  • 让机器C统计,在机器1, 2, 3.......n上“Deer”出现的总次数;

  • 让机器D统计,在机器1, 2, 3......n上“River”出现的总次数;


(参见图1的reducing)


这样,当A, B, C, D......完成自己的任务以后,我们就知道每个关键字在过去一天出现的次数了。


所以每台机器不但要计算自己的任务,还要和其他机器「合作」,在我们刚才的例子里就是机器A, B, C, D......要从机器1, 2, 3, 4......那里知道关键字的出现次数,而且,A, B, C, D.....还要沟通好,分别统计不同的关键字,即不能两台机器都统计同一个关键字,也不能有的关键字没有机器统计。


好吧,大数据计算真复杂,那我们什么时候说说Hadoop?


其实,如果你明白了刚才的例子,你就明白Hadoop了!


啊?真的么?


是的,我们刚才计算搜索引擎关键字出现次数的例子,就是一个使用Hadoop的经典案例。像我们刚才说的,大数据计算非常复杂,各个机器之间要协调工作。但是,当总结常用的大数据算法后,我们发现他们有一定的共同点(稍后介绍),很多算法都要做一些类似的工作。既然有共同点,我们就没有必要重造轮子。这些类似的工作可以做成Framework,以后再开发类似大数据分析软件可以重用这些Framework的功能。Hadoop就是这样一个Framework,它来源于Google一篇关于MapReduce的Paper.(hadoop其实真正为我们封装的是shuffle阶段,即map阶段的输出,同一个关键字要映射到同一个节点,用的是哈希算法)


那Hadoop总结了算法的哪些共同点呢?


那篇MapReduce Paper的作者发现,很多计算,就比如我们刚才的例子,都可以拆分成Map, Shuffle, Reduce三个阶段:


  • Map阶段中,每台机器先处理本机上的数据,像图1中各个机器计算本机的文件中关键字的个数。

  • 各个机器处理完自己的数据后,我们再把他们的结果汇总,这就是Shuffle阶段,像刚才的例子,机器A, B, C, D......从1-n所有机器上取出Map的结果,并按关键字组合。

  • 最后,进行最后一步处理,这就是Reduce,我们刚才的例子中就是对每一个搜索关键字统计出现总次数。


这几步我们就称为MapReduce Model.


图2

为了完成MapReduce Model的计算,实际开发的软件需要一些辅助的功能。想像一下,起始时的一组机器上面存储了要处理的数据,但是Map, Shuffle, Reduce阶段的Function在哪儿呢?所以我们需要把Mapper Function, Reducer Function (Java code或者其他语言的code) 安装在机器 1-n 和A-Z上,并且执行。而且在Map阶段以后,计算结果保存在本机上,没办法Shuffle到Reduce的机器上。所以,也需要有软件按照Shuffle算法,把Mapper Function的结果搬运到Reduce阶段的机器上。(这里的shuffle并不是简单的乱序,而是把多个机器上的同一个key汇总到同一台节点)


运行整个Hadoop Job的流程中,很多工作对于所有算法都是需要的,不同的算法只是Mapper Function和Reducer Function. 换句话说,Hadoop实现了通用的功能,开发人员只需要告诉Hadoop需要执行的Mapper, Reducer Function,就可以完成想要的计算,而不需要开发所有步骤。(这个通用的功能就是shuffle函数,通过哈希函数将多台机器上的同一个key汇总到同一台机器,正是在这个地方涉及到多个节点的通信)


恭喜你,看到这里,你已经掌握了Hadoop的精髓。在这个系列之后的文章中,我们还会向大家介绍,Hadoop更多隐含的、但必不可少的功能,以及更多的重要的大数据Framework,比如HDFS,Hbase,Spark等。希望大家持续关注我们,我们会让大家用最少的时间,掌握最前沿的技术!


### Hadoop 的安装与配置 #### 1. 下载并解压 Hadoop 安装包 在每台机器上下载 Hadoop 安装包,并将其解压到指定路径。以下是具体命令: ```bash wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz tar -xzvf hadoop-3.3.1.tar.gz sudo mv hadoop-3.3.1 /usr/local/hadoop ``` 此过程会将 Hadoop 安装包放置于 `/usr/local/hadoop` 路径下[^1]。 #### 2. 配置环境变量 为了方便使用 Hadoop 命令,需设置 `HADOOP_HOME` 和 `PATH` 环境变量。编辑 `.bashrc` 文件,添加如下内容: ```bash export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ``` 执行以下命令使更改生效: ```bash source ~/.bashrc ``` 完成以上操作后即可通过终端访问 Hadoop 命令工具[^1]。 #### 3. 配置核心文件 Hadoop 的主要配置文件位于 `$HADOOP_HOME/etc/hadoop/` 目录下,主要包括以下几个文件: - **core-site.xml**: 设置 HDFS 默认存储位置。 - **hdfs-site.xml**: 配置 NameNode 和 DataNode 的副本数及其他参数。 - **mapred-site.xml**: MapReduce 框架的相关配置。 - **yarn-site.xml**: YARN 的资源调度器配置。 ##### core-site.xml 示例配置 ```xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://namenode_host:9000</value> </property> </configuration> ``` ##### hdfs-site.xml 示例配置 ```xml <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration> ``` 这些配置可以根据实际需求调整[^2]。 #### 4. 启动 Hadoop 集群 启动 Hadoop 集群前需要初始化 HDFS 文件系统: ```bash hdfs namenode -format ``` 随后依次启动 HDFS 和 YARN 服务: ```bash start-dfs.sh start-yarn.sh ``` 可以通过浏览器访问 Web UI 来验证集群状态,默认地址为 `http://<namenode-host>:9870` (NameNode) 和 `http://<resourcemanager-host>:8088` (ResourceManager)[^2]。 #### 5. 测试 WordCount 应用程序 运行官方提供的 WordCount 示例来验证 Hadoop 是否正常工作。创建输入目录并将数据放入其中: ```bash hadoop fs -mkdir -p /input hadoop fs -put $HADOOP_HOME/README.txt /input/ ``` 提交作业并查看输出结果: ```bash hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /input /output hadoop fs -cat /output/part-r-00000 ``` 如果一切顺利,则说明 Hadoop 已成功部署并可以正常使用[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值