在前一章已经学习了Hadoop的基本结构,本章内容包括Hadoop的安装以及Hello World。
安装
博主电脑环境是Ubuntu 16.04 LTS
下载
首先,从Hadoop官网下载https://hadoop.apache.org/releases.html
然后使用tar -vxzf xxx.tar.gz
到目标软件目录
配置及使用
Hadoop根据不同使用情况提供了三种运行模式
- 单机模式(Local (Standalone) Mode),这种模式无需配置,这种方式,Hadoop被认为是一个单独的Java进程
- 伪分布式(Pseudo-Distributed Mode),这种模式的Hadoop看作只有一个节点的集群,这个节点既是Master,也是Slave
- 完全分布式(Fully-Distributed Mode),这种则是正常生产集群下使用模式
博主主要以第二种,即伪分布式方式来进行安装及使用。
配置
- Hadoop是Java语言实现,所以需要有Java环境,这里不细说了,需要在
etc/hadoop/hadoop-env
中加入export JAVA_HOME=/usr/java/latest
声明JAVA_HOME位置 - 在
etc/hadoop/core-site.xml:
中加入:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
- 在
etc/hadoop/hdfs-site.xml:
中加入
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
- 检测本机是否装有
ssh
,使用ssh localhost
试下,记得电脑名字得为localhost,博主属于爱折腾类型,把名字改了(唔脸)
ssh localhost
如果没有ssh
,则需要使用sudo apt-get install ssh
接着使用ssh来生成密钥:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
- 初始化namenode,即格式化文件系统HDFS
bin/hdfs namenode -format
- 接着启动应用,博主选择启动所有相关进程:
./start-all.sh
坑
当然过程也不是一番风顺的,这里博主分享几个在安装时候的坑,以免大家继续踩。
- 主机名字问题,博主曾经把名字改为了mosquito,而Hadoop回去启动localhost,所以会报错,这里解决方法需要在
/etc/hosts
和/etc/hostname
中将名字改回来 - 关于ssh验证问题,楼主是按照上面三步生成似钥以及公钥,但是进去时候报了认证失败的错误:
localhost: Permission denied (publickey,password).
后来发现还需要运行ssh-add
命令,将密钥加入到agent节点 - 还有个问题,有不少人用Idea 来做编辑器,并且好多盗版,激活Idea时候,可能会更改0.0.0.0的映射地址,就会出现以下问题:
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [account.jetbrains.com]
Stopping nodemanagers
Stopping resourcemanager
此时,可以注释host中的account.jetbrains.com,或者在hdfs-site.xml
添加
<property>
<name>dfs.secondary.http.address</name>
<value>127.0.0.1:50090</value>
</property>
因为不写的话默认是0.0.0.0:50090,改为127.0.0.1就可以
- 最后访问
http://localhost:50070
还是不行,后来查资料发现
网址改为了http://localhost:9870
具体可以看https://issues.apache.org/jira/browse/HDFS-9427
最终界面图:
MapReduce
MapReduce计算模型
MapReduce的载体是什么,在Hadoop中,用于执行MapReduce任务的有两个角色,一个是JobTracker,另一个是TaskTracker,JobTracker是用于管理和调度工作的,TaskTracker是用于执行工作的,一个Hadoop集群只有一个JobTracker。
优化
MapReduce计算模型的优化涉及了方方面面内容,但是主要金钟两个方面,一个是计算性能的优化,另一个是IO操作方面优化
- 任务调度
- 数据预处理与InpuSplit的大小,MapReduce擅长处理少量的大数据,而在处理大量的小数据时候,MapReduce的性能会逊色很多
- Map和Reduce任务的数量
- Combine函数,Combine函数是用于本地合并数据的函数,在有些情况下,Map函数产生的中间数据是有很多重复的,若将所有这些记录传递给Reduce是很耗时的,所以MapReduce框架运行用户写的combine函数用于本地合并,这会大量减少网络IO操作
- 压缩,对最终结果进行压缩
- 自定义comparator,数据比较方面
参考资料:
7. http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Pseudo-Distributed_Operation
8.
9. https://issues.apache.org/jira/browse/HDFS-9427
10. https://www.codetd.com/article/1560685