hdfs学习

Posted 捡黄金的少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdfs学习相关的知识,希望对你有一定的参考价值。

1、hadoop生产环境版本选择

  • Hadoop三大发行版本:Apache、Cloudera、Hortonworks。

    • Apache版本最原始(最基础)的版本,对于入门学习最好。

    • Cloudera在大型互联网企业中用的较多。

    • Hortonworks文档较好。

  • mapr

  • Apache Hadoop

    官网地址:Apache Hadoop

    下载地址:Index of /dist/hadoop/common

  • Cloudera Hadoop

    官网地址:CDH Product Download

    下载地址:http://archive.cloudera.com/cdh5/cdh/5/

    • 2008年成立的Cloudera是最早将Hadoop商用的公司,为合作伙伴提供Hadoop的商用解决方案,主要是包括支持、咨询服务、培训。

    • 2009年Hadoop的创始人Doug Cutting也加盟Cloudera公司。Cloudera产品主要为CDH,Cloudera Manager,Cloudera Support

    • CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性,安全性,稳定性上有所增强。

    • Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署好一个Hadoop集群,并对集群的节点及服务进行实时监控。Cloudera Support即是对Hadoop的技术支持。

    • Cloudera的标价为每年每个节点4000美元。Cloudera开发并贡献了可实时处理大数据的Impala项目。

  • Hortonworks Hadoop

    官网地址:Enterprise Data Management Platforms & Products | Cloudera

    下载地址:Cloudera Enterprise Downloads

    • 现cloudera与hortonworks已合并。

    • 2011年成立的Hortonworks是雅虎与硅谷风投公司Benchmark Capital合资组建。

    • 公司成立之初就吸纳了大约25名至30名专门研究Hadoop的雅虎工程师,上述工程师均在2005年开始协助雅虎开发Hadoop,贡献了Hadoop80%的代码。

    • 雅虎工程副总裁、雅虎Hadoop开发团队负责人Eric Baldeschwieler出任Hortonworks的首席执行官。

    • Hortonworks的主打产品是Hortonworks Data Platform(HDP),也同样是100%开源的产品,HDP除常见的项目外还包括了Ambari,一款开源的安装和管理系统。

    • HCatalog,一个元数据管理系统,HCatalog现已集成到Facebook开源的Hive中。Hortonworks的Stinger开创性的极大的优化了Hive项目。Hortonworks为入门提供了一个非常好的,易于使用的沙盒。

    • Hortonworks开发了很多增强特性并提交至核心主干,这使得Apache Hadoop能够在包括Window Server和Windows Azure在内的Microsoft Windows平台上本地运行。定价以集群为基础,每10个节点每年为12500美元。

    注意:Hortonworks已经与Cloudera公司合并

2、Hadoop由三个模块组成:

分布式存储HDFS、分布式计算MapReduce、资源调度引擎Yarn

1、HDFS文件分块存储&3副本

  • 保存文件到HDFS时,会先默认按==128M==的大小对文件进行切分;效果如上图

    • 数据以block块的形式进统一存储管理,每个block块默认最多可以存储128M的数据。

    • 如果有一个文件大小为1KB,也是要占用一个block块,但是实际占用磁盘空间还是1KB大小,类似于有一个水桶可以装128斤的水,但是我只装了1斤的水,那么我的水桶里面水的重量就是1斤,而不是128斤

  • 每个block块的元数据大小大概为150字节

  • 所有的文件都是以block块的方式存放在HDFS文件系统当中,在hadoop1当中,文件的block块默认大小是64M,hadoop2当中,文件的block块大小默认是128M,block块的大小可以通过hdfs-site.xml当中的配置文件进行指定

<property>
        <name>dfs.blocksize</name>
        <value>块大小 以字节为单位</value><!-- 只写数值就可以 -->
    </property> 

  • 为了保证block块的安全性,也就是数据的安全性,在hadoop2当中,文件默认保存==三个副本==,我们可以更改副本数以提高数据的安全性

  • 在hdfs-site.xml当中修改以下配置属性,即可更改文件的副本数

  • <property>
              <name>dfs.replication</name>
              <value>3</value>
        </property>

2、HDFS抽象成数据块的好处

  1. 文件可能大于集群中任意一个磁盘 10T*3/128 = xxx块 2T,2T,2T 文件方式存—–>多个block块,这些block块属于一个文件。

  2. 使用块抽象而不是文件可以简化存储子系统

    hdfs将所有的文件全部抽象成为block块来进行存储,不管文件大小,全部一视同仁都是以block块的形式进行存储,方便我们的分布式文件系统对文件的管理。

  3. 块非常适合用于数据备份;进而提供数据容错能力和可用性

3、hdfs架构 

 

 

HDFS集群包括,NameNode和DataNode以及Secondary Namenode。

  • NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。

  • DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本。

  • Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。最主要作用是辅助namenode管理元数据信

4、NameNode与Datanode的总结概述  

 

3、hdfs的shell命令操作

先要启动Hadoop集群,才能使用下面命令

脚本一键启动

如果配置了 etc/hadoop/slaves 和 ssh 免密登录,则可以使用程序脚本启动所有Hadoop 两个集群的相关进程,在主节点所设定的机器上执行。

启动集群

node01节点上执行以下命令

第一台机器执行以下命令

cd /kkb/install/hadoop-2.6.0-cdh5.14.2/
sbin/start-dfs.sh
sbin/start-yarn.sh
sbin/mr-jobhistory-daemon.sh start historyserver

停止集群:

sbin/stop-dfs.sh

sbin/stop-yarn.sh

浏览器查看启动页面

hdfs集群访问地址

http://192.168.52.100:50070/dfshealth.html#tab-overview

yarn集群访问地址

http://192.168.52.100:8088/cluster

jobhistory访问地址:

http://192.168.52.100:19888/jobhistory

1、如何查看hdfs或hadoop子命令的帮助信息,如ls子命令

hdfs dfs -help ls
hadoop fs -help ls #两个命令等价

2、查看hdfs文件系统中指定目录的文件列表。对比linux命令ls

hdfs dfs -ls /
hadoop fs -ls /
hdfs dfs -ls -R /

3、 在hdfs文件系统中创建文件

hdfs dfs -touchz /edits.txt

4、向HDFS文件中追加内容  

hadoop fs -appendToFile edit1.xml /edits.txt #将本地磁盘当前目录的edit1.xml内容追加到HDFS根目录 的edits.txt文件

5、查看HDFS文件内容

hdfs dfs -cat /edits.txt 

6、从本地路径上传文件至HDFS  

#用法:hdfs dfs -put /本地路径 /hdfs路径
hdfs dfs -put /linux本地磁盘文件 /hdfs路径文件
hdfs dfs -copyFromLocal /linux本地磁盘文件 /hdfs路径文件  #跟put作用一样
hdfs dfs -moveFromLocal /linux本地磁盘文件 /hdfs路径文件  #跟put作用一样,只不过,源文件被拷贝成功后,会被删除

7、在hdfs文件系统中下载文件  

hdfs dfs -get /hdfs路径 /本地路径
hdfs dfs -copyToLocal /hdfs路径 /本地路径  #根get作用一样

8、在hdfs文件系统中创建目录

hdfs dfs -mkdir /shell 

9、在hdfs文件系统中删除文件

hdfs dfs -rm /edits.txt

将文件彻底删除(被删除文件不放到hdfs的垃圾桶里)
how?
hdfs dfs -rm -skipTrash /xcall

10、在hdfs文件系统中修改文件名称(也可以用来移动文件到目录)

hdfs dfs -mv /xcall.sh /call.sh
hdfs dfs -mv /call.sh /shell

11、在hdfs中拷贝文件到目录

hdfs dfs -cp /xrsync.sh /shell

12、递归删除目录

hdfs dfs -rm -r /shell

13、列出本地文件的内容(默认是hdfs文件系统)

hdfs dfs -ls file:///home/hadoop/

14、查找文件

# linux find命令
find . -name 'edit*'
# HDFS find命令
hadoop fs -find / -name part-r-00000 # 在HDFS根目录中,查找part-r-00000文件

15、总结

  • 输入hadoop fs 或hdfs dfs,回车,查看所有的HDFS命令

  • 许多命令与linux命令有很大的相似性,学会举一反三

  • 有用的==help==,如查看ls命令的使用说明:hadoop fs -help ls

  • 绝大多数的大数据框架的命令,也有类似的help信息

 

hdfs安全模式

  • 安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。

4、hdfs的java API开发

1、配置window电脑Hadoop环境

1、配置Hadoop环境

 

 然后将下图中的hadoop.dll文件拷贝到C:\\Windows\\System32

查看是否配置成功

 如果命令不能成功,可能你电脑的java的jdk安装到了C盘的Program Files目录下,Hadoop识别出现错误,则需指定目录

set JAVA_HOME=C:\\PROGRA~1\\Java\\jdk1.8.0_92 

 2、修改host文件

host存放位置

 C:\\Windows\\System32\\drivers\\etc

192.168.52.100     node01  node01.kaikeba.com 
192.168.52.101    node02    node02.kaikeba.com   
192.168.52.102    node03   node03.kaikeba.com  

 2、创建maven项目并引入jar包

<repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.6.0-mr1-cdh5.14.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.6.0-cdh5.14.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.6.0-cdh5.14.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.6.0-cdh5.14.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <!--   <verbal>true</verbal>-->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <minimizeJar>true</minimizeJar>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

1、创建文件夹 

@Test
    public void mkdirToHdfs() throws IOException 
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://node01:8020");
        FileSystem fileSystem = FileSystem.get(configuration);
        fileSystem.mkdirs(new Path("/kaikeba/dir1"));//若目录已经存在,则创建失败,返回false
        fileSystem.close();
    

2、创建权限文件夹 

 @Test
    public void mkdir() throws IOException 
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://node01:8020");
        FileSystem fileSystem = FileSystem.get(configuration);
        FsPermission fsPermission = new FsPermission(FsAction.ALL, FsAction.READ_WRITE, FsAction.NONE);
        boolean mkdirs = fileSystem.mkdirs(new Path("/kaikeba/dir2"), fsPermission);
        if (mkdirs) 
            System.out.println("目录创建成功");
        
        //释放资源
        fileSystem.close();
    

3、文件上传到指定目录 

   /**
     * 文件上传
     *
     * @throws IOException
     */
    @Test
    public void uploadFile() throws IOException 
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://node01:8020");
        FileSystem fileSystem = FileSystem.get(configuration);
        fileSystem.copyFromLocalFile(new Path("file:///d:\\\\1.png"), new Path("hdfs://node01:8020/kaikeba/dir1"));//hdfs路径也可以直接写成/kaikeba/dir1
        fileSystem.close();
    

4、文件下载到指定目录

/**
     * 文件下载
     */
    @Test
    public void downloadFile() throws IOException 
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS","hdfs://node01:8020");
        FileSystem fileSystem = FileSystem.get(configuration);
        fileSystem.copyToLocalFile(new Path("hdfs://node01:8020/kaikeba/dir1/1.png"),new Path("file:///d:\\\\hello2.png"));//hdfs路径也可以直接写成/kaikeba/dir1
        fileSystem.close();
    

5、循环遍历文件列表

@Test
    public void testListFiles() throws IOException, InterruptedException, URISyntaxException 
        // 1获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node01:8020"), configuration);
        // 2 获取文件详情
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
        while(listFiles.hasNext())
            LocatedFileStatus status = listFiles.next();
            // 输出详情
            // 文件名称
            System.out.println("文件名称:"+status.getPath().getName());
            // 长度
            System.out.println("文件长度:"+status.getLen());
            // 权限
            System.out.println("文件权限:"+status.getPermission());
            // 分组
            System.out.println("文件组:"+status.getGroup());
            // 获取存储的块信息
            BlockLocation[] blockLocations = status.getBlockLocations();

            for (BlockLocation blockLocation : blockLocations) 
                // 获取块存储的主机节点
                String[] hosts = blockLocation.getHosts();
                for (String host : hosts) 
                    System.out.println(host);
                
            
        
        // 3 关闭资源
        fs.close();
    

IO流操作hdfs文件

通过io流进行数据上传操作  

 @Test
    public void putFileToHDFS() throws IOException, InterruptedException, URISyntaxException 
        // 1 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node01:8020"), configuration);
        // 2 创建输入流;路径前不需要加file:///,否则报错
        FileInputStream fis = new FileInputStream(new File("e:\\\\hello.txt"));
        // 3 获取输出流
        FSDataOutputStream fos = fs.create(new Path("hdfs://node01:8020/outresult.txt"));
        // 4 流对拷 org.apache.commons.io.IOUtils
        IOUtils.copy(fis, fos);
        // 5 关闭资源
        IOUtils.closeQuietly(fos);
        IOUtils.closeQuietly(fis);
        fs.close();
    

 

以上是关于hdfs学习的主要内容,如果未能解决你的问题,请参考以下文章

三个水桶等分8升水的问题 -《算法的乐趣》

水桶分水问题详解(C++实现)

水桶分水问题详解(C++实现)

水桶实验:牛顿与马赫

逻辑分析题目:“给你一个9升的水桶和一个4升的水桶,在河里取6升水”

水桶分水问题详解(C++实现)