大数据学习---Hadoop的深入学习

Hadoop生态圈

存储数据HDFS(Hadoop Distributed File System),运行在通用硬件上的分布式文件系统。具有高度容错性、高吞吐量的的特点。

处理数据MapReduce,它是一种编程模型,Map(映射)和Reduce(归约),它极大地方便了分布式并行编程,与hdfs的高度融合,它是基于java来进行编程的。

数据仓库工具Hive,处理结构化SQL查询功能,将sql语句解释为MapReduce编程进行数据的处理,只能进行结构化的查询。

Pig MapReduce之上的高级过程语言,查询大型的半结构化数据集,处理非结构化数据。

Hadoop的优势

低成本 基于来源软件,运行与通用硬件平台。

高扩展性 在可用的计算机集簇间分配数据并完成计算任务,这些集簇可以方便的扩展到数以千计的节点中。

高效性 在节点之间动态分配计算任务并保证各个节点的动态平衡,处理速度非常快。

高容错性 自动保存数据的多个副本,并且能够自动将失败的任务重新分配。

Hadoop三大核心设计

MapReduce Map:任务分解 Reduce:结果汇总

HDFS NameNode:管理里文件元数据 DataNode:存储物理文件 Client:获取文件的各种API

Hbase 列式内存数据库,它是一个适用于非结构化数据存储的数据库,基于列存储,不同行可有不同数据列,保留数据多个时间版本。

另:  Zookeeper 分布式应用程序协调服务提供一致性服务。

HDFS的体系结构

NameNode:即元数据节点,用来管理文件系统的命名空间,记录每个文件数据在各个DataNode上的位置和副本信息,协调客户端对文件的访问。

元数据文件:VERSION、seen_txid、fsimage_*、fsimage_*.md5、edits_*

DataNode:即数据节点用来存储数据,负责所在物理节点的存储管理,一次写入,多次读取(不修改)。

文件由数据块组成,典型的块大小是64MB,数据块尽量散布到各个节点。

SecondaryNameNode:NameNode的一个快照,周期性的备份namenode,记录namenode中的metadata及其他数据,可以用来恢复Namenode

dfs.namenode.name.dir/current/文件夹的几个文件:

VERSION:存放的是版本信息,文件系统的标示符

seen_txid:存放事务ID的文件,它里面的数字要与edits的尾数一致,也就是与edits_inprogress_000000000*后边的数字一致,inprogress是正在使用的edits文件

fsimage_*、fsimage_*.md5、edits_*:存放的是文件的元数据信息。

HDFS文件读取的过程

HDFS文件读取的过程如下:

1).使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;

2).Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址;

3).客户端开发库Client会选取离客户端最接近的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.

4).读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;

5).当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。

6).读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。

HDFS写入文件的过程

HDFS写入文件的过程:

1).使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;

2).Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;

4).当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。

开始以pipeline(管道)的形式将packet写入所有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。

5).最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。

6).如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。

HDFS的shell操作

1. 直接访问Hadoop程序

在/etc/prifile中加入

export HADOOP_HOME=/home/hduser/hadoop (hadoop的安装目录)
export PATH=$HADOOP_HOME/bin:$PATH

source /etc/profile 是环境变量生效

2. HDFS命令格式:

HDFS基本命令(在hadoop目录下执行为例)

bin/hadoop fs -cmd <args>

cmd:具体的操作,基本上与UNIX的命令行相同

<args>:有时需包含参数

例如:bin/hadoop fs -ls /

3. 常见的hadoop命令解析:

put命令只能从本地的文件复制到HDFS上;

get命令将HDFS上的文件复制到本地;

cp命令只能在相同的文件系统上互相复制文件。这三个命令都可以复制多个文件。复制单个文件时,目标路径可以是目录也可以是文件,目标路径是目录时,文件名不改变,目标路径是文件时,可以修改文件名;复制多个文件时,目标路径必须是目录,文件名不能修改。

copyFromLocal命令,此命令与put命令相似,区别是此命令只能复制一个文件。目标路径是目录时,文件名不改变,目标路径是文件时,可以修改文件名。

copyToLocal命令,此命令与get命令相似,区别是此命令只能复制一个文件。目标路径是目录时,文件名不改变,目标路径是文件时,可以修改文件名。

mv命令只能在相同的文件系统上移动文件,可以移动多个文件。标路径是目录时,文件名不改变,目标路径是文件时,可以修改文件名。

