文章已移至: http://www.codeci.cn
公共模块
分布式文件系统
主从架构
主节点:NameNode
管理存储文件的元数据:
文件的名称、文件存储路径、block、副本数
从节点:DataNode
真正的存储文件数据,blocks
一种分布式集群资源管理和任务调度资源管理框架
主节点:ResourceManager
管理整个集群的资源(内存、CPUCore)接收Client提交的应用(比如提交运行的MapReduce程序),分配资源
从节点:NodeManagers
管理每台机器的资源,接收RM发送的请求,运行Task
并行处理框架(分布式处理海量数据)
任务监控
提交任务后由JobTracker协调,先执行Map阶段(图中M1,M2和M3),然后执行Reduce阶段(图中R1和R2)。
Map阶段和Reduce阶段动作都受到TaskTracker监控,并运行在独立于TaskTracker的Java虚拟机中。
输入
输入通过InputFormat实现:
InputSplit:对数据进行划分(图中的splite1到splite5,就是划分以后的结果)
RecordReader:从输入中生成(key,value)对(map()方法处理的就是(key,value)对格式)
Map phase
自定义业务逻辑和输出(key,value)对的类型,map操作通过context.collect(最终通过OutputCollector.collect)将结果写到context中。
从map()函数输出处理结果数据开始, 一直到reduce()函数开始数据。
内存是一个 环形缓冲区,默认大小为100MB,当达到80%的时候,需要将数据spill到本地磁盘中。
(1)自定义(可优化部分:Combiner):
目的:
1.减少MapTask向本地磁盘写的数据量,同事也减少了ReduceTask拉取时读取数据的量
2.减少了ReduceTask拉取数据时,网络IO流。
流程:
在Mapper输出它的时,键值对不会被马上写到输出里,他们会被收集在list里(一个key值一个list),当写入一定数量的键值对时,这部分缓冲会被Combiner中进行合并,然后再输出到Partitioner中(图中M1的黄颜色部分对应着Combiner和Partitioner)。并不是所有的MapReduce都可以设置的,比如求平均值就不可以。
(2)分区(Partitioner):
在内存中进行分区, 每个分区的数据 给一个redeuceTask处理
(3)排序(sort):
在spill写入之前,会先进行二次排序:快速排序算法
1.数据所属的partition进行排序
2.每个partition中的数据再按key来排序。
partition的目的是将记录划分到不同的Reducer上去,以期望能够达到负载均衡,以后的Reducer就会根据partition来读取自己对应的数据。
(4)溢写(spill):
达到80%,内存数据溢写到磁盘上
(5)自定义(可优化部分:Compress):
目的:
1.减少本地磁盘IO读写
2.减少网络IO传输
对MapTask输出的结果数据进行压缩,消耗电脑CPU资源。
通常压缩算法:
1.google开源算法:snappy
2.lz4
(6)合并成文件:
反复操作,直到mapTask输出结束,此时本地会有多个spill文件,将所有的spil文件进行合并和排序:归并排序算法。最终合并完成以后,形成一个文件(分区的、排序的)
Reduce phase
(1)copy:
ReduceTask将会接收到AppMaster指令,到MapTask运行的主机的本地磁盘中拉取要处理的分区数据。Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer)
每个Reducer会处理一个或者多个partition,拉取所有MapTask上属于自己要处理的数据
首先放在内存中,达到阀值,进行排序,spill(类似map端)
(2)sort:
当所有的拉取完成以后,合并所有的文件,并且文件进行排序:归并排序算法。
Reduce阶段,上面通过处理后得到的(key,list(value1,value2...valuen))会送到Reducer.reduce方法中处理。
输出
输出的结果通过OutputFormat,输出到DFS中。
新建用户:# useradd eclound
修改密码:# passwd eclound
切换用户
切换到普通用户:
# su
切换到root用户:
$ su eclound
给/etc/sudoers赋予写的权限:
# chmod u+w /etc/sudoers
编辑/etc/sudoers文件
# vim /etc/sudoers
在文件的首行加入:
eclound ALL=(root)NOPASSWD:ALL
收回/etc/sudoers写的权限:
# chmod u-w /etc/sudoers
查看防火墙状态:
$ sudo service iptables status
###更改ip地址:
即时生效:# ifconfig eth0 192.168.133.130 netmask 255.255.255.0
启动生效:# sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0
即时生效:# hostname bigdata-hadoop.eclound.com
启动生效:# vim /etc/sysconfig/network
主机名 -> /etc/hosts文件(域名解析) -> 找到ip地址
#vim /etc/hosts
192.168.133.130 bigdata-hadoop.eclound.com bigdata-eclound
第一部份:IP地址
第二部份:主机名或域名
第三部份:主机名别名;
编辑hosts文件
C:\Windows\System32\drivers\etc\hosts
192.168.133.130 bigdata-hadoop.eclound.com
永久性服务开启和关闭管理命令:# chkconfig 服务名称 on|off
范例:
永久性关闭防火墙:
$ sudo chkconfig iptables off
查看服务是否随着系统的启动而开启或者关闭:
$ sudo chkconfig --list|grep iptables
$ sudo vim /etc/sysconfig/selinux
更改selinux的状态:
SELINUX=disabled
$ java -version
$ sudo rpm -qa|grep java
$ sudo rpm -e --nodeps ... ... ...
$ sudo rpm -e --nodeps java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64
$ sudo mkdir /opt/modules
$ sudo mkdir /opt/softwares
为了方便起见,目录新建在root根目录下,需要更改权限
查看权限:
$ ll /opt/modules
$ ll /opt/softwares
更改权限:
$ sudo chown -R ecloud:ecloud /opt/*
windows传输到虚拟机上:
windows下载XManager(xshell,xftp),通过xshell传输文件
lrzsz传输文件
Linux下载lrzsz-0.12.20-27.1.el6.x86_64.rpm,安装后
$ rz
rpm包的安装
$ rpm -ivh lrzsz-0.12.20-27.1.el6.x86_64.rpm.rpm
(安装过程中显示正在安装的文件信息及安装进度)
zip包的解压
范例:
$ unzip xx.zip -d ...
(-d 目标地址)
jar包的解压
$ tar -zxvf jdk-7u67-linux-x64.tar.gz -C /opt/modules/
$ tar -zxvf hadoop-2.6.0-cdh5.7.6.tar.gz -C /opt/modules/
(-C 目标地址)
设置系统全局环境变量
$ sudo vim /etc/profile
export JAVA_HOME=/opt/modules/jdk-7u67-linux-x64/
export PATH=${PATH}{JAVA_HOME}/bin
export HADOOP_HOME=/opt/modules/hadoop-2.6.0-cdh-5.7.6
$ cd ${HADOOP_HOME}/etc/hadoop
a. Hadoop Common
hadoop-env.sh
core-site.xml
b. HDFS
hdfs-site.xml
salves
c. YARN
yarn-env.sh
yarn-site.xml
d. MapReduce
mapred-env.sh
mapred-site.xml
拷贝 mapred-site.xml.template
注意:
HADOOP框架JAR包存放在${HADOOP_HOME}/share/hadoop
配置hadoop-env.sh文件
$ vim hadoop-env.sh
$ vim yarn-env.sh
$ vim mapred-env.sh
export JAVA_HOME=/opt/modules/jdk1.7.0_67
配置core-site.xml文件
$ vim core-site.xml
指定文件系统为HDFS及NameNode主节点所运行的机器和端口号
<property>
<name>
fs.defaultFS
name>
<value>
hdfs://bigdata-hadoop.eclound.com:8020
value>
property>
指定HDFS文件系统的本地的临时目录,默认值为当前系统的/tmp
<property>
<name>
hadoop.tmp.dir
name>
<value>
/opt/modules/hadoop-2.7.3/data/tmpData
value>
property>
创建对应的目录
$ cd ${HADOOP_HOME}/
$ mkdir -p data/tmpData
$ vim hdfs-site.xml
<property>
<name>dfs.replicationname>
<value>1property>
$ vim slaves
bigdata-hadoop.eclound.com
启动HDFS服务
a. 格式文件系统(第一次启动需要格式化)
$ bin/hdfs namenode -format
b. 启动服务
NameNode:
$ sbin/hadoop-daemon.sh start namenode
DataNode:
$ sbin/hadoop-daemon.sh start datanode
c. 验证
方式一:
$ jps
2916 DataNode
2866 NameNode
方式二:
WEB UI监控页面:
http://namenode-address:50070
测试HDFS
创建目录
$ bin/hdfs dfs -mkdir -p /conf/tmp
例举目录下文件
$ bin/hdfs dfs -ls -R /
上传文件
$ bin/hdfs dfs -put etc/hadoop/core-site.xml /conf/tmp
读取HDFS上小文件内容
$ bin/hdfs dfs -text /conf/tmp/core-site.xml
下载HDFS上文件
$ bin/hdfs dfs -get /conf/tmp/core-site.xml get-site.xml
删除文件
$ bin/hdfs dfs -rm /conf/tmp/core-site.xml
$ vim yarn-site.xml
指定ResourceManager运行的主机
<property>
<name>
yarn.resourcemanager.hostname
name>
<value>
bigdata-hadoop.eclound.com
value>
property>
配置nodemanager所属的shuffle服务,运行MapReduce需要
<property>
<name>
yarn.nodemanager.aux-services
name>
<value>
mapreduce_shuffle
value>
property>
启动YARN的服务
主节点:
$ sbin/yarn-daemon.sh start resourcemanager
从节点:
$ sbin/yarn-daemon.sh start nodemanager
验证
WEB UI 界面:
http://resourcemanager-address:8088/
<property>
<name>mapreduce.framework.name name>
<value>yarnvalue>
property>
<property>
<name>
mapreduce.jobhistory.address
name>
<value>
bigdata-hadoop.eclound.com:10020
value>
property>
<property>
<name>
mapreduce.jobhistory.webapp.address
name>
<value>
bigdata-hadoop.eclound.com:19888
value>
property>
$ sbin/mr-jobhistory-daemon.sh start historyserver
当我们去查看已经运行完成的MapReduce任务的监控信息的时候,出现如下错误:Aggregation is not enabled
默认情况下,我们运行MR任务完成以后,它的AppMaster和所有的Task日志实际所运行的NodeManager节点目录
Aggregation:
表示的是将日志信息放到HDFS文件系统上。
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>
yarn.log-aggregation.retain-seconds
name>
<value>
604800
value>
property>
<property>
<name>
yarn.log-aggregation.retain-check-interval-seconds
name>
<value>
86400
value>
property>
$ bin/yarn xxx.jar xx.class input output