《Hadoop实战手册》一1.2 使用Hadoop shell命令导入和导出数据到HDFS

简介:

本节书摘来异步社区《Hadoop实战手册》一书中的第1章,第1.2节,作者: 【美】Jonathan R. Owens , Jon Lentz , Brian Femiano 译者: 傅杰 , 赵磊 , 卢学裕 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 使用Hadoop shell命令导入和导出数据到HDFS

HDFS提供了许多shell命令来实现访问文件系统的功能,这些命令都是构建在HDFS FileSystem API之上的。Hadoop自带的shell脚本是通过命令行来执行所有操作的。这个脚本的名称叫做hadoop,通常安装在$HADOOP_BIN目录下,其中$HADOOP_BIN是Hadoopbin文件完整的安装目录,同时有必要将$HADOOP_BIN配置到$PATH环境变量中,这样所有的命令都可以通过hadoop fs -command这样的形式来执行。

如果需要获取文件系统的所有命令,可以运行hadoop命令传递不带参数的选项fs。

hadoop fs


8

这些按照功能进行命名的命令的名称与Unix shell命令非常相似。使用help选项可以获得某个具体命令的详细说明。

hadoop fs –help ls


7

这些shell命令和其简要的参数描述可在官方在线文档http://hadoop.apache.org/docs/r1.0.4/file_system_shell.html中进行查阅。

在这一节中,我们将使用Hadoop shell命令将数据导入HDFS中,以及将数据从HDFS中导出。这些命令更多地用于加载数据,下载处理过的数据,管理文件系统,以及预览相关数据。掌握这些命令是高效使用HDFS的前提。

准备工作
你需要在http://www.packtpub.com/support这个网站上下载数据集weblog_entries.txt。

操作步骤
完成以下步骤,实现将weblog_entries.txt文件从本地文件系统复制到HDFS上的一个指定文件夹下。

1.在HDFS中创建一个新文件夹,用于保存weblog_entries.txt文件:

hadoop fs -mkdir /data/weblogs

2.将weblog_entries.txt文件从本地文件系统复制到HDFS刚创建的新文件夹下:

hadoop fs -copyFromLocal weblog_entries.txt /data/weblogs

3.列出HDFS上weblog_entries.txt文件的信息:

hadoop fs –ls /data/weblogs/weblog_entries.txt

图像说明文字在Hadoop处理的一些结果数据可能会直接被外部系统使用,可能需要其他系统做更进一步的处理,或者MapReduce处理框架根本就不符合该场景,任何类似的情况下都需要从HDFS上导出数据。下载数据最简单的办法就是使用Hadoop shell。
4.将HDFS上的weblog_entries.txt文件复制到本地系统的当前文件夹下:

hadoop fs -copyToLocal /data/weblogs/weblog_entries.txt ./weblog_entries.txt

5

复制HDFS的文件到本地文件系统时,需要保证本地文件系统的空间可用以及网络连接的速度。HDFS中的文件大小在几个TB到几十个TB是很常见的。在1Gbit网络环境下,从HDFS中导出10 TB数据到本地文件系统,最好的情况下也要消耗23个小时,当然这还要保证本地文件系统的空间是可用的。

下载本书的示例代码

你可以从http://www.packtpub.com下载你买过的任何书的示例代码,如果你买过本书还可以访问http://www.packtpub.com/support,并进行注册来让文件直接发送到你的邮箱

工作原理
Hadoop shell非常轻量地封装在HDFS FileSystem API之上。在执行hadoop命令时,如果传进去的参数是fs,实际上执行的是org.apache.hadoop.fs.FsShell这个类。在0.20.2版本中FsShell实例化了一个org.apache.hadoop.fs.FileSystem对象,并且将命令行参数与类方法映射起来。比如,执行hadoop fs –mkdir /data/weblogs相当于调用FileSystem.mkdirs(new Path("/data/weblogs"))。同样,运行hadoop fs –copyFromLocal weblog_entries.txt /data/weblogs相当于在调用FileSystem.copyFromLocal(newPath("weblog_entries.txt"), new Path("/data/weblogs"))。HDFS数据复制到本地系统的实现方式也是一样,等同于调用FileSystem.copyToLocal(newPath("/data/weblogs/ weblog_entries.txt"), new Path("./weblog_entries.txt"))。更多关于文件系统的接口信息描述可以见官方文档http://hadoop.apache.org/docs/r1.0.4/api/org/apache/hadoop/fs/FileSystem.html