以上所有目录必须是存在的。

4. 常见的hadoop命令示例

mkdir 使用方法:hadoop fs -mkdir <paths>

      示例:hadoop fs -mkdir /user

ls 列出path目录下的内容,包括文件名,权限,所有者,大小和修改时间

  hadoop fs -ls /

  hadoop fs -ls -R /

put 使用方法:hadoop fs -put <localsrc> ... <dst>

  从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。

  hadoop fs -put localfile /user/ 拷贝localfile文件到hdfs的user目录下

  hadoop fs -put localfile1 localfile2 /user/ 同时拷贝localfile1和localfile2文件到hdfs的user目录下

  hadoop fs -put - /user/hadoopfile 在hadoopfile文件里手工录入内容(录入之前hadoopfile文件不存在),按Ctrl+C键录入结束 

get 使用方法:hadoop fs -get [-ignorecrc] [-crc]    <src> <localdst> 复制文件到本地文件系统

  示例:hadoop fs -get /user/hadoop/file localfile

cat 使用方法:hadoop fs -cat URI [URI ...]

  示例:hadoop fs -ls /user/hadoopfile 查看文件内容

rm 使用方法:hadoop fs -rm URI [URI ...]

  删除指定的文件。只删除非空目录和文件。请参考rmr命令了解递归删除。

  示例:hadoop fs -rm /user/read.txt 删除文件

  示例:hadoop fs -rm  -f /user/read.txt 强制删除文件

rmr 使用方法:hadoop fs -rmr URI [URI ...]

  示例:hadoop fs -rmr /user/     删除/usr/下所有的文件和目录

delete的递归版本。

  示例:hadoop fs -rm -r /user/hadoop/dir

getmerge 使用方法:hadoop fs -getmerge <src> <localdst> [addnl]

  接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于指定在每个文件结尾添加一个换行符。

  示例:hadoop fs -getmerge /input2 file2.txt

mv 使用方法:hadoop fs -mv URI [URI ...] <dest>

  将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。

  不允许在不同的文件系统间移动文件。

  也可以重命名文件

  示例:hadoop fs -mv /hadoop/file1 /hadoop/file2

      hadoop fs -mv /hadoop/file1.txt  /hadoop/file1.txt.bak.0722  

stat 使用方法:hadoop fs -stat URI [URI ...]

  返回指定路径的统计信息。

  示例:hadoop fs -stat /input2

tail 使用方法:hadoop fs -tail [-f] URI

  将文件尾部1k字节的呢绒输出到stdout。支持-f选项,行为和Unix中一致。

  示例:hadoop fs -tail pathname

chmod 使用方法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]

  设为所有人皆可读取

  chmod a+r file1.txt

chown 使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI]

touchz 使用方法:hadoop fs -touchz URI [URI ...]

  创建一个0字节的空文件。

  示例:hadoop fs -touchz pathname

copyToLocal 使用方法:hadoop fs -copyToLocal [ignorecrc] [-crc] URI <localdst>

  除了限定目标路径是一个本地文件外,和get命令类似。

copyFromLocal 使用方法:hadoop fs -copyFromLocal <localsrc> URI

  除了限定源路径是一个本地文件外,和put命令相似。

cp 使用方法:hadoop fs -cp URI [URI ...] <dest>

  将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。

  示例: hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2

du 使用方法:hadoop fs -du URI [URI ...]

  显示目录中所有文件的大小

  示例:hadoop fs -du /user/hadoop/dir1

du -s 使用方法:hadoop fs -du -s <args>

  显示文件的大小

  常用:hadoop fs -du -h /srv/smart/hhh.txt

expunge 使用方法:hadoop fs -expunge
  清空回收站
回收站: hadoop fs -ls /安装目录下/.trash
       Hadoop文件删除后可以放在回收站内

  

5. HDFS的API方式访问

Eclipse中hadoop环境的建立

Configuration类:该类的对象封装了客户端或者服务端的配置。
FileSystem类:该类的对象是一个文件系统对象,可以用该队想的一些方法来对文件进行操作。
FSDataInputStream和FSDataOutputStream:这两个类是HDFS中的输入输出流。

基本流程:
得到Configuration对象
得到FileSystem对象
进行文件操作(读写、删除、改名)
所需引入的库

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

