《Hadoop实战手册》一1.2 使用Hadoop shell命令导入和导出数据到HDFS
本节书摘来异步社区《Hadoop实战手册》一书中的第1章,第1.2节,作者: 【美】Jonathan R. Owens , Jon Lentz , Brian Femiano 译者: 傅杰 , 赵磊 , 卢学裕 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 使用Hadoop shell命令导入和导出数据到HDFSHDFS提供了许多shell命令来实现访问文件系统的功能,这些命令都是构建在HDFS FileSystem API之上的。Hadoop自带的shell脚本是通过命令行来执行所有操作的。这个脚本的名称叫做hadoop,通常安装在$HADOOP_BIN目录下,其中$HADOOP_BIN是Hadoopbin文件完整的安装目录,同时有必要将$HADOOP_BIN配置到$PATH环境变量中,这样所有的命令都可以通过hadoop fs -command这样的形式来执行。
如果需要获取文件系统的所有命令,可以运行hadoop命令传递不带参数的选项fs。
hadoop fs
这些按照功能进行命名的命令的名称与Unix shell命令非常相似。使用help选项可以获得某个具体命令的详细说明。
hadoop fs –help ls
这些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
复制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
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
该脚本逐行读取HDFS上的weblog_entries.txt文件,并且按照md5的值进行分组。parallel是Pig脚本用来设置reduce个数的方法。由于启动了4个reduce任务,所以会在输出的目录/data/weblogs/weblogs_md5_groups.bcp中生成4个文件。
注意,weblogs_md5_groups.bcp实际上是一个文件夹,显示该文件夹的列表信息可以看到:
在/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
操作完我们可以看到本地文件列表如下:
延伸阅读
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
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- ASP.NET Core MVC上传、导入、导出知多少
- redis中使用redis-dump导出、导入、还原数据实例
- 导出导入Docker镜像
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- POI 导入excel数据自己主动封装成model对象--代码分析
- matlab学习笔记4--导入和导出Internet数据
- [转]docker离线安装并导入镜像(从可联网机器导出镜像方法)
- [转]oracle11g数据库导入导出方法教程
- [转]org.apache.poi3.1.7 Excle并发批量导入导出,格式设置方式需要修改
- Docker镜像的导入导出
- Specified key was too long; max key length is 767 bytes导入mysql数据库表报错
- Qt编写的项目作品18-数据导入导出(xls/pdf)及打印示例
- DB2导入导出数据库数据
- CocoaPods导入第三方库头文件自动补齐
- 《R语言与数据挖掘最佳实践和经典案例》—— 第2章 数据的导入与导出
- 解决 com.sun.*包导入错误
- 关于玩QQ消息导入导出功能的感想!
- Java spring mvc jsp excel 导入
- SQL Server 2008 导出数据与导入数据任务介绍
- oracle多种导入导出数据方法
- 常用开发工具 之 MySql 数据库数据的导出与导入(简单数据备份与还原)
- sqlyog导入数据库脚本报错
- CSS 的导入方式 (link or import ?)
- C语言图形导入与导出
- mysql导入报错 [Err] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'
- 通过cmd窗口导入导出mysql数据库
- CAD软件中怎么批量导入导出坐标数据?
- 全快闪储存导入新型Flash存储器以降低成本、生态大洗牌
- mysql数据导入导出