1.引包
1.传统引包
hadoop.tar.gz解压—》share–》搜索.jar,—>搜索source–》剪切到新建文件夹source—》收缩test—》剪切到新建文件夹test—》lib中还剩下144个jar包
打开idea–》file–》projectStructure—》libraries–》引包
2.maven
在pom文件中修改依赖。
mysql
mysql-connector-java
5.1.47
org.apache.hadoop
hadoop-common
h
a
d
o
o
p
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
!
−
−
h
t
t
p
s
:
/
/
m
v
n
r
e
p
o
s
i
t
o
r
y
.
c
o
m
/
a
r
t
i
f
a
c
t
/
o
r
g
.
a
p
a
c
h
e
.
h
a
d
o
o
p
/
h
a
d
o
o
p
−
h
d
f
s
−
−
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
o
r
g
.
a
p
a
c
h
e
.
h
a
d
o
o
p
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
h
a
d
o
o
p
−
h
d
f
s
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>
hadoop.version</version></dependency><!−−https://mvnrepository.com/artifact/org.apache.hadoop/hadoop−hdfs−−><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop−hdfs</artifactId><version>{hadoop.version}
org.apache.hadoop
hadoop-client
${hadoop.version}
代码:
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
System.out.println(fs);
fs.close();
关于hdfs里的相关配置信息的3种方式。
1.core-default.xml(位置是在引的包中的Maven:org.apache.hadoop:hadoop-common:2.7.6中)
2.core-site.xml:将hadoop中的配置文件core-site.xml复制粘贴到resource目录下。
3.conf.set(“fs.defaultFS”,“hdfs://node101:9000”);
在代码执行过程中,是先看是否代码中有3,其次,2,再其次是1.
本地文件向hdfs中传输文件栗子:
import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class HDFSAPI {
@Test
public void testHdfsConn() throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defualtFS","hdfs://192.168.44.9:9000");
FileSystem fs = FileSystem.get(conf);
fs.copyFromLocalFile(new Path("file:///D:/hh.txt"),new Path("hdfs://node101:9000/animal/tiger"));
fs.close();
}
}
3.权限问题:
当window用户向hdfs传输文件时,会报错,权限不够。那么就要在本机设置一下,使本机的用户伪装成hdfs中的用户。
方法1.在代码中设置:
Configuration conf = new Configuration();
conf.set("fs.defualtFS","hdfs://192.168.44.9:9000");
**FileSystem fs = FileSystem.get(new URI("hdfs://node101:9000"),conf
,"user");**
fs.copyFromLocalFile(new Path("file:///D:/hh.txt"),new Path("hdfs://node101:9000/animal/tiger"));
**第二种方法:**点击idea上方,Run–》Edit Configurations–》HDFSAPI.testHdfsConn–》VMo ptions
将VM options的值改为-DHADOOP_USER_NAME=user(等于你的用户名 )
第三中方法:(不提倡)
改变hdfs中文件的权限:
hdfs dfs -chmod -R 777 /animal
之后就能用本机的用户向hdfs上传文件了。
hdfs上传文件的(写入数据的原理):
1.客户端向hdfs namenode发出请求,namenode接受到请求之后,返回客户端响应建立连接
2.计算客户端传送文件的大小,计算出block块数量,并且向namenode发送存储的第一块的请求,namenode会响应客户端,并且告知客户端数据存储的哪些datanode节点
3.客户端向其中一个datanode发送来连接请求,datanode会向其中的内部其他的datanode节点发送请求。之后在响应客户端建立连接(为什么客户端不直接向各个datanode发送请求,而是某个datanode自己向内部发送请求?)(RPC高速传输协议,在局域网内采用RPC进行连接传输,速度非常的快。)传输完毕之后,datanode会告知客户端传输完毕。
4.客户端向namenode发送请求,告知传输完毕,namenode记录元数据。