Hadoop在大数据技术体系中的地位相当重要,Hadoop是大数据技术的基础。java
这是一篇记录我本身学习的文章,Hadoop的学习方法不少,网上也有不少学习路线图。node
Hadoop是一个可以对海量数据进行分布式处理的系统架构。我采用的是hadoop-2.8.0,它主要包含3大块:算法
Hadoop的核心是:HDFS和MapReduce。apache
HDFS(Hadoop Distributed File System,Hadoop 分布式文件系统)是一个高度容错性的系统,适合部署在廉价的机器上。HDFS 能提供高吞吐量的数据访问,适合那些有着超大数据集(largedata set)的应用程序。HDFS负责大数据的存储,经过将大文件分块后进行分布式存储方式,突破了服务器硬盘大小的限制,解决了单台机器没法存储大文件的问题,HDFS是个相对独立的模块,能够为YARN提供服务,也能够为HBase等其余模块提供服务。安全
核心bash
HDFS是一个主从结构,一个HDFS集群由一个名字节点(NameNode)和多个数据节点(DataNode)组成。服务器
1.高容错性 HDFS 认为全部计算机均可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,若是其中一台主机失效,能够迅速找另外一块副本取文件。数据自动保存多个节点;备份丢失后,自动恢复。网络
2.海量数据的存储 很是适合上T 级别的大文件或者一堆大数据文件的存储数据结构
3.文件分块存储 HDFS 将一个完整的大文件平均分块(一般每块64M)存储到不一样计算机上,这样读取文件能够同时从多个主机取不一样区块的文件,多主机读取比单主机读取效率要高得多得多。架构
4.移动计算 在数据存储的地方进行计算,而不是把数据拉取到计算的地方,下降了成本,提升了性能!
5.流式数据访问 一次写入,并行读取。不支持动态改变文件内容,而是要求让文件一次写入就不作变化,要变化也只能在文件末添加内容。
6.可构建在廉价的机器上 经过多副本提升可靠性,提供了容错和恢复机制。HDFS 能够应用在普通PC 机上,这种机制可以让一些公司用几十台廉价的计算机就能够撑起一个大数据集群。
做用
FsImage和Editlog是HDFS的核心数据结构。这些文件的损坏会致使整个集群的失效。所以,名字节点能够配置成支持多个FsImage和EditLog的副本。任何FsImage和EditLog的更新都会同步到每一份副本中。
做用
执行流程
做用
文件解析
能够经过修改hdfs-site.xml的dfs.replication属性设置产生副本的个数!默认是3!
基本操做
MapReduce分布式处理框架为海量的数据提供了计算。MapReduce是一个计算框架,它给出了一种数据处理的方式,即经过Map阶段、Reduce阶段来分布式地流式处理数据。它只适用于大数据的离线处理,对实时性要求很高的应用不适用。
简介
原语一般由若干条指令组成,用来实现某个特定的操做。经过一段不可分割的或不可中断的程序实现其功能。且常驻内存。可是这样一来,若是原语执行须要的开销超过了机器能给予的开销,则该原语在机器上没法执行,一般解决该问题的办法是增长机器配置,但计算机的配置在上层每提高一点所须要的资金都是翻倍的。所以根据分布式文件系统的原理,MapReduce诞生了。它将原语分红了两个步骤即map()和reduce(),同时两个阶段还能够分红多个模块在不一样的机器上执行。
vi /etc/prifile
复制代码
添加配置
export HADOOP_HOME="/opt/modules/hadoop-2.8.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
复制代码
source /etc/profile
复制代码
使得配置生效,并验证参数
echo ${HADOOP_HOME}
复制代码
修改JAVA_HOME参数为java的安装路径
如何查看java安装路径:
4.配置core-site.xml
如下操做都是在hadoop解压后的目录中操做
vi etc/hadoop/core-site.xml
复制代码
其中:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
复制代码
若是是全分布模式配置,该配置能够以下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
</configuration>
复制代码
更多配置属性介绍能够查看这里
5.配置hdfs-site.xml
vi etc/hadoop/hdfs-site.xml
复制代码
dfs.replication - 配置的是HDFS存储时的备份数量,由于这里是伪分布式环境只有一个节点,因此这里设置为1。
hdfs namenode -format
复制代码
格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计全部分块后的初始元数据的存储在NameNode中。格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/data目录)指定的目录下是否有了dfs目录,若是有,说明格式化成功。
ll /opt/data/tmp
复制代码
注意:
sudo chown -R hadoop:hadoop /opt/data
复制代码
查看NameNode格式化后的目录
ll /opt/data/tmp/dfs/name/current
复制代码
hdfs dfs -mkdir /demol
复制代码
经过hdfs建立的目录咱们直接用ls是查看不到的,此时可使用如下命令查看
hdfs dfs -ls /
复制代码
hdfs dfs -put {本地文件路径} /demol
复制代码
这里我遇到了一个问题,上传的时候提示我datanode没有启动,后来我用jps命令查看了发现datanode自动关闭了,这个问题的缘由是由于datanode的clusterID 和 namenode的clusterID 不匹配。
解决办法,检查hdfs-site.xml和core-site.xml的配置,若是没有错误,则查看tmp/dfs下的name和data的VERISON中的集群id是否匹配,若是不匹配则删除datanode中current下的文件而后从新启动;或者直接修改集群id
hdfs dfs -get {HDFS文件路径}
复制代码
默认没有mapred-site.xml文件,可是有个mapred-site.xml.template配置模板文件。复制模板生成mapred-site.xml
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
复制代码
添加配置以下:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
复制代码
指定mapreduce运行在yarn框架上。
配置yarn-site.xml,添加配置以下:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>0.0.0.0</value>
</property>
复制代码
更多属性查看
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
复制代码
经过jsp查看是否成功开启
在hadoop的share目录里,自带了一些jar包,里面带有一些mapreduce实例的小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,这里运行一个经典的单词统计实例
建立测试用的input文件
建立输入目录并将文件上传上去
hdfs dfs -mkdir -p /wordcount/input
hdfs dfs -put /opt/data/wc.input /wordcount/input
复制代码
运行wordcount mapreduce job
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar wordcount /wordcount/input /wordcount/output
复制代码
查看结果目录
hdfs dfs -ls /wordcount/output
复制代码
output目录中有两个文件,_SUCCESS文件是空文件,有这个文件说明Job执行成功。
part-r-00000文件是结果文件,其中-r-说明这个文件是Reduce阶段产生的结果,mapreduce程序执行时,能够没有reduce阶段,可是确定会有map阶段,若是没有reduce阶段这个地方有是-m-。
一个reduce会产生一个part-r-开头的文件。
查看结果文件