通过Hadoop Shell命令进行导入导出操作

来源:互联网 发布:内存卡恢复数据软件 编辑:程序博客网 时间:2024/05/19 07:10

通过Hadoop Shell命令进行导入导出操作

HDFS提供了Shell命令来访问他的大多数功能。这些命令建立在HDFS FileSystem API的基础上。Hadoop提供的Shell脚本从命令行与Hadoop进行交互,这个Shell脚本叫做hadoop,通常位于$HADOOP_BIN目录,他是Hadoop的二进制文件目录。为了方便起见,$HADOOP_BIN通常被放在$PATH环境变量中。所有的Hadoop文件系统脚本的形式如下hadoop fs。

为了获得文件系统的所有命令,可以不加任何参数运行hadoop fs命令获得:

hadoop fs

或者从官方文档中获得:http://hadoop.apache.org/docs/r1.2.1/file_system_shell.html#ls

这些命令类型Unix Shell命令

例如:

[hadoop@Master bin]$ hadoop fs -help ls
-ls <path>: List the contents that match the specified file pattern. If
path is not specified, the contents of /user/<currentUser>
will be listed. Directory entries are of the form 
dirName (full path) <dir> 
and file entries are of the form 
fileName(full path) <r n> size 
where n is the number of replicas specified for the file 
and size is the size of the file, in bytes.

在本节中,将使用Hadoop Shell脚本进行数据导入导出操作,这些命令常被用作导入特定的数据,加载处理过的数据,维护文件系统,浏览文件夹里的内容。了解这些命令有助于在HDFS中高效的工作。

1、准备工作

数据来源http://download.csdn.net/detail/sn_gis/7477233,位于\Chap 4\data\weblog_entries.txt

2、操作步骤

按照以下步骤完成创建文件夹,并将weblog_entries.txt从本地拷贝到HDFS中
(1)在HDFS中创建文件夹来存储weblog_entries.txt
hadoop fs -mkdir /data/weblog
(2)将weblog_entries.txt从本地文件系统拷贝到HDFS中
hadoop fs -copyFromLocal /usr/localDataDir/weblog_entries.txt /data/weblogs

其中红色为本地目录中的文件,绿色为HDFS中目录

(3)在HDFS中列出weblog_entries.txt

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

(4)以下的内容将HDFS中的内容拷贝到本地

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

3、工作原理

The Hadoop shell commands are a convenient wrapper around the HDFS FileSystem API.

Hadoop Shell实际上是HDFS FileSystem API的包装类来实现的。

4、了解更多

命令put类似于copyFromLocal,尽管put更通用,可以同时将多个文件拷贝到HDFS,同时可以从 标准输入流中读入数据。

命令get类似于copyToLocal。

当操作大数据集的时候,一个任务的输出将被分成一块或者多块。分成多少块由JobConf类的mapred.reduce.tasks属性控制,这个属性可以通过setNumReduceTasks() 方法设置。这个属性对于不同作业应该有不同的设置,因此,这个属性的设置应该是作业级别而不是集群级别。这个属性的默认值是1,这就意味着所有的马匹任务执行的结果将会发送给同一个reducer进行处理。一般情况下,除非处理的数据低于GB级别,要不默认值1不会被使用。设置reduce task的数目是一项功夫而不是科学。在JobConf的文档中推荐一下两个公式:

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

或者

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


例如,如果有10个 task tracker,mapred.tasktracker.reduce.tasks.maximum属性被设置为5,则按照第一个公式计算得:

0.95*10*5=47.5=47(48)。

在JobConf文档中指出:

系数取0.95时,当maps结束时,reducers能够立即启动,开始传输map的结果。

系数取1.75时,快的节点能够快速完成他们的第一轮reducers,进行他的第二轮reducer。

被分割的输出,在HDFS中,可以通过文件夹引用。一个作业可以读取文件的每一个部分当处理这些文件时。问题是get命令和copyToLocal命令只能操作文件。他们不能用于拷贝文件夹。通过一个一个的拷贝每一部分,然后在本地合并通常是很麻烦的,并且效率也不高。幸运的是,Hadoop Shell提供了getmerge命令来讲分布系统上的部分文件合并成单一的输出文件,并将其拷贝到本地文件系统中。

通过Pig脚本描述这一过程:

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

通过LOAD命令将数据按行内存

md5_grp = group weblogs by md5 parallel 4;

通过md5值进行分组,并且设定mapred.reduce.tasks的值为4。

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

最终将数据存入/data/weblogs/weblogs_md5_groups.bcp中

/data/weblogs/weblogs_md5_groups.bcp实质上是文件夹

通过查看

grunt> ls hdfs://192.168.11.131:9000/data/weblogs/weblogs_md5_groups.bcp
hdfs://192.168.11.131:9000/data/weblogs/weblogs_md5_groups.bcp/_SUCCESS<r 1>0
hdfs://192.168.11.131:9000/data/weblogs/weblogs_md5_groups.bcp/part-r-00000<r 1>85435
hdfs://192.168.11.131:9000/data/weblogs/weblogs_md5_groups.bcp/part-r-00001<r 1>91250
hdfs://192.168.11.131:9000/data/weblogs/weblogs_md5_groups.bcp/part-r-00002<r 1>87771

hdfs://192.168.11.131:9000/data/weblogs/weblogs_md5_groups.bcp/part-r-00003<r 1>90129

可以看出,文件夹中包含part-r-00000,part-r-00001,part-r-00002,part-r-00003,还有/_SUCCESS。

可以通过getmerge命令将四个部分文件合并成一个文件,并拷贝到本地:

hadoop fs -getmerge /data/weblogs/weblogs_md5_groups.bcp /usr/localDataDirFromHDFS/merged.txt

通过vim /usr/localDataDirFromHDFS/merged.txt查看导出的文件



0 0
原创粉丝点击