如果已经走到了需要搭建hadoop伪分布式的环境了,那说明你至少做好了以下三点
- 创建好了自己的虚拟机,ip、本机名映射、防火墙、安全子系统都已经配置好了
- 下载jdk1.7及以上版本,并配置好了java环境
- 下载hadoop2.7.0及以上版本,并解压到、opt/modules(自己存放hadoop的目录)目录下
在配置之前,我们应该先了解hadoop的三个模块及其理念
1、 HDFS模块
HDFS负责大数据的存储,通过将大文件分块后进行分布式存储方式,突破了服务器硬盘大小的限制,解决了单台机器无法存储大文件的问题,HDFS是个相对独立的模块,可以为YARN提供服务,也可以为HBase等其他模块提供服务。
存储模式:
首先,HDFS默认会分块,大小是128M(这个值是可以设置的)
那么HDFS上面的块的大小可以大于128吗,答案是肯定的。
有不同的方式去设定
1)通过HDFS的API的create方法,可以指定创建的文件块的大小(可以任意大小)
2)hive当中也可以在hive-site当中设定,hive输出的块的大小(可以大于128M)
3)也会有其他的方法,这里就不一一列举修改方式,感兴趣的自己查一下
如果、当我储存一个129MB的文件的时候,存了几块!?
存储了2块!------>第一块128M,第二块1M
计算数据:
HDFS上的文件进行mapreduce计算,默认情况下一个map当中会有128M(和块大小一样)的数据输入
所以这里就涉及到我的一个129M的文件会启动几个Map任务来操作
答案是:1个
mapreduce有这样的机制,最后一个文件的输入如果小于128*1.1(其实就是可以多10%)
那么只会启动一个Map来执行这个job,避免了第一个Map跑了128M的数据,第二个Map只跑了1M的数据的尴尬
这种情况只会在最后一块出现
再举个例子,比如522M的文件,分成几个Map来处理呢?
第一个map-》128M
第二个map-》128M
第三个map-》128M
第四个map-》138M ——》138小于128*1.1,所以这里就不会再开启一个map来处理最后剩余的那10M的数据
直接在最后一个map当中把所有138M的数据输入!!谨记
HDFS不适合存储大量的小文件
可以考虑合并大文件,效果不明显
阿里巴巴开源了TFS淘宝文件系统,参考了HDFS
2、 YARN模块
YARN是一个通用的资源协同和任务调度框架,是为了解决Hadoop1.x中MapReduce里NameNode负载太大和其他问题而创建的一个框架。
YARN是个通用框架,不止可以运行MapReduce,还可以运行Spark、Storm等其他计算框架。
3、 MapReduce模块
MapReduce是一个计算框架,它给出了一种数据处理的方式,即通过Map阶段、Reduce阶段来分布式地流式处理数据。它只适用于大数据的离线处理,对实时性要求很高的应用不适用。
接下来我们就开始配置伪分布式模式
一、用户及其权限配置
1、创建一个管理hadoop的用户 hadoop
[root@maketubu ~]# useradd hadoop
[root@maketubu ~]# passwd hadoop
2、给hadoop用户sudo权限 vi /etc/sudoers 增加 hadoop ALL=(root) NOPASSWD:ALL
如果这里sudoers为只读模式,则用root给其一个权限 chmod 755 /etc/sudoers使其可更改
3、切换到hadoop用户
[root@maketubu ~]# su - hadoop
[hadoop@maketubu ~]$
4、更改存放hadoop的目录 opt/modules的所有者为hadoop,这是为了后面的hdfs的操作,如果这里不修改,后面可能会出现权限上的问题
[hadoop@maketubu ~]$ sudo chown -R hadoop:hadoop /opt/modules
二、配置hadoop
具体下面每个文件需要的配置信息都可在Apache的官方网站上查到:hadoop.apache.org
1、配置HADOOP环境变量 vi /etc/profile 追加配置HADOOP_HOME
export HADOOP_HOME=/opt/modules/hadoop-2.7.3
export PATH=$PATH:$HADOOP_HOME/bin:$PATH:$HADOOP_HOME/sbin
修改后对 etc/profile source一下 source 、etc/profile
测试环境是否配置成功 echo $HADOOP_HOME
2、通过notepad++的NTTftp对hadoop各个文件进行参数配置,如何用natepad++连接linux请参考:notepad++连接
有的新版本好像不支持nttftp插件,可以下载这个版本:链接: https://pan.baidu.com/s/1eQzYKUxOmI05ijv0vctkQA 密码: 6gkm
3、配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh文件的JAVA_HOME参数
先找到自己的JAVA_HOME路径, echo $JAVA_HOME
除了hadoop-env.sh,其他两个的JAVA_HOME都被注释掉了,去掉注释进行修改
修改JAVA_HOME参数为:
export JAVA_HOME="/opt/modules/jdk1.7.0_67"
4、配置core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://maketubu.com:8020</value>
</property>
上面fs.defaultFS为参数配置的是HDFS的地址。
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.7.3/data/tmp</value>
</property>
hadoop.tmp.dir配置的是Hadoop临时目录,比如HDFS的NameNode数据默认都存放这个目录下,查看*-default.xml
等默认配置文件,就可以看到很多依赖${hadoop.tmp.dir}
的配置。
默认的hadoop.tmp.dir
是/tmp/hadoop-${user.name}
,此时有个问题就是NameNode会将HDFS的元数据存储在这个/tmp目录下,如果操作系统重启了,系统会清空/tmp目录下的东西,导致NameNode元数据丢失,是个非常严重的问题,所有我们应该修改这个路径。
5、配置hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
dfs.replication配置的是HDFS存储时的备份数量,因为这里是伪分布式环境只有一个节点,所以这里设置为1。默认为3保证数据安全性机制(副本策略)
副本数
一份文件写多份备份,写到不同机器节点上
文件切分成块之后,对于每个块的备份
放置策略
第一个block块的副本,如果client客户端在集群中的某台机器,那么第一个就放在这台
如果client不在集群中,那么第一个块就随机放置
第二个block块的副本,会放置在和第一个不同的机架的node节点上,随机的
第三个block块的副本,会放置在和第二个相同机架的不同的node节点上,随机的
其他的随便放
负载均衡,均匀分布
6、格式化HDFS
[hadoop@maketubu ~]$ hdfs namenode -format
格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在NameNode中。
格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/data目录)指定的目录下是否有了dfs目录,如果有,说明格式化成功。
注意:
格式化时,这里注意hadoop.tmp.dir目录的权限问题,应该hadoop普通用户有读写权限才行,可以将/opt/data的所有者改为hadoop。
[hadoop@maketubu hadoop-2.7.3]$ sudo chown -R hadoop:hadoop /opt/modules/hadoop-2.7.3/data/tmp查看NameNode格式化后的目录。
[hadoop@bigdata-senior01 ~]$ ll /opt/modules/hadoop-2.7.3/data/tmp/dfs/name/current
- 1
- 1
fsimage是NameNode元数据在内存满了后,持久化保存到的文件。
fsimage*.md5
是校验文件,用于校验fsimage的完整性。
seen_txid
是hadoop的版本
vession文件里保存:
namespaceID:NameNode的唯一ID。
clusterID:集群ID,NameNode和DataNode的集群ID应该一致,表明是一个集群。
7、启动
可以再sbin目录下写一个启动脚本
/opt/module/hadoop-2.7.3/sbin/hadoop-daemon.sh start namenode
/opt/module/hadoop-2.7.3/sbin/hadoop-daemon.sh start datanode
/opt/module/hadoop-2.7.3/sbin/hadoop-daemon.sh start secondarynamenode
用jps测试,如果出现了就说明配置成功
[hadoop@bmaketubu hadoop-2.7.3]$ jps
3034 NameNode
3233 Jps
3193 SecondaryNameNode
3110 DataNode
至此,你的hdfs的配置已全部完成,可以尝试自己上传文件或者下载文件
8、操作
在hdfs上创建目录
[hadoop@maketubu hadoop-2.7.3]$ bin/hdfs dfs -mkdir /test
上传文件到测试目录
[hadoop@maketubu hadoop-2.7.3]$ bin/hdfs dfs -put /etc/hadoop/core-site.xml /test
下载文件到本地
[hadoop@maketubu hadoop-2.7.3]$ bin/hdfs dfs -get /test/core-site.xml /get-site.xml
下载时可以对文件进行重命名
对于后面的yarn、历史服务、日志聚合等配置,就写到另一篇学习记录里