Hadoop02-MapReduce



一、Hadoop环境部署常见错误
1、在格式化namenode之后在自定义创建的tmp目录只会生成name的文件夹
2、name代表的就是namenode这块的信息
3、data代表的就是datanode这块的信息
4、tmp/dfs/name/current
5、指定fsimage文件的路径<name>dfs.namenode.name.dir</name>
-》在实际的工作中这个目录可以多配几个,保证元数据信息的安全
6、VERSION是一个Java属性的文件
namespaceID=1449791764
-》文件系统的唯一标识符,在格式化后生成的
clusterID=CID-dc0c2c65-03fe-4592-bb75-3ad9c99e7974
-》集群ID,每个集群都会有一个唯一的ID
cTime=0
-》表示NameNode创建的时间,之后如果更新了会更新时间戳
storageType=NAME_NODE
blockpoolID=BP-707742197-192.168.189.130-1492844537644
layoutVersion=-57
7、【问题一】集群ID不一致
namenode的ID
clusterID=CID-dc0c2c65-03fe-4592-bb75-3ad9c99e7974
datanode的ID
clusterID=CID-dc0c2c65-03fe-4592-bb75-3ad9c99e7974
-》原因:大部分情况下是由于多次格式化namenode导致
-》解决方法:
1、最直接的方法就是删除tmp目录下的所有子目录和文件,然后重新格式化
2、将集群ID修改为一致的
8、【问题二】进程启动之后消失了
-》首先去看logs下的log日志
-》哪个进程出错就去看哪个进程对应的log文件
-》注意查看日志的时候需要查看最新的时间点的日志信息
-》或者删除原来logs文件夹下的旧的日志,再重新启动进程生成最新的日志文件
9、【问题三】pid进程号文件错误
-》多用户混用造成pid文件冲突
-》解决方法:
-》删除/tmp目录下的所有.pid文件
-》使用一个用户去操作环境,生成新的pid文件
10、【问题四】主机名
-》主机名不能有下划线,有的话直接报错
11、【问题五】配置细节问题
-》检查配置文件,IP、主机名、映射等等是否配置正确
12、【问题五】权限问题
-》一定要注意所有的目录的所有者和所属组都是统一的一个用户
-》如果权限用户不统一会导致很多的错误
13、【问题六】端口号被占用,地址没有绑定上
-》使用netstat -ltun命令查看端口信息,是否被占用等情况
14、【问题七】HDFS的安全模式
-》有些时候的非正常的操作或者跑任务也会造成HDFS进入安全模式


二、Hadoop的配置文件
1、种类:
-》默认配置文件
-》每个模块对应一个配置文件:HDFS、MR、common、YARN
-》core-default.xml
-》hdfs-default.xml
-》yarn-default.xml
-》mapred-default.xml
-》保存在jar包中,hadoop-2.5.0\share\hadoop\对应模块中
-》用户自定义配置文件
-》core-site.xml
-》hdfs-site.xml
-》yarn-site.xml
-》mapred-site.xml
-》保存在etc/hadoop路径下
2、系统在一开始启动的时候就会去加载配置文件
-》包括了客户端在操作所有的命令的时候,都会去读取配置文件
-》比如:-ls 、 -mkdir等等
3、配置文件优先级
-》Hadoop的守护进程在启动的时候首先会去读取默认配置文件
-》再去读取自定义配置文件
-》优先级:自定义配置文件高于默认配置文件
-》自定义配置的属性会覆盖默认文件的属性
4、配置文件的分类
-》客户端
-》服务端
-》公共部分


三、SSH免密码登录
1、$ ssh-keygen -t rsa
-》-t代表指定加密类型
-》rsa代表加密类型中的一种
-》可以直接ssh-keygen
-》因为系统默认的就是rsa类型
2、发送
$ ssh-copy-id bigdata-senior01.ianybigdata.com
3、一般不建议使用start-all.sh脚本
4、Linux中的用户主目录权限一般为700或者是755
5、.ssh一般权限为700或者755
6、不要随意更改用户主目录的权限和.ssh目录权限以及下面的公钥和秘钥文件的权限,随意更改会直接导致ssh免密码登录失效