文件操作前的准备工作
获取配置信息
Configuration conf = new Configuration();
建立文件系统对象
FileSystem fs = FileSystem.get(conf);
写文件
Path dstPath = new Path(dst);//目标路径
FSDataOutputStream outputStream = fs.create(dstPath);//打开一个输出流
outputStream.write(contents);
outputStream.close();
fs.close();
读文件
InputStream in = null;
in = fs.open(srcPath);
IOUtils.copyBytes(in,System.out,4096,false);//复制到标准输出流
IOUtils.closeStream(in);
上传文件到HDFS
Path srcPath = new Path(src);//原路径
Path dstPath = new Path(dst);//目标路径
fs.copyFromLocalFile(false,srcPath,dstPath);
前面参数是指是否删除原文件,true为删除,默认为false
获取指定文件信息
FileStatus[] fileStatus = fs.listStatus(dstPath);
boolean isok=fs.rename(oldPath,newPath);
boolean isok=fs.deleteOnExit(path);
boolean isok=fs.mkdirs(srcPath);

6. HDFS API具体操作

  1 打开eclipse建立一个工程,将代码copy,逐步运行。
  2
  3 在工程中建立一个conf目录,注意先将相关的配置文件拷贝过去主要是三个文件core-site.xml , mapred-site.xml,hdfs-site.xml
  4
  5 并在project属性中设置java build path 单击addfolder 将conf目录加上
  6
  7 import java.io.FileInputStream;
  8
  9 import java.io.IOException;
 10
 11 import java.io.InputStream;
 12
 13 import org.apache.hadoop.conf.Configuration;
 14
 15 import org.apache.hadoop.fs.FSDataOutputStream;
 16
 17 import org.apache.hadoop.fs.FileStatus;
 18
 19 import org.apache.hadoop.fs.FileSystem;
 20
 21 import org.apache.hadoop.fs.Path;
 22
 23 import org.apache.hadoop.io.IOUtils;
 24
 25 public class HdfsFile {
 26
 27     //创建新文件
 28
 29     public static void createFile(String dst , byte[] contents) throws IOException{
 30
 31         Configuration conf = new Configuration();
 32
 33         FileSystem fs = FileSystem.get(conf);
 34
 35         Path dstPath = new Path(dst); //目标路径
 36
 37         //打开一个输出流
 38
 39         FSDataOutputStream outputStream = fs.create(dstPath);
 40
 41         outputStream.write(contents);
 42
 43         outputStream.close();
 44
 45         fs.close();
 46
 47         System.out.println("文件创建成功!");
 48
 49     }
 50
 51     //上传本地文件
 52
 53     public static void uploadFile(String src,String dst) throws IOException{
 54
 55         Configuration conf = new Configuration();
 56
 57         FileSystem fs = FileSystem.get(conf);
 58
 59         Path srcPath = new Path(src); //原路径
 60
 61         Path dstPath = new Path(dst); //目标路径
 62
 63         //调用文件系统的文件复制函数,前面参数是指是否删除原文件,true为删除,默认为false
 64
 65         fs.copyFromLocalFile(false,srcPath, dstPath);
 66
 67         //打印文件路径
 68
 69         System.out.println("Upload to "+conf.get("fs.default.name"));
 70
 71         System.out.println("------------list files------------"+"\n");
 72
 73         FileStatus [] fileStatus = fs.listStatus(dstPath);
 74
 75         for (FileStatus file : fileStatus)
 76
 77         {
 78
 79             System.out.println(file.getPath());
 80
 81         }
 82
 83         fs.close();
 84
 85     }
 86
 87     //文件重命名
 88
 89     public static void rename(String oldName,String newName) throws IOException{
 90
 91         Configuration conf = new Configuration();
 92
 93         FileSystem fs = FileSystem.get(conf);
 94
 95         Path oldPath = new Path(oldName);
 96
 97         Path newPath = new Path(newName);
 98
 99         boolean isok = fs.rename(oldPath, newPath);
100
101         if(isok){
102
103             System.out.println("rename ok!");
104
105         }else{
106
107             System.out.println("rename failure");
108
109         }
110
111         fs.close();
112
113     }
114
115     //删除文件
116
117     public static void delete(String filePath) throws IOException{
118
119         Configuration conf = new Configuration();
120
121         FileSystem fs = FileSystem.get(conf);
122
123         Path path = new Path(filePath);
124
125         boolean isok = fs.deleteOnExit(path);
126
127         if(isok){
128
129             System.out.println("delete ok!");
130
131         }else{
132
133             System.out.println("delete failure");
134
135         }
136
137         fs.close();
138
139     }
140
141     //创建目录
142
143     public static void mkdir(String path) throws IOException{
144
145         Configuration conf = new Configuration();
146
147         FileSystem fs = FileSystem.get(conf);
148
149         Path srcPath = new Path(path);
150
151         boolean isok = fs.mkdirs(srcPath);
152
153         if(isok){
154
155             System.out.println("create dir ok!");
156
157         }else{
158
159             System.out.println("create dir failure");
160
161         }
162
163         fs.close();
164
165     }
166
167     //读取文件的内容
168
169     public static void readFile(String filePath) throws IOException{
170
171         Configuration conf = new Configuration();
172
173         FileSystem fs = FileSystem.get(conf);
174
175         Path srcPath = new Path(filePath);
176
177         InputStream in = null;
178
179         try {
180
181             in = fs.open(srcPath);
182
183             IOUtils.copyBytes(in, System.out, 4096, false); //复制到标准输出流
184
185         } finally {
186
187             IOUtils.closeStream(in);
188
189         }
190
191     }
192
193     public static void main(String[] args) throws IOException {
194
195         //测试上传文件
196
197         //uploadFile("/home/hadoop/music1.txt","hdfs://master:9000/user/hadoop/test.txt");
198
199         //测试创建文件
200
201       //byte[] contents =  "hello world 世界你好\n".getBytes();
202
203        //createFile("hdfs://master:9000/user/hadoop/test1/d.txt",contents);
204
205         //测试重命名
206
207         //rename("hdfs://master:9000/user/hadoop/test1/d.txt", "hdfs://master:9000/user/hadoop/test1/dd.txt");
208
209         //测试删除文件
210
211         //delete("hdfs://master:9000/user/hadoop/test1/d.txt"); //使用相对路径
212
213        //delete("hdfs://master:9000/user/hadoop/test1");    //删除目录
214
215         //测试新建目录
216
217        // mkdir("hdfs://master:9000/user/hadoop/test1");
218
219         //测试读取文件
220
221         //readFile("hdfs://master:9000/user/hadoop/test1/d.txt");
222
223     }
224
225 }

