Hadoop认识

小白的Hadoop的学习笔记 2024/4/23 9:33

文章目录

Hadoop认识linux虚拟机SecureCRT(Xshell)Hadoop干嘛的Hadoop安装start-dfs.shstart-yarn.shhadooop fs -put Linux数据路径 Hadoop路径hadoop fs -ls /利用javaAPI把d:/b.txt数据存储到Hadoop的/c.txt下从Hadoop上下载数据FileSystem的其他方法

块概念客户端的数据上传到Hadoop的文件系统分布式文件系统通透性容错

linux

系统,现在装在虚拟机上,开发中会直接装在服务器上

虚拟机

虚构的电脑

SecureCRT(Xshell)

远程连接,正常服务器在机房,去不了一点儿,SecureCRT相当于客户端,在客户端里操作linux

Hadoop干嘛的

Hadoop是一个软件,Hadoop装在Linux上

存数据运行数据处理程序(需要程序员来写)

Hadoop安装

start-dfs.sh

启动datanode、namenode、Secondarynamenode

要想往Hadoop上存数据,就必须启动这三个

简单的英文释义:

node节点Secondary次生data数据

datanode:

存储数据数据传递给其他datanode(socket)

namenode:账本(a.txt 2 1 centos1 2 centos2)

start-yarn.sh

启动nodemanager、resoucemanager

默认:数据在哪里,就用哪个nodemanager处理数据

简单的英文释义:

manager管理者resouce资源

hadooop fs -put Linux数据路径 Hadoop路径

把Linux的数据上传到Hadoop

hadooop fs -put 里面也是运行的java代码,只不过是别人写好的

经常也需要自己写,更灵活,例如下面的:利用javaAPI把d:/a.txt数据存储到Hadoop的/下

hadoop fs -ls /

利用javaAPI把d:/b.txt数据存储到Hadoop的/c.txt下

配置文件对象类获取Hadoop文件系统,填写ip和端口(FileSystem)填写要存到Hadoop下的什么路径(FSDataOutputStream)只是写了一个在账本上的名字读取Windows的文件(FileInputStream)while一块块的读,一块块的写关闭

package com.oracle.example;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import java.io.FileInputStream;

import java.net.URI;

public class Test1 {

public static void main(String[] args) {

//配置文件对象类,用于加载Hadoop的配置:比如:hdfs-default.xml 上传用于分块;可以改变块大小

Configuration configuration=new Configuration();

try {

//获取Hadoop文件系统 hdfs://192.168.38.101:9000 namenode

FileSystem fs=FileSystem.get(new URI("hdfs://192.168.38.101:9000"),configuration);

FSDataOutputStream out=fs.create(new Path("/c.txt"));//Hadoop路径,把文件传到这个位置,并写到namenode账本上

//byte[] bytes = "aaaaaaaaaaaa".getBytes();//把字符串转换成字节数组

FileInputStream inputStream=new FileInputStream("D:\\b.txt");

byte[] bytes = new byte[1024];

while (true){//一部分一部分的读

int read = inputStream.read(bytes);

if(read==-1){

break;

}else{

out.write(bytes);

}

}

// out.write(bytes);//写数据到datanode

out.close();

}

catch (Exception e){

e.printStackTrace();

}

}

}

联系namenode,在账本上创建a.txt 1 centos1 centos2把第一块数据通过IO流传递给centos1的datanodecentos1的datanode再把第一块传给centos2的datanode账本a.txt 2 centos2 centos3把第二块数据通过IO流传递给centos2的datanodecentos2的datanode再把第一块传给centos3的datanod

从Hadoop上下载数据

package com.oracle.example;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import java.io.FileOutputStream;

import java.net.URI;

public class Test2 {

public static void main(String[] args) {

Configuration configuration= new Configuration();

try {

FileSystem fs=FileSystem.get(new URI("hdfs://192.168.38.101:9000"),configuration);

FSDataInputStream open = fs.open(new Path("/b.txt"));//从Hadoop读数据

FileOutputStream out = new FileOutputStream("d:/aa.txt");

byte[] bytes = new byte[1024];

while (true){

int t=open.read(bytes);

if(t==-1){

break;

}else{

out.write(bytes,0,t);//这次读了多少个字节,写多少个字节,不然不满上面的1024会有一大堆空格来补全

}

}

open.close();

out.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

遇到的问题:

有一个冒号别写错了

FileSystem的其他方法

上传

fs.copyFromLocalFile(new Path("d:/aa.txt"),new Path("/cc.txt"));//上传

下载

fs.copyToLocalFile(new Path("/cc.txt"),new Path("d:/dd.txt"));// 下载

删除

fs.delete(new Path("/c.txt"),true);//删除

判断是否存在

boolean exists = fs.exists(new Path("/c.txt"));

if(exists){

System.out.println("文件存在");

}else {

System.out.println("文件不存在");

返回该路径下的文件和目录

RemoteIterator it = fs.listFiles(new Path("/"), true);//返回该目录下的文件和目录

next.getBlockSize()//块大小

next.getReplication()//副本数

getBlockLocations()//块位置

next.getPath()//路径

package com.oracle.example;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.LocatedFileStatus;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.fs.RemoteIterator;

import java.io.IOException;

import java.net.URI;

import java.net.URISyntaxException;

public class Test4 {

public static void main(String[] args) {

Configuration configuration=new Configuration();

try {

FileSystem fs=FileSystem.get(new URI("hdfs://192.168.38.101:9000"),configuration);

RemoteIterator it = fs.listFiles(new Path("/"), true);//返回该目录下的文件和目录

while (true) {

if (it.hasNext()) {

LocatedFileStatus next = it.next();

System.out.println(next.getBlockSize()+" "+next.getReplication()+" "+next.getBlockLocations()+" "+next.getPath());

//返回此文件存储对象中每个块的字节数,返回副本数,返回块位置,返回路径

}else {

break;

}

}

} catch (IOException e) {

e.printStackTrace();

} catch (URISyntaxException e) {

e.printStackTrace();

}

}

}

块概念

分块原因:存储的角度,分布式存储,成产环境中,4G

寻址

块不能太大,也不能太小

hdfs的块一般比磁盘块大,磁盘块一般为512,hdfs的默认128M

客户端的数据上传到Hadoop的文件系统

上传,块的分布

放到当前服务器上 放在另一个机架上 和2放在同一个机架上 随机

写过程

读过程

分布式文件系统

通透性

你感受不到它的分布式,就感觉只是一个文件,其实已经实现分布式存储

容错

如果某一个packge没传上,它会重新传

常见的分布式系统:GFS,HDFS,TFS-淘宝

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: