基
础
实
验
Hadoop是一款开源的大数据通用处理平台,其提供了分布式存储和分布式离线计算。Hadoop由HDFS、YARN、MapReduce组成。
Hadoop分布式文件系统(HDFS)是一种分布式文件系统(Distributed File System)。HDFS具有高度容错性,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
HDFS其实是将一个大文件分成若干块保存在不同服务器的多个节点中。通过联网让用户感觉像是在本地一样查看文件,为了降低文件丢失造成的错误,HDFS会为每个小文件复制多个副本(默认为3个),以此来实现多机器上的多用户分享文件和存储空间。
HDFS体系结构
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的多个DataNode负责管理存储的数据。
块大小:Hadoop2版本里一个块默认为128M,小文件也占用一个块,小文件越多,块越多。因此,HDFS中不适合存储小文件。
副本个数:保存多个副本(默认3个),提供容错机制,一个副本丢失或宕机,自动恢复。
01
实验目的
熟悉HDFS基本命令行操作
使用Java 接口,通过Java程序读取HDFS中的文件
02
实验环境
云服务器1台:(华为云、阿里云、腾讯云等等均可)
操作系统:CentOS7.4 64位
系统配置:2核4G以上
感谢华为云提供云服务器支持!
03
实验步骤
》》实验资源操作系统:CentOS 7
JDK:JDK8
Hadoop:2.8.5
Github地址:https://github.com/my-ss-course/BigData
工具包地址:链接: https://pan.baidu.com/s/1nOvFQGj12N3ODNilOYMYjg 密码: r8qo
已经按照前面的教程搭建好3个节点的Hadoop伪分布式集群
1登录远程云服务器
使用本地客户端连接远程云服务器
2启动Hadoop集群
如已启动hadoop容器,请忽略本步骤
./start_container.sh
进入hadoop-node1节点的容器
docker exec -it hadoop-node1 /bin/bash
3
通过命令行方式操作HDFS文件系统
01 命令行接口格式格式1:hadoop fs -命令 路径
格式2:hdfs dfs -命令 路径
02
ls命令
hdfs dfs -ls /
03
put命令
将本地文件上传到HDFS中。
hdfs dfs -put /usr/local/hadoop-2.8.5/NOTICE.txt /input/
04
get命令
将HDFS中文件下载到本地
hdfs dfs -get /input/README.txt ./
hdfs dfs -get /input/README.txt README2.txt
hdfs dfs -get /input/README.txt
05
rm命令
删除文件
hdfs dfs -rm /input/README.txt
删除目录
hdfs dfs -rm -r /output
06
mkdir命令
创建目录
hdfs dfs -mkdir /output
创建多级目录,使用-p参数
hdfs dfs -mkdir -p /output/abc/123
07
cp命令
hdfs dfs -cp /input/NOTICE.txt /input/NOTICE2.txt
08
mv命令
hdfs dfs -mv /input/NOTICE.txt /input/NOTICE3.txt
09
cat命令
hdfs dfs -cat /input/NOTICE3.txt
4
使用Java API操作HDFS文件系统中数据
01
新建IntelliJ IDEA下的maven项目
点击File->New->Project,在弹出的对话框中选择Maven
JDK选择相应的版本,点击Next
填写Maven的
GroupId
和ArtifactId,可以随便填写
项目名可填写HDFSTest
编辑pom.xml添加hadoop依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-hdfsartifactId>
<version>2.8.5version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>2.8.5version>
dependency>
dependencies>
02
编写代码
新建一个class,增加如下实验代码
public static void main(String[] args) throws IOException {
System.out.println("hello world");
Configuration conf=new Configuration();
conf.set("fs.defaultFS","hdfs://你的云服务器的IP:19000或hadoop-node1节点的IP:9000");
FileSystem hdfs =FileSystem.get(conf);
boolean is_success = hdfs.mkdirs(new Path("/helloByJava"));
if(is_success){
System.out.println("success");
}else{
System.out.println("failure");
}
hdfs.close();
}
注意要把安全组以及防火墙中的端口打开。
直接运行程序的结果如下
警告先忽略,因为没有配置log4j
可以看到能够在HDFS中成功创建了一个目录。
这这这也太不安全了吧???
可以直接访问我的HDFS
03
打包发布
1、pom.xml文件中增加如下代码,用于编译打包
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>2.3.2version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
<plugin>
<artifactId>maven-assembly-plugin artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependenciesdescriptorRef>
descriptorRefs>
<archive>
<manifest>
<mainClass>com.myhadoop.HelloWorldmainClass>
manifest>
archive>
configuration>
<executions>
<execution>
<id>make-assemblyid>
<phase>packagephase>
<goals>
<goal>singlegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
注意:代码中mainClass需要根据打包的具体类修改
2、在IDEA右侧栏中选择Maven Projects,打开Lifecycle文件夹,先点击compile再点击package,等待jar打包成功。
3、jar包打完之后打开左侧target文件夹,发现有两个jar包,把无依赖的jar包复制到hadoop-node1节点内
拷贝到hadoop-node1节点
4、在hadoop-node1节点下执行命令
hadoop jar jar包名 classname
hadoop jar hadoop-1.0.jar com.myhadoop.HelloWorld
END
每天进步一点点让我知道你在看