原文地址:https://www.cnblogs.com/ftl1012/p/9350261.html

时间: 2024-11-08 23:47:29

大数据学习---Hadoop的深入学习的相关文章

大数据新手的0基础学习路线,从菜鸟到高手的成长之路

大数据作为一个新兴的热门行业,吸引了很多人,但是对于大数据新手来说,按照什么路线去学习,才能够学习好大数据,实现从大数据菜鸟到高手的转变.这是很多想要学习大数据的朋友们想要了解的. 今天我们就来和大家分享下大数据新手从0开始学习大数据,实现菜鸟到高手的转变的学习路线.希望能够帮助想要学习大数据的朋友. 如果你想要学好大数据最好加入一个好的学习环境,可以来这个Q群529867072 这样大家学习的话就比较方便,还能够共同交流和分享资料 以下是大数据新手学习路线的正文: Linux:因为大数据相关软

大数据能做什么,为什么学习大数据

Hadoop和大数据是这两年最火的词儿们之一,越来越多的公司对这个东西感兴趣,但是我接触到的大多数公司里的人,无论是技术人员还是老板.都不知道怎么能把这些东西用于改善自己公司的业务.在解答的过程中,提炼出几个要点,记录一下. 大数据和云是不是一回事? 这是最容易混淆的概念之一,我个人认为这是两回事,云服务,无论是云主机还是云存储还是云的其他应用,都是向用户提供一个接口,但这个接口的后端是虚拟机技术,或者分布式存储技术,或者其他分布式计算技术等等.简而言之,云的概念就是我向你提供服务,而你不需要关

细细品味大数据--初识hadoop

初识hadoop 前言 之前在学校的时候一直就想学习大数据方面的技术,包括hadoop和机器学习啊什么的,但是归根结底就是因为自己太懒了,导致没有坚持多长时间,加上一直为offer做准备,所以当时重心放在C++上面了(虽然C++也没怎么学),计划在大四下有空余时间再来慢慢学习.现在实习了,需要这方面的知识,这对于我来说,除去校招时候投递C++职位有少许影响之外,无疑是有很多的好处. 所以,接下来的很长日子,我学习C++之外的很多时间都必须要花在大数据上面了. 那么首先呢,先来认识一下这处理大数据

