Hadoop伪分布安装
文章已移至: http://www.codeci.cn
hadoop框架
Hadoop Common:
公共模块
Hadoop Distributed File System (HDFS™):
分布式文件系统
主从架构
主节点:NameNode
管理存储文件的元数据:
文件的名称、文件存储路径、block、副本数
从节点:DataNode
真正的存储文件数据,blocks
Hadoop YARN:
一种分布式集群资源管理和任务调度资源管理框架
主节点:ResourceManager
管理整个集群的资源(内存、CPUCore)接收Client提交的应用(比如提交运行的MapReduce程序),分配资源
从节点:NodeManagers
管理每台机器的资源,接收RM发送的请求,运行Task
Hadoop MapReduce:
并行处理框架(分布式处理海量数据)
任务监控
提交任务后由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
- Map():
自定义业务逻辑和输出(key,value)对的类型,map操作通过context.collect(最终通过OutputCollector.collect)将结果写到context中。
- shuffer:
从map()函数输出处理结果数据开始, 一直到reduce()函数开始数据。
内存是一个 环形缓冲区,默认大小为100MB,当达到80%的时候,需要将数据spill到本地磁盘中。
(1)自定义(可优化部分:Combiner):
目的:
1.减少MapTask向本地磁盘写的数据量,同事也减少了ReduceTask拉取时读取数据的量
2.减少了ReduceTask拉取数据时,网络IO流。
流程:
在Mapper输出它的<k,v>时,键值对不会被马上写到输出里,他们会被收集在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
- shuffer:
(1)copy:
ReduceTask将会接收到AppMaster指令,到MapTask运行的主机的本地磁盘中拉取要处理的分区数据。Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer)
每个Reducer会处理一个或者多个partition,拉取所有MapTask上属于自己要处理的数据
首先放在内存中,达到阀值,进行排序,spill(类似map端)
(2)sort:
当所有的拉取完成以后,合并所有的文件,并且文件进行排序:归并排序算法。
- reduce():
Reduce阶段,上面通过处理后得到的(key,list(value1,value2...valuen))会送到Reducer.reduce方法中处理。
输出
输出的结果通过OutputFormat,输出到DFS中。
环境配置
创建普通用户和设置密码
新建用户:# useradd eclound
修改密码:# passwd eclound
创建普通用户的root权限
切换用户
切换到普通用户:
# 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地址
- Linux系统(虚拟机):
#vim /etc/hosts
192.168.133.130 bigdata-hadoop.eclound.com bigdata-eclound
第一部份:IP地址
第二部份:主机名或域名
第三部份:主机名别名;
- Windows系统(本机):
编辑hosts文件
C:\Windows\System32\drivers\etc\hosts
192.168.133.130 bigdata-hadoop.eclound.com
关闭防火墙和禁用SELINUX
永久性服务开启和关闭管理命令:# chkconfig 服务名称 on|off
范例:
永久性关闭防火墙:
$ sudo chkconfig iptables off
查看服务是否随着系统的启动而开启或者关闭:
$ sudo chkconfig --list|grep iptables
禁用SELINUX
$ sudo vim /etc/sysconfig/selinux
更改selinux的状态:
SELINUX=disabled
卸载自带JDK
- 查看自带java版本:
$ 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、tar
-
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 Common
-
配置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
配置HDFS
- 配置hdfs-site.xml文件
$ vim hdfs-site.xml
HDFS文件系统存储文件,将文件划分为一块一块的方式进行存储,称为block,每个block的大小为128MB(此版本的默认大小),并且每个block有三个副本,存储在不同的dataNode上,此处是伪分布式一台机器,设置副本为1即可。 (实际情况根据需求设置block副本数)
<property>
<name>dfs.replication</name>
<value>1</val
</property>
- 配置slaves文件
指明DataNodes节点运行的机器
$ 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
配置YARN
- 配置yarn-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/
配置MRJobHistory[ 历史服务器 ]
- 配置mapred-site.xml文件
<property>
<name>mapreduce.framework.name </name>
<value>yarn</value>
</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
- 验证:
WEB UI 界面:
http://mr-job-history-address:19888/
配置日志聚集功能
当我们去查看已经运行完成的MapReduce任务的监控信息的时候,出现如下错误:Aggregation is not enabled
默认情况下,我们运行MR任务完成以后,它的AppMaster和所有的Task日志实际所运行的NodeManager节点目录
Aggregation:
表示的是将日志信息放到HDFS文件系统上。
- 配置yarn-site.xml文件
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</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>
- 重启服务
YARN 服务全部重启
MRJobHistoryServer 服务也要重启
测试运行MapReduce
$ bin/yarn xxx.jar xx.class input output