1、新建一个maven工程,pom.xml中添加hadoop-common,hadoop-hdfs引用。
<dependency
>
<groupId
>org.apache.hadoop
</groupId
>
<artifactId
>hadoop-common
</artifactId
>
<version
>2.7.0
</version
>
</dependency
>
<dependency
>
<groupId
>org.apache.hadoop
</groupId
>
<artifactId
>hadoop-hdfs
</artifactId
>
<version
>2.7.0
</version
>
</dependency
>
2、将部署在centos7上的hadoop的配置文件core-site.xml、hdfs-site.xml、log4j.properties拷贝到工程中的resources目录下,
3、hdfs读文件示例
package com.che.hdfs
;
import java.io.IOException
;
import java.io.OutputStream
;
import org.apache.hadoop.conf.Configuration
;
import org.apache.hadoop.fs.FSDataInputStream
;
import org.apache.hadoop.fs.FileSystem
;
import org.apache.hadoop.fs.Path
;
/**
* hdfs 读文件
*
*/
public class FileRead
{
public static void main
(String
[] args
) {
Configuration conf
= new Configuration
();
try
{
// 指定hdfs入口地址 与 core-site.xml中fs.defaultFs值一致
conf.set
("fs.defaultFs",
"hdfs://172.20.10.4:9000");
FileSystem fs
= FileSystem.get
(conf
);
// 指定读取hdfs文件系统中的文件地址
String filePath
= "/user/che/1021001/test.txt";
Path targetFile
= new Path
(filePath
);
if (!fs.exists
(targetFile
)) {
System.out.println
("hdfs文件:" + filePath +
"不存在");
}
// 指定输出流
FSDataInputStream
in = fs.open
(targetFile
);
OutputStream out
= System.out
;
byte buffer
[] = new byte
[256
];
try
{
int bytesRead
= 0
;
while ((bytesRead = in.read(buffer)) > 0
) {
out.write
(buffer, 0, bytesRead
);
}
} catch
(IOException e
) {
e.printStackTrace
();
} finally
{
in.close
();
out.close
();
}
} catch
(Exception e
) {
e.printStackTrace
();
}
}
}
4、hdfs写文件示例
package com.che.hdfs
;
import java.io.BufferedInputStream
;
import java.io.File
;
import java.io.FileInputStream
;
import java.io.IOException
;
import java.io.InputStream
;
import org.apache.hadoop.conf.Configuration
;
import org.apache.hadoop.fs.FSDataOutputStream
;
import org.apache.hadoop.fs.FileSystem
;
import org.apache.hadoop.fs.Path
;
/**
* hdfs 写文件
*/
public class FileWrite
{
public static void main
(String
[] args
) {
Configuration conf
= new Configuration
();
try
{
// 指定hdfs入口地址 与 core-site.xml中fs.defaultFs值一致
conf.set
("fs.defaultFs",
"hdfs://172.20.10.4:9000");
FileSystem fs
= FileSystem.get
(conf
);
// 要读取的文件路径
(本地文件
)
String inFilePath
= "/Users/diguoliang/Desktop/test01.txt";
// 要写到hdfs文件系统中的文件路径
String outFilePath
= "/user/che/1021001/test1.txt";
File inFile
= new File
(inFilePath
);
if (!inFile.exists
()) {
System.out.println
("要读取的文件:" + inFilePath +
"不存在。");
}
InputStream
in = new BufferedInputStream
(new FileInputStream
(inFilePath
));
// 构造输出流
Path outFile
= new Path
(outFilePath
);
FSDataOutputStream out
= fs.create
(outFile
);
// 开始写入
byte buffer
[] = new byte
[256
];
try
{
int bytesRead
= 0
;
while ((bytesRead = in.read(buffer)) > 0
) {
out.write
(buffer, 0, bytesRead
);
}
} catch
(IOException e
) {
System.out.println
("写文件异常:" + e.getMessage
());
} finally
{
in.close
();
out.close
();
}
} catch
(IOException e
) {
e.printStackTrace
();
}
}
}
4.1 hdfs写文件报权限错误如下:
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=che, access=WRITE, inode=“hadoop”: hadoop:supergroup:rwxr-xr-x
解除办法是:hadoop的hdfs-site.xml文件中添以下配置,然后重启hdfs
<property
>
<name
>dfs.permissions
</name
>
<value
>false
</value
>
</property
>