大数据之hadoop,国内首部:Zookeeper从入门到精通课程分享

对这个课程感兴趣的朋友可以加我QQ2059055336和我联系. ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookeeper的Fast Fail 和 Leader选举特性大大增强了分布式集群的稳定和健壮性,并且解决了Master/Slave模式的单点故障重大隐患,这是越来越多的分布式产品如HBase.Storm(流计算).S4(流计算)等强依赖Zoo

大数据平台Hadoop的分布式集群环境搭建

1 概述 本文章介绍大数据平台Hadoop的分布式环境搭建.以下为Hadoop节点的部署图,将NameNode部署在master1,SecondaryNameNode部署在master2,slave1.slave2.slave3中分别部署一个DataNode节点 NN=NameNode(名称节点) SND=SecondaryNameNode(NameNode的辅助节点) DN=DataNode(数据节点)2 前期准备 (1)准备五台服务器 如:master1.master2.slave1.sla

大数据云计算高级实战Hadoop,Flink,Spark,Kafka,Storm,Docker高级技术大数据和Hadoop技能

大数据和Hadoop技能可能意味着有你的梦想事业和被遗忘之间的差异.骰子引用:“技术专业人员应该志愿参与大数据项目,这使他们对目前的雇主更有价值,对其他雇主更有销路.” 1.与Hadoop的职业:根据福布斯2015年的一份报告,约有90%的全球性组织报告了中高级别的大数据分析投资,约三分之一的投资者称其投资“非常重要”.最重要的是,约三分之二的受访者表示,数据和分析计划对收入产生了重大的可衡量的影响. Hadoop技能是需求的 - 这是不可否认的事实!因此,IT专业人士迫切需要使用 Hadoop

大数据和Hadoop什么关系?为什么大数据要学习Hadoop?

大数据是一系列技术的统称,经过多年的发展,大数据已经形成了从数据采集.整理.传输.存储.安全.分析.呈现和应用等一系列环节,这些环节涉及到诸多大数据工作岗位,这些工作岗位与物联网.云计算也都有密切的联系. Hadoop是一个由Apache基金会所开发的分布式系统基础架构,是用Java语言开发的一个开源分布式计算平台,适合大数据的分布式存储和计算平台. 广义上讲,大数据是时代发展和技术进步的产物.Hadoop只是一种处理大数据的技术手段. Hadoop是目前被广泛使用的大数据平台,本身就是大数据平

洞悉大数据:Hadoop和云分析七大误解

七大误解:大数据与hadoop 对于Hadoop技术而言,可以说是开源领域的传奇,然而如今业界还伴随着一些流言,这些流言可能会导致IT高管们带着“有色”的观点去制定策略. 从IDC分析师报告中2013年数据存储上的增长速度将达到53.4%,AT&T更是声称无线数据的流量在过去的5年内增长200倍,从互联网内容.电子邮件.应用通知.社交消息以及每天接收的消息都在显着的增长,这也是众多大企业都聚焦大数据的原因所在. 毫无疑问,Hadoop成为解决大数据需求的主要投资领域之一,而类似Facebook等

大数据测试之hadoop命令大全

大数据测试之hadoop命令大全 1.列出所有Hadoop Shell支持的命令  $ bin/hadoop fs -help2.显示关于某个命令的详细信息  $ bin/hadoop fs -help command-name3.用户可使用以下命令在指定路径下查看历史日志汇总  $ bin/hadoop job -history output-dir这条命令会显示作业的细节信息,失败和终止的任务细节.4.关于作业的更多细节,比如成功的任务,以及对每个任务的所做的尝试次数等可以用下面的命令查看 

大数据:Hadoop入门

大数据:Hadoop入门 一:什么是大数据 什么是大数据: (1.)大数据是指在一定时间内无法用常规软件对其内容进行抓取,管理和处理的数据集合,简而言之就是数据量非常大,大到无法用常规工具进行处理,如关系型数据库,数据仓库等.这里“大”是一个什么量级呢?如在阿里巴巴每天处理数据达到20PB(即20971520GB). 2.大数据的特点: (1.)体量巨大.按目前的发展趋势来看,大数据的体量已经到达PB级甚至EB级. (2.)大数据的数据类型多样,以非结构化数据为主,如网络杂志,音频,视屏,图片,