hadoop的HDFS和map-reduce

此处主要是将HDFS和map-reduce的基本原理写在这儿,免得以后忘记了找不到

HDFS:

大体框架如下:

NameNode:记录文件在DataNode的位置信息和元数据信息,类似index,真正的数据存储在DataNode节点

DataNode:存储的管理者,一次写入,多次读取(好处:不需要考虑一致性),将程序划分为许多大小为64M的数据块,分布并冗余存放在各个DataNode节点中

过程如下:

1,当客户端发起读任务时,查询NameNode,查询读写数据块具体位置,NameNode将分布信息返还给client

2,client再次一次对文件所在的DataNode发起读命令,DataNode将文件一次传入client

3,当发出的是写命令时候,namenode还需要负责查询是否有相同文件在系统中,没有则分配磁盘快来存储,HDFS中没有修改一说,修改就是删除原来的,重新存进去

4,为了维护NameNode和DataNode指尖的一致性,DataNode还需要定时向NameNode发送心跳程序,以便NameNode能获取各个存储节点的实时信息

HDFS特性:

1充分考虑硬件特性——错误和故障频发,所以设定了冗余机制

2由于hadoop应用特性基本是大量读,很少写或者改,所以HDFS不支持修改,修改只是删掉原来数据重新写入

HDFS优缺点:

1,便宜的存储了大量数据

2,流式访问,超大型数据处理的利器

3,不支持超低延迟查询

4,对大量小文件无法高效存储(归档解决)

5,不支持同时写(此问题在实际运用环境中其实不是很重要)


HDFS的命令行操作:

查询文件:

buptpwy@buptpwy-Lenovo:~/下载/hadoop/hadoop-0.20.2$ bin/hadoop dfs -ls
Found 5 items
drwxr-xr-x   - buptpwy supergroup          0 2015-05-07 15:04 /user/buptpwy/book
drwxr-xr-x   - buptpwy supergroup          0 2015-05-09 20:17 /user/buptpwy/book-out
drwxr-xr-x   - buptpwy supergroup          0 2015-05-09 20:01 /user/buptpwy/book-outbin
drwxr-xr-x   - buptpwy supergroup          0 2015-05-05 15:24 /user/buptpwy/c50test
drwxr-xr-x   - buptpwy supergroup          0 2015-04-28 15:50 /user/buptpwy/out

值得注意的事,在hadoop中没有当前目录的概念,所以我们要查询下级目录得自己指定:

buptpwy@buptpwy-Lenovo:~/下载/hadoop/hadoop-0.20.2$ bin/hadoop dfs -ls book
Found 1 items
-rw-r--r--   1 buptpwy supergroup         62 2015-05-07 15:04 /user/buptpwy/book/book

上传文件到HDFS:

buptpwy@buptpwy-Lenovo:~/下载/hadoop/hadoop-0.20.2$ bin/hadoop dfs -put /usr/local/hadoop/book/ book

-put后面第一个参数指定的是欲上传的文件,第二个参数指定的是要上传文件在HDFS的目录

从HDFS下载文件:

buptpwy@buptpwy-Lenovo:~/下载/hadoop/hadoop-0.20.2$ bin/hadoop dfs -get haha ~/ 桌面/


第一个参数指定的是在HDFS的位置,第二个是自己锁钥存储的位置

删除HDFS文件:

buptpwy@buptpwy-Lenovo:~/下载/hadoop/hadoop-0.20.2$ bin/hadoop dfs -rmr haha
Deleted hdfs://localhost:9000/user/buptpwy/haha

用-rm不级联删除

查看HDFS中的某个文件:

buptpwy@buptpwy-Lenovo:~/下载/hadoop/hadoop-0.20.2$ bin/hadoop dfs -cat book/book/part

map-reduce

先想象下如下一种应用:我们有从1955年到2015年世界各地的天气情况(有哪个地方气温多少,湿度多少气压多少等等),大小大概有30多个G,当我们要试图找出每年9月份温度超过30度的地方数怎么办?在hadoop或者说map-reduce系统中,我们用如下方法:

1.将超大文件传到HDFS系统中,由HDFS分部到集群中去(也就是将我们的数据传入集群)

2.编写map程序,通过jobtracker传送到各个节点运行,程序不是在发起访问的节点执行的!由于这种并行才能加快处理速度。(也就是编写程序,将每条9月份的记录找出温度超过90读的以key-value键值队传送)

3.编写suffler程序:此步骤不是必须,但是它可以将mapper的输出做一些预处理,减轻reducer的工作压力,也是在DataNode上执行(此处我们可以将相同年份的键值对合并)

4.reducer程序:将所有mapper或suffler输出合并,做一个汇总计算并输出结果,此处同样不是在发起访问节点执行!(将相同年份的键值合并。注:不同datanode传来的数据中可能有年份相同的键值对)

5.将结果传入hdfs文件系统。

mapper:分而治之,就近并行计算

reducer:汇总,总结mapper

suffler:减少数据传送工作,可以没有,可以多个,也可以没有

具体的流程或者工作架构请看下图:

1.申请作业,客户端调用jobclient接口申请发起作业

2获取作业ID,jobclient从jobtracker节点获取作业ID

3.上传MR资源:jobclien将我们要运行的MapReduce程序传上HDFS系统

4.提交作业:将作业信息发送给jobtracker。

5.作业初始化

6.获取分片信息,jobtracker从HDFS中获取哪些节点执行MR程序

7.任务分配,把任务分配给tasktracker(其实就是DataNode)。

8.取回MR资源。TaskTracker从HDFS中取得MR程序

9,10 加载环境并执行


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章