四、HDFS架构深入
1、副本数、块的存储、主从架构、启动读取文件
2、一次写入,多次读取-》考虑到效率问题
-》写入元数据和数据本身的时候就会产生很大量的资源消耗
-》如果支持HDFS文件的修改,会增加整个系统的实现难度,会考虑其他的因素
-》高吞吐量,批量处理,不是低延迟的访问
-》HDFS有升级和回滚的机制
-》修改块的大小
<name>dfs.blocksize</name>
<value>134217728</value>
3、namenode启动过程
-》读取fsimage和edits文件
-》加载到内存
-》根据文件和目录的路径来构建整个namenode元数据命名空间的镜像-》在内存中
-》fsimage文件在初始后没有记录的一块信息
-》每一个块对应到哪些datanodes节点上
-》每个datanode在启动的时候,会对本地磁盘进行扫描
-》每个datanode会自己上面存储的所有的块的信息汇报给namenode
-》namenode接收到datanode汇报的信息,并且保存到内存中
-》所以namenode在启动的时候会有一个等待的过程
-》等待所有datanode向namenode汇报块的状态信息
-》namenode在启动的过程中,在等待的过程中是处于一个【安全模式】
-》安全模式下文件系统是处于一个只读的状态
[-safemode enter | leave | get | wait]
$ bin/hdfs dfsadmin -safemode get
$ bin/hdfs dfsadmin -safemode enter
-》当达到一定标准的时候就会自动离开安全模式
<name>dfs.namenode.safemode.threshold-pct</name>
<value>0.999f</value>
-》在namenode启动之后datanode与namenode之间会有持续性的保持通信
-》心跳机制,告知主节点下面的从节点是否正常运行,默认情况下是每3秒发送一次
-》时间间隔是可以用户自定义的
<name>dfs.heartbeat.interval</name>
<value>3</value>
-》如果超过这个时间点长时间没有心跳,说明这个单个节点就出现故障
-》namenode在接收到datanode的心跳之后,会有一个反馈
-》反馈的过程中,namenode会附带一些命令给到datanode
<name>dfs.namenode.stale.datanode.interval</name>
<value>30000</value>
-》单独指定edits日志文件的存放位置
<name>dfs.namenode.edits.dir</name>
<value>${dfs.namenode.name.dir}</value>
-》单独指定fsimage日志文件的存放位置
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
-》指定datanode本地磁盘存储的位置
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
-》这些属性参数在实际的工作中会比较常用
-》集群中的所有机器都会有相同的配置文件信息



五、克隆虚拟机
1、注意克隆先关闭所有正在运行的服务,然后关机
2、虚拟机-》管理-》克隆
-》虚拟机当前状态
-》创建完整克隆
-》修改名称以及本地磁盘存放的位置
-》等待克隆完成
3、克隆完成之后进入新的虚拟机进行配置更改
-》IP、主机名、、映射、mac地址等等信息都要修改,修改后建议重启下系统
4、建议克隆两台即可,加上原来的那台组成三台模拟一个分布式环境就可以了
-》不需要克隆太多
-》为后面完全分布式做准备
步骤:
1、vi /etc/udev/rules.d/70-persistent-net.rules 
-》复制拷贝mac地址
-》将NAME=eth1改为eht0
2、将mac地址拷贝到/etc/sysconfig/network-scripts/ifcfg-eth0文件中
3、重启下网络service network restart
4、修改IP地址
5、修改主机名/etc/sysconfig/network
6、修改映射/etc/hosts,要注意
-》比如是三台机器,那么所有的机器/etc/hosts文件中都需要有所有机器的映射关系
-》包括windows本地
192.168.189.130 bigdata-senior01.ianybigdata.com
192.168.189.132 bigdata-senior02.ianybigdata.com
192.168.189.134 bigdata-senior03.ianybigdata.com
7、将所有机器的ssh免密码登录设置,设置前需要先设置网络映射
-》每台机器都是执行
ssh-keygen -t rsa
ssh-copy-id xxx主机名

六、MapReduce计算模型
1、计算过程抽象到两个函数
-》map()
-》reduce()
2、input -> map -> shuffle -> reduce -> output  ->提交yarn
-》MapReduce可以没有reduce部分,但是必须要有map部分
3、MapReduce可以编写一个固定的模板格式
4、键值对<keyvalue>-》整个程序的流向形式
-》输入数据如何转换为<keyvalue>
-》map如何来处理<keyvalue>
-》reduce如何来处理<keyvalue>
5、以单词统计wordcount为例:
hadoop mapreduce <keyvalue> <0,hadoop mapreduce>
hadoop spark <keyvalue>
hadoop hive <keyvalue>
hello hadoop <keyvalue>
hive hbase <keyvalue>
shanghai anybigdata <keyvalue>
-》MR框架本身有一个默认的实现
-》一行就是一个<keyvalue>
-》key是偏移量
-》value是这一行的值
-》分割单词,看有多少个单词
<0,hadoop mapreduce> -》分割   hadoop  mapreduce
-》统计单词出现的次数,出现一次就记录一次
-》<hadoop,1> <mapreduce,1>
-》<hadoop,1> <spark,1>
-》<hadoop,1> <hive,1>
-》reduce阶段-》将相同key的value放在一起
-》放到一个集合中<hadoop,list(1,1,1)>  -》 values
-》reduce默认情况下数目只有一个,根据实际的业务可以设置多个


