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
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
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-淘宝
相关链接
发表评论