mkdir可以通过hadoop fs -mkdir PATH1 PATH2的形式来执行。例如,hadoop fs –mkdir /data/weblogs/12012012 /data/ weblogs/12022012将会在HDFS系统上分别创建两个文件夹/data/weblogs/12012012和/data/weblogs/12022012。如果文件夹创建成功则返回0,否则返回-1。

hadoop fs –mkdir /data/weblogs/12012012 /data/weblogs/12022012
hadoop fs –ls /data/weblogs

4

copyFromLocal可以通过hadoop fs –copyFromLocal LOCALFILEPATH URI的形式来执行,如果URI的地址(指的是HDFS://filesystemName:9000这个串)没有明确给出,则默认会读取core-site.xml中的fs.default.name这个属性。上传成功返回0,否则返回-1。

copyToLocal命令可以通过hadoop fs –copyToLocal [-ignorecrc] [-crc] URILOCAL_FILE_PATH的形式来执行。如果URI的地址没有明确的给出,则默认会读取core-site.xml中的fs.default.name这个属性。copyToLocal会执行CRC(Cyclic Redundancy Check)校验保证已复制的数据的正确性,一个失败的副本复制可以通过 参数–ignorecrc来强制执行,还可以通过-crc参数在复制文件的同时也复制crc校验文件。

更多参考
put命令与copyFromLocal类似,put更通用一些,可以复制多个文件到HDFS中,也能接受标准输入流。

任何使用copyToLocal的地方都可以用get替换,两者的实现一模一样。

在使用MapReduce处理大数据时,其输出结果可能是一个或者多个文件。最终输出结果的文件个数是由mapred.reduce.tasks的值决定的。我们可以在Jobconf类中通过setNumReduceTasks()方法来设置这个属性,改变提交作业的reduce个数,每个reduce将对应输出一个文件。该参数是客户端参数,非集群参数,针对不同的作业应该设置不同的值。其默认值为1,意味着所有Map(映射函数,以下都用Map表示)的输出结果都将复制到1个reducer上进行处理。除非Map输出的结果数据小于1 GB,否则默认的配置将不合适。reduce个数的设置更像是一门艺术而不是科学。在官方的文档中对其设置推荐的两个公式如下:

0.95×NUMBER_OF_NODES×mapred.tasktracker.reduce.tasks.maximum

或者

1.75×NUMBER_OF_NODES×mapred.tasktracker.reduce.tasks.maximum

假设你的集群有10个节点来运行Task Tracker,每个节点最多可以启动5个reduce槽位(通过设置tasktracker.reduce.tasks.maximum这个值来决定每个节点所能启动的最大reduce槽位数)对应的这个公式应该是0.95×10×4=47.5。因为reduce个数的设置必须是整数,所以需要进行四舍五入。

JobConf文档中给出了使用这两个公式的理由,具体见http://hadoop.apache.org/docs/
current/api/org/apache/hadoop/mapred/JobConf.html#setNumReduceTasks(int))。

0.95可以保证在map结束后可以立即启动所有的reduce进行map结果的复制,只需要一波就可以完成作业。1.75使得运行比较快的reducer能够再执行第二波reduce,保证两波reduce就能完成作业,使作业整体的负载均衡保持得比较好。

reduce输出的数据存储在HDFS中,可以通过文件夹的名称来引用。若文件夹作为一个作业的输入,那么该文件夹下的所有文件都会被处理。上文介绍的get和copyToLocal只能对文件进行复制,无法对整个文件夹进行复制2。当然Hadoop提供了getmerge命令,可以将文件系统中的多个文件合并成一个单独的文件下载到本地文件系统。

通过以下Pig脚本来演示下getmerge命令的功能:

weblogs = load '/data/weblogs/weblog_entries.txt' as
                (md5:chararray,
                  url:chararray,
                  date:chararray,
                  time:chararray,
                  ip:chararray);

md5_grp = group weblogs by md5 parallel 4;

store md5_grp into '/data/weblogs/weblogs_md5_groups.bcp';

Pig脚本可以通过下面的命令行来执行:

pig –f weblogs_md5_group.pig

3

该脚本逐行读取HDFS上的weblog_entries.txt文件,并且按照md5的值进行分组。parallel是Pig脚本用来设置reduce个数的方法。由于启动了4个reduce任务,所以会在输出的目录/data/weblogs/weblogs_md5_groups.bcp中生成4个文件。

注意,weblogs_md5_groups.bcp实际上是一个文件夹,显示该文件夹的列表信息可以看到:
2

在/data/weblogs/weblogs_md5_groups.bcp中包含4个文件,即part-r-00000、part-r-00001、part-r-00002和part-r-00003。

getmerge命令可以用来将4个文件合并成一个文件,并且复制到本地的文件系统中,具体命令如下:

hadoop fs -getmerge /data/weblogs/weblogs_md5_groups.bcp weblogs_md5_groups.bcp

操作完我们可以看到本地文件列表如下:


1

延伸阅读

  • u关于HDFS数据的读写,我们将在第2章中重点介绍如何直接利用文件系统的API进行读写。
  • 通过以下的两个链接可以对比出文件系统shell命令与Java API的不同:
http://hadoop.apache.org/docs/r1.0.4/file_system_shell.html http://hadoop.apache.org/docs/r1.0.4/api/org/apache/hadoop/fs/FileSystem.html
相关文章
|
9天前
|
SQL 存储 分布式计算
HDFS数据(跨集群)迁移
HDFS数据(跨集群)迁移
|
15天前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
36 1
|
26天前
|
存储 缓存 分布式计算
|
10天前
|
存储 分布式计算 资源调度
Hadoop生态系统概览:从HDFS到Spark
【8月更文第28天】Hadoop是一个开源软件框架,用于分布式存储和处理大规模数据集。它由多个组件构成,旨在提供高可靠性、高可扩展性和成本效益的数据处理解决方案。本文将介绍Hadoop的核心组件,包括HDFS、MapReduce、YARN,并探讨它们如何与现代大数据处理工具如Spark集成。
33 0
|
26天前
|
存储 分布式计算 Hadoop
|
7天前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
36 0
|
12天前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
13天前
|
存储 SQL 分布式计算
Hadoop生态系统概述:构建大数据处理与分析的基石
【8月更文挑战第25天】Hadoop生态系统为大数据处理和分析提供了强大的基础设施和工具集。通过不断扩展和优化其组件和功能,Hadoop将继续在大数据时代发挥重要作用。
|
15天前
|
资源调度 分布式计算 Hadoop
揭秘Hadoop Yarn背后的秘密!它是如何化身‘资源大师’,让大数据处理秒变高效大戏的?
【8月更文挑战第24天】在大数据领域,Hadoop Yarn(另一种资源协调者)作为Hadoop生态的核心组件,扮演着关键角色。Yarn通过其ResourceManager、NodeManager、ApplicationMaster及Container等组件,实现了集群资源的有效管理和作业调度。当MapReduce任务提交时,Yarn不仅高效分配所需资源,还能确保任务按序执行。无论是处理Map阶段还是Reduce阶段的数据,Yarn都能优化资源配置,保障任务流畅运行。此外,Yarn还在Spark等框架中展现出灵活性,支持不同模式下的作业执行。未来,Yarn将持续助力大数据技术的发展与创新。
27 2
下一篇
DDNS