七、window环境下配置eclipse插件
1、hadoop-2.5.0.tar.gz解压到windows本地
2、windows下安装JDK和eclipse
-》JAVA_HOME
-》PATH
3、解压maven到windows本地
4、在windows本地新建一个m2命名的目录
5、将repository仓库放到m2目录下
6、到maven目录下的conf目录中找到settings.xml文件拷贝到m2目录下
7、回到eclipse选择maven的安装路径,Installations
8、User Settings指定settings.xml文件的地址
9、添加pom.xml中的依赖
10、winutils.exe和hadoop.dll放到本地windows的Hadoop下的bin目录下即可
11、将插件hadoop-eclipse-plugin-2.5.1.jar放到eclipse\plugins目录下
12、重启eclipse
13、注意需要先检查一下windows中的用户的用户名是否带有空格
14、点击eclipse右上角的视图,创建需要连接的系统机器
15、在工程下新建一个包然后将DiskChecker.java放下去
16、在工程下新建一个目录然后放进三个配置文件
core-site.xml和hdfs-site.xml以及log4j
17、如果万一出现依赖包没有下载成功的情况出现
-》第一种方式重新update工程
-》第二种方式先删除repository\org\apache\hadoop下的所有jar包然后重新update工程下载


八、MapReduce的编程模板
1、map和reduce都分别需要继承两个基类,Mapper和Reducer
-》两个函数map()和reduce()
2、还有一个上下文context,封装了很多东西,便于编程
3、MapReduce模板分为三大块
Mapper区
map()
Reducer区
reduce()
Driver区
job
4、in代表的是输入,out代表输出
Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>四个参数代表四个类型
5、Hadoop有自己的基本数据类型,和Java相似
-》Hadoop的基本数据类型都需要继承一个叫做writable的接口
-》字符串类型就是Text,封装好了
6、map的输出就是reduce的输入


九、编写单词统计wordcount程序
1、数据输入map到文件中去一行行读取文件内容<keyvalue>
2、本地测试和运行yarn,一个适合查看结果集,一个测试环境
3、yarn上运行必须打jar包,打jar包过程中一定注意需要指定主类,main class
$ bin/yarn jar wordcount.jar /user/anybigdata/mapreduce/input /user/anybigdata/mapreduce/output4

一个块对应一个map

十、shuffle
1、发生的阶段map -> reduce中间的过程
2、流程
input数据输入--------》<keyvalue>----》<0,hadoop spark>
map接收输入的数据----》<0,hadoop spark>
|
<hadoop,1> <spark,1>.....
3、进入shuffle阶段
map的处理结果输出到内存中(每个map任务)
-》内存大小,默认情况下是100MB -》用户可以自定义
<name>mapreduce.task.io.sort.mb</name>
<value>100</value>
-》环形缓冲区:<hadoop,1> <spark,1>.....
-》当内存大小达到一定大小的时候,默认达到80% -》用户可以自定义
<name>mapreduce.map.sort.spill.percent</name>
<value>0.80</value>
-》触发溢写操作spill
-》溢写到本地磁盘目录中
-》1、分区partition,划分区域
-》决定了map输出的数据被哪个reduce任务进行处理
-》默认情况下使用的哈希值取余的方式来指定规则的
-》分区规则可以用户自己指定
-》2、排序sort
-》对分区中的数据进行排序
-》在内存中排序速度快
-》比较
-》3、溢写spill
-》将内存中的数据溢写到本地磁盘目录中
-》溢写的操作是单独开启一个线程来进行的
-》所以后续的数据可以继续的写入
-》当不断的溢写之后,在本地磁盘就会形成很多的溢写文件
-》4、合并merge
-》将各个分区的文件合并在一起,形成一个大文件
=================================map端=========================================
=================================reduce端======================================
-》5、去map上开启线程通过http的网络方式去拷贝对应的数据
-》加载到内存,同样内存也有大小
-》流程同map一样
-》6、分组group:将相同key的value放在一起
-》判断key是否相同就涉及到了比较,定义比较器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值