hadoop入门阅读

一、简介
hadoop与其他分布式系统的区别:
其他系统关注于数据的移动,即将需要计算的数据从server端移到client端,然后进行计算,但是当数据量很大的时候,移动数据需要很大的开销
hadoop则是通过移动计算代码到数据所在的机器,在该机器进行运算,然后返回结果,这样就避免了移动数据带来的大开销,客户端发送MapReduce程序进行计算
这些程序都很小,hadoop负责将该程序移到数据所在的机器然后在本机进行计算
hadoop与sql的区别:
sql都是结构化的数据,而hadoop处理的是非结果化的数据,比如文本文件
sql有固定的schema,数据存入表中,而hadoop存储的是key/value对作为基本存储单元
hadoop的数据能有来源于任何地方,通常都通过编程将它们转换成key/value对
sql是在线处理,hadoop属于离线批量处理;hadoop更多处理的是数据分析,属于一次写入,多次读写
但是他们互为补充,sql可以作为hadoop之上的执行引擎

二、安装配置
hadoop包括下面接个角色:
NameNode:是hdfs的管理者,指挥数据节点执行任务,记录每个文件分为多少block,每个block存在哪些机器上,它本身并不实际存储数据,它是基于内存和IO的
不能将NameNode和TaskTracker置于一台机器上
DataNode:实际存储文件块,负责读/写文件块内容,在slave/master中DataNode除了与NameNode建立连接,也会与其他DataNode建立连接,复制它们的冗余数据
系统每次启动的时候dataNode都会向nameNode报告它所存储的块信息,它也会定期向namenode报告自己的生成状态
SecondaryNameNode(SNN):它也是放在属于自己的机器上,该机器没有其他的TaskTracker或datanode,它不会和datanode通信,它只会和namenode通信,作为namenode的一个
快照,它是为了防止namenode的单点失效,尽可能的保证系统少丢失数据;但是当namenode失效后必须人工切换到SNN,该过程不能自动完成
JobTracker:应用程序与hadoop之间的桥梁,当应用提交到hadoop后,它负责确定程序执行计划,确定哪个文件执行,为不同的datanode制订不同的task并监控所有的task执行一旦某个task失败,它会根据复制块信息在其他datanode重新执行该task
一个cluster里只会有一个JobTracker,它是作为分布式计算的master
TaskTracker:作为分布式计算的slave,它负责datanode上的具体计算任务,它执行JobTracker分配的任务,虽然在一个slavenode只会有一个TaskTracker
但是它可以跨jvm并行的执行多个map,reduce

一般的部署:
在同一个master机器上部署NameNode、JobTracker 在多个slave机器上部署DataNode、TaskTracker
SNN,最好是部署到单独的一台机器,如果情况不允许,可以将其部署到其中的一台slave中
对于更大的集群NameNode、JobTracker可以分开部署

hadoop机器间通过ssh进行通讯,所以要预先生成标准的key,value对,让所有机器ssh免登录
对于hadoop,集群里所有的机器都应该有相同的username

三、hadoop各容器介绍
1、hdfs
hadoop中存储程序需要执行的数据,它是面向于超大数据的分布式文件存储系统
使用类似于shell的命令进行文件操作,典型操作如下:
hadoop fs -help  该命令查询所有的操作
hadoop fs –mkdir /user/Administrator 创建目录(如果是多个目录,自动创建级联目录,类似于linux的mkdir -p)
hadoop fs -ls/user/Administrator  列出该目录下的所有文件及子目录
hadoop fs -put example.txt/user/Administrator/example.txt 把文件放到hdfs的某个目录下
hadoop fs -get /user/Administrator/example.txt/loal  把hdfs的文件拷贝到当前目录/local下  
hadoop fs -cat /user/Administrator/example.txt 直接查看该文件
hadoop fs –rm  /user/Administrator/example.txt删除文件,也可以删除没有文件的空路径

在hdfs中最常用的是把新增加的文件合并到hdfs已有的文件中,将它们合并成一个大文件,因为hdfs能处理超大的文件(比如要分析apache的日志),直接使用类shell命令不能完成该工作
需要借助java api客户端进行操作if(!fs.exists(dst)) //不存在就创建
  out = fs.create(dst);
else
 out=fs.append(dst); //存在就增加

调用fs.append(dst)
此时会报Append to hdfs not supported. Please refer todfs.support.append configuration parameter.错误
需要在hdfs-site.xml中增加如下设置
<property>
   <name>dfs.support.append</name>
   <value>true</value>
</property>
2、MapReduce
在MapReduce实现了Writable接口的类可以作为value,实现了WritableComparable(它其实继承了Writable andjava.lang.Comparable<T>)既可作为key,也可作为value
做为key的类必须实现Comparable,因为在reduce时需要排序
hadoop提供了基本的类型实现,也可以自定义数据类型只要符合上面的规则
无论是mapper还是reducer都必须实现 MapReduceBase基类,它提供了2个方法:
void configure( JobConf job) —In this function you can extract theparameters set
either by the configuration XML files or in the main class of yourapplication.
Call this function before any data processing begins.
void close ()—As the last action before the map task terminates,this function
should wrap up any loose ends—database connections, open files, andso on.

mapper的过程是对一个给定的<k1,v1>产生list(<k2,v2>)
reducer的过程是对一个<k2,Iterator<v2>> 产生 <k3,v3>
当reducer接收到不同的mapper输出时,它首先会根据输出的key进行排序,然后把相同的key进行group,他们对应的值存放到Iterator中产生<k2,Iterator<v2>>
然后再调用reduce方法

Partitioner—负责分发mappers的输出到不同的reducer
默认系统提供HashPartitioner作为分发标准:它会根据key的hashcode来决定将该输出路由到哪一个reducer进行处理,用户可以自定义Partitioner
public class EdgePartitioner implementsPartitioner<Edge, Writable>@Override
public int getPartition(Edge key, Writable value, intnumPartitions)return key.getDepartureNode().hashCode() % numPartitions;//返回0到reducer数量之间的整数,决定路由到哪一个reducer处理@Override
public void configure(JobConf conf) { }
}

Combiner--local reducer
职责:当mapper输出后在通过Partitioner分发到各个reducer之前,先在本地执行reducer

默认情况下mapper以行的偏移量作为key,以行内容作为value

要注意输入分片(input split)是逻辑划分hdfs中的文件blocks是物理划分,当他们一致时,效率会非常高,但是实际情况是他们从未达到一致,输入分片有可能会跨域多个blocks


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值