1、 Linux 文件信息
[root@localhost hadoop]# hdfs dfs -ls /
drwxr-xr-x - root supergroup 0 2017-08-12 22:01 /a说明: d后面以3个字符为一组:
d打头表示目录 当前用户 同组用户 其他人
d rwx r-x r-x
2、Hadoop基于Java实现目录创建
package demo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
/**
* 依赖的jar包导入进来
* /root/training/hadoop-2.4.1/share/hadoop/common
* /root/training/hadoop-2.4.1/share/hadoop/common/lib
*
* /root/training/hadoop-2.4.1/share/hadoop/hdfs
* /root/training/hadoop-2.4.1/share/hadoop/hdfs/lib
*
* 操作HDFS,创建一个目录
* 1、此时运行会报错: 权限问题: windows: java 用户: leveno ---> 属于其他人
*
* HDFS的权限: 功能非常弱
* 1、记住一句话: 你说你是谁,你就是谁, HDFS不验证是不是真的.
*
* 一共有4种方式改变我们的权限:
* 1、System.setProperty("HADOOP_USER_NAME", "root");
* 2、问题: 在Java程序中,接收命令行的参数有几种方式?
* (1) main 方法
* (2) -D 参数(重要)
* 3、修改 hdfs-stie.xml 文件中的 dfs.permissions为false, 不进行权限验证.
* 4、类型Linux的chmod 命令
* (1) hdfs dfs -chmod folder3 777
*
* ---------------------------------------------------------------
* 容易报的错误 ...... Name node is in safe mode..... 错误:
* 原因: HDFS在启动的时候,首先进入安全模式, 如果在安全模式下,HDFS是只读的
* 在Linux下执行:
* #hadoop dfsadmin -safemode get 看Hadoop的运行模式是怎样的
*
*/
public class Demo1 {
/**
* 执行此方法前,在Linux执行一下:
* #hdfs dfs -ls / 看有没有folder1目录, 通过此命令进行验证
*/
@Test
public void test1() throws Exception {
// HDFS权限问题,设置一个环境变量: HADOOP_USER_NAME
System.setProperty("HADOOP_USER_NAME", "root");
// NameNode 管理员: 接收客户端的请求
// 创建一个配置信息: NameNode的地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.73.132:9000"); // 基于code-site.xml的配置
// 创建一个客户端,指向NameNode
FileSystem client = FileSystem.get(conf);
// 创建一个目录
client.mkdirs(new Path("/folder1"));
client.close();
}
}
package demo;
/**
* DOS Run:
* 1) javac MyDemo.java
* 2) java -Dname=tom -Dage=23 MyDemo
* @author tobin
*
*/
public class MyDemo {
public static void main(String[] args) {
method1();
}
public static void method1() {
// 在方法获取命令上的参数: name=tom age=23
// System.getProperty 获取命令行上的-D参数
String name = System.getProperty("name");
String age = System.getProperty("age");
System.out.println(name + "\t" + age);
}
}
3、Hadoop基于Java实现文件上传
package demo;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
public class Demo2 {
// 上传文件: hdfs dfs -put **** /目录下
// 此方法的问题: 有没有一个简单的方式,实现上传与下载,不需要通过Java IO来实现, 通过 IOUtils 工具来实现
@Test
public void testUploadFile() throws Exception {
// 创建一个配置信息: NameNode的地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.73.132:9000"); // 基于code-site.xml的配置
// 创建一个客户端,指向NameNode
FileSystem client = FileSystem.get(conf);
// 上一个大于128M的文件
// C:\Temp\AAA.mp4 350M左右
// 创建一个输出流, 指向HDFS (字节流)
OutputStream out = client.create(new Path("/folder1/bbb.mp4"));
// 创建一个输入流,从文件中读取 (字节流)
InputStream in = new FileInputStream("C:\\Temp\\AAA.mp4");
// 创建一个缓冲区
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
// 读入了数据,直接写出
out.write(buffer, 0, len); // 从0开始写, len的偏移量
}
out.flush(); // *
out.close();
in.close();
}
}
// 最后执行完成后
// 1. 在Linux可以通过:
// #hdfs dfs -ls /folder1 命令进行查询
//
// 2. 如果查看HADOOP的TMP格式化目录下的文件,进Linux的以下目录
// #ls /root/training/hadoop-2.4.1/tmp/dfs
// 看到以下结果,由于当前环境是伪分布式环境,参看到以下3个目录 data表示 DataNode, name表示NameNode, namesecondary表示Secondary
// drwx------. 3 root root 4096 Aug 29 15:33 data
// drwxr-xr-x. 3 root root 4096 Aug 29 15:33 name
// drwxr-xr-x. 3 root root 4096 Aug 29 15:33 namesecondary
// #cd /root/training/hadoop-2.4.1/tmp/dfs/data/current/BP-504154172-127.0.0.1-1502513915069/current/finalized
// 直到进入以上目录,才能看到我们刚刚上传的blk打头的数据块文件(以128M大小的存储)
// -rw-r--r--. 1 root root 134217728 Aug 29 16:51 blk_1073741828
// -rw-r--r--. 1 root root 1048583 Aug 29 16:51 blk_1073741828_1004.meta
// -rw-r--r--. 1 root root 134217728 Aug 29 16:51 blk_1073741829
// -rw-r--r--. 1 root root 1048583 Aug 29 16:51 blk_1073741829_1005.meta
//
4、Hadoop文件上传图
5、Hadoop文件下载图