首页 > 代码库 > Hadoop(一):数据文件

Hadoop(一):数据文件

QuickStart

晚上照着官方文档把玩了一下hadoop,本机伪分布式启动,这里记录一下。

首先是下载当前stable版本的hadoop,现在是2.6.0版本。

然后设置免输入密码ssh登录,hadoop中需要使用,

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ ssh-add ~/.ssh/id_dsa

修改etc/hadoop/hadoop-env.sh,注意最好是用JDK6,在我的环境中用JDK7没法启动hadoop,HADOOP_PREFIX是hadoop的安装目录,一定要设置。

# set to the root of your Java installation
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386

export HADOOP_PREFIX=/home/blues/hadoop

接下来照着官网修改etc/hadoop/core-site.xmletc/hadoop/hdfs-site.xml。然后就可以启动HDFS了,

$ bin/hdfs namenode -format
$ sbin/start-dfs.sh

这时候已经可以通过web console来观察hadoop的运行状况了,http://localhost:50070/。

接下来跑下栗子,

  1. $ bin/hdfs dfs -mkdir /user。在HDFS上面创建user目录;
  2. $ bin/hdfs dfs -mkdir /user/blues。在user目录创建blues子目录,执行MapReduce任务时需要;
  3. $ bin/hdfs dfs -put etc/hadoop input。将etc/hadoop目录下的数据写入HDFS;
  4. $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output ‘dfs[a-z.]+‘。提交MapReduce任务;
  5. $ bin/hdfs dfs -cat output/*。结果也是保存在HDFS上面的,不下载到本地直接查看;

下面是最终的结果输出,

8	dfs.audit.logger
4	dfs.class
3	dfs.server.namenode.
2	dfs.replication
2	dfs.period
2	dfs.audit.log.maxfilesize
2	dfs.audit.log.maxbackupindex
1	dfsmetrics.log
1	dfsadmin
1	dfs.servers
1	dfs.file

数据文件

现在来看下机器上产生的数据文件(对于理解HDFS会比较直观)。文件是在/tmp/hadoop-blues目录下(先不纠结这个目录的配置),来看下这个目录下的文件,

blues@ubuntu:~/hadoop$ tree /tmp/hadoop-blues
/tmp/hadoop-blues
├── dfs
│   ├── data
│   │   ├── current
│   │   │   ├── BP-240823735-127.0.1.1-1422454670374
│   │   │   │   ├── current
│   │   │   │   │   ├── dfsUsed
│   │   │   │   │   ├── finalized
│   │   │   │   │   │   └── subdir0
│   │   │   │   │   │       └── subdir0
│   │   │   │   │   │           ├── blk_1073741825
│   │   │   │   │   │           ├── blk_1073741825_1001.meta
│   │   │   │   │   │           ├── blk_1073741826
│   │   │   │   │   │           ├── blk_1073741826_1002.meta
│   │   │   │   │   │           ├── blk_1073741827
│   │   │   │   │   │           ├── blk_1073741827_1003.meta
│   │   │   │   │   │           ├── blk_1073741828
│   │   │   │   │   │           ├── blk_1073741828_1004.meta
│   │   │   │   │   │           ├── blk_1073741829
│   │   │   │   │   │           ├── blk_1073741829_1005.meta
│   │   │   │   │   │           ├── blk_1073741830
│   │   │   │   │   │           ├── blk_1073741830_1006.meta
│   │   │   │   │   │           ├── blk_1073741831
│   │   │   │   │   │           ├── blk_1073741831_1007.meta
│   │   │   │   │   │           ├── blk_1073741832
│   │   │   │   │   │           ├── blk_1073741832_1008.meta
│   │   │   │   │   │           ├── blk_1073741833
│   │   │   │   │   │           ├── blk_1073741833_1009.meta
│   │   │   │   │   │           ├── blk_1073741834
│   │   │   │   │   │           ├── blk_1073741834_1010.meta
│   │   │   │   │   │           ├── blk_1073741835
│   │   │   │   │   │           ├── blk_1073741835_1011.meta
│   │   │   │   │   │           ├── blk_1073741836
│   │   │   │   │   │           ├── blk_1073741836_1012.meta
│   │   │   │   │   │           ├── blk_1073741837
│   │   │   │   │   │           ├── blk_1073741837_1013.meta
│   │   │   │   │   │           ├── blk_1073741838
│   │   │   │   │   │           ├── blk_1073741838_1014.meta
│   │   │   │   │   │           ├── blk_1073741839
│   │   │   │   │   │           ├── blk_1073741839_1015.meta
│   │   │   │   │   │           ├── blk_1073741840
│   │   │   │   │   │           ├── blk_1073741840_1016.meta
│   │   │   │   │   │           ├── blk_1073741841
│   │   │   │   │   │           ├── blk_1073741841_1017.meta
│   │   │   │   │   │           ├── blk_1073741842
│   │   │   │   │   │           ├── blk_1073741842_1018.meta
│   │   │   │   │   │           ├── blk_1073741843
│   │   │   │   │   │           ├── blk_1073741843_1019.meta
│   │   │   │   │   │           ├── blk_1073741844
│   │   │   │   │   │           ├── blk_1073741844_1020.meta
│   │   │   │   │   │           ├── blk_1073741845
│   │   │   │   │   │           ├── blk_1073741845_1021.meta
│   │   │   │   │   │           ├── blk_1073741846
│   │   │   │   │   │           ├── blk_1073741846_1022.meta
│   │   │   │   │   │           ├── blk_1073741847
│   │   │   │   │   │           ├── blk_1073741847_1023.meta
│   │   │   │   │   │           ├── blk_1073741848
│   │   │   │   │   │           ├── blk_1073741848_1024.meta
│   │   │   │   │   │           ├── blk_1073741849
│   │   │   │   │   │           ├── blk_1073741849_1025.meta
│   │   │   │   │   │           ├── blk_1073741850
│   │   │   │   │   │           ├── blk_1073741850_1026.meta
│   │   │   │   │   │           ├── blk_1073741851
│   │   │   │   │   │           ├── blk_1073741851_1027.meta
│   │   │   │   │   │           ├── blk_1073741852
│   │   │   │   │   │           ├── blk_1073741852_1028.meta
│   │   │   │   │   │           ├── blk_1073741853
│   │   │   │   │   │           ├── blk_1073741853_1029.meta
│   │   │   │   │   │           ├── blk_1073741854
│   │   │   │   │   │           ├── blk_1073741854_1030.meta
│   │   │   │   │   │           ├── blk_1073741855
│   │   │   │   │   │           ├── blk_1073741855_1031.meta
│   │   │   │   │   │           ├── blk_1073741856
│   │   │   │   │   │           ├── blk_1073741856_1032.meta
│   │   │   │   │   │           ├── blk_1073741858
│   │   │   │   │   │           └── blk_1073741858_1034.meta
│   │   │   │   │   ├── rbw
│   │   │   │   │   └── VERSION
│   │   │   │   ├── dncp_block_verification.log.curr
│   │   │   │   ├── dncp_block_verification.log.prev
│   │   │   │   └── tmp
│   │   │   └── VERSION
│   │   └── in_use.lock
│   └── name
│       ├── current
│       │   ├── edits_0000000000000000001-0000000000000000001
│       │   ├── edits_inprogress_0000000000000000002
│       │   ├── fsimage_0000000000000000000
│       │   ├── fsimage_0000000000000000000.md5
│       │   ├── fsimage_0000000000000000001
│       │   ├── fsimage_0000000000000000001.md5
│       │   ├── seen_txid
│       │   └── VERSION
│       └── in_use.lock
└── mapred
    ├── local
    │   └── localRunner
    │       └── blues
    │           ├── jobcache
    │           │   ├── job_local1924735003_0002
    │           │   │   ├── attempt_local1924735003_0002_m_000000_0
    │           │   │   └── attempt_local1924735003_0002_r_000000_0
    │           │   │       └── output
    │           │   ├── job_local273556555_0002
    │           │   │   ├── attempt_local273556555_0002_m_000000_0
    │           │   │   └── attempt_local273556555_0002_r_000000_0
    │           │   │       └── output
    │           │   ├── job_local420307051_0001
    │           │   │   ├── attempt_local420307051_0001_m_000000_0
    │           │   │   ├── attempt_local420307051_0001_m_000001_0
    │           │   │   ├── attempt_local420307051_0001_m_000002_0
    │           │   │   ├── attempt_local420307051_0001_m_000003_0
    │           │   │   ├── attempt_local420307051_0001_m_000004_0
    │           │   │   ├── attempt_local420307051_0001_m_000005_0
    │           │   │   ├── attempt_local420307051_0001_m_000006_0
    │           │   │   ├── attempt_local420307051_0001_m_000007_0
    │           │   │   └── attempt_local420307051_0001_r_000000_0
    │           │   │       └── output
    │           │   └── job_local937170752_0001
    │           │       ├── attempt_local937170752_0001_m_000000_0
    │           │       ├── attempt_local937170752_0001_m_000001_0
    │           │       ├── attempt_local937170752_0001_m_000002_0
    │           │       ├── attempt_local937170752_0001_m_000003_0
    │           │       ├── attempt_local937170752_0001_m_000004_0
    │           │       ├── attempt_local937170752_0001_m_000005_0
    │           │       ├── attempt_local937170752_0001_m_000006_0
    │           │       ├── attempt_local937170752_0001_m_000007_0
    │           │       ├── attempt_local937170752_0001_m_000008_0
    │           │       ├── attempt_local937170752_0001_m_000009_0
    │           │       ├── attempt_local937170752_0001_m_000010_0
    │           │       ├── attempt_local937170752_0001_m_000011_0
    │           │       ├── attempt_local937170752_0001_m_000012_0
    │           │       ├── attempt_local937170752_0001_m_000013_0
    │           │       ├── attempt_local937170752_0001_m_000014_0
    │           │       ├── attempt_local937170752_0001_m_000015_0
    │           │       ├── attempt_local937170752_0001_m_000016_0
    │           │       ├── attempt_local937170752_0001_m_000017_0
    │           │       ├── attempt_local937170752_0001_m_000018_0
    │           │       ├── attempt_local937170752_0001_m_000019_0
    │           │       ├── attempt_local937170752_0001_m_000020_0
    │           │       ├── attempt_local937170752_0001_m_000021_0
    │           │       ├── attempt_local937170752_0001_m_000022_0
    │           │       ├── attempt_local937170752_0001_m_000023_0
    │           │       ├── attempt_local937170752_0001_m_000024_0
    │           │       ├── attempt_local937170752_0001_m_000025_0
    │           │       ├── attempt_local937170752_0001_m_000026_0
    │           │       ├── attempt_local937170752_0001_m_000027_0
    │           │       ├── attempt_local937170752_0001_m_000028_0
    │           │       ├── attempt_local937170752_0001_m_000029_0
    │           │       ├── attempt_local937170752_0001_m_000030_0
    │           │       ├── attempt_local937170752_0001_m_000031_0
    │           │       └── attempt_local937170752_0001_r_000000_0
    │           │           └── output
    │           ├── job_local1924735003_0002
    │           ├── job_local273556555_0002
    │           ├── job_local420307051_0001
    │           └── job_local937170752_0001
    └── staging
        ├── blues1076640456
        ├── blues1674612759
        ├── blues1924735003
        ├── blues273556555
        ├── blues420307051
        └── blues937170752

很明显dfs跟mapred存放的分别是HDFS跟MapReduce的数据,从本质上来说,Hadoop就是提供了分布式存储(HDFS)与分布式计算(MapReduce)的服务。现在我们只看dfs下的。而dfs的两个子目录data跟name也很明显,分别是datanode跟namenode的数据。

技术分享

dfs/data

可以看到data下面有很多的blk_xxx文件,这些便是我们在上面第3步$ bin/hdfs dfs -put etc/hadoop input写入的etc/hadoop目录下的所有数据,验证一下,

blues@ubuntu:~/hadoop$ less /tmp/hadoop-blues/dfs/data/current/BP-240823735-127.0.1.1-1422454670374/current/finalized/subdir0/subdir0/blk_1073741825
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>

  <property>
    <name>yarn.scheduler.capacity.maximum-applications</name>
    <value>10000</value>
    <description>
      Maximum number of applications that can be pending and running.
    </description>
  </property>

...

blk_1073741825这个文件的数据妥妥的就是etc/hadoop目录下文件名排序的第一个文件capacity-scheduler.xml的数据。

而上面我们直接查看的结果则是保存在blk_1073741858这个文件中,

blues@ubuntu:~/hadoop$ cat /tmp/hadoop-blues/dfs/data/current/BP-240823735-127.0.1.1-1422454670374/current/finalized/subdir0/subdir0/blk_1073741858
8	dfs.audit.logger
4	dfs.class
3	dfs.server.namenode.
2	dfs.replication
2	dfs.period
2	dfs.audit.log.maxfilesize
2	dfs.audit.log.maxbackupindex
1	dfsmetrics.log
1	dfsadmin
1	dfs.servers
1	dfs.file

dfs/name

dfs/name下面主要保存的就是namenode的EditLog和FsImage了,这个设计与ZooKeeper的设计一样,可以参考之前这篇文章。namenode维护的是一些metadata,例如上面我们看到的,查看结果时要将output目录映射到blk_1073741858这个文件中。FsImage保存的就是这些metadata。

至此,我们算是简单了解了Hadoop在分布式存储方面的东东了。Have fun ^_^

参考资料

  • http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
  • http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html

Hadoop(一):数据文件