上传文件到HDFS

hadoop计算需要在hdfs文件系统上进行,文件上传到hdfs上通常有三种方法:a hadoop自带的dfs服务,put;b hadoop的API,Writer对象可以实现这一功能;c 调用OTL可执行程序,数据从数据库直接进入hadoop

  hadoop计算需要在hdfs文件系统上进行,因此每次计算之前必须把需要用到的文件(我们称为原始文件)都上传到hdfs上。文件上传到hdfs上通常有三种方法:

    a hadoop自带的dfs服务,put;

    b hadoop的API,Writer对象可以实现这一功能;

    c 调用OTL可执行程序,数据从数据库直接进入hadoop

  由于存在ETL层,因此第三种方案不予考虑

  将a、b方案进行对比,如下:

    1 空间:方案a在hdfs上占用空间同本地,因此假设只上传日志文件,则保存一个月日志文件将消耗掉约10T空间,如果加上这期间的各种维表、事实表,将占用大约25T空间

                  方案b经测试,压缩比大约为3~4:1,因此假设hdfs空间为100T,原来只能保存约4个月的数据,现在可以保存约1年

    2 上传时间:方案a的上传时间经测试,200G数据上传约1小时

                            方案b的上传时间,程序不做任何优化,大约是以上的4~6倍,但存在一定程度提升速度的余地

    3 运算时间:经过对200G数据,大约4亿条记录的测试,如果程序以IO操作为主,则压缩数据的计算可以提高大约50%的速度,但如果程序以内存操作为主,则只能提高5%~10%的速度

    4 其它:未压缩的数据还有一个好处是可以直接在hdfs上查看原始数据。压缩数据想看原始数据只能用程序把它导到本地,或者利用本地备份数据

    压缩格式:按照hadoop api的介绍,压缩格式分两种:BLOCK和RECORD,其中RECORD是只对value进行压缩,一般采用BLOCK进行压缩。

    对压缩文件进行计算,需要用SequenceFileInputFormat类来读入压缩文件,以下是计算程序的典型配置代码:

JobConf conf = new JobConf(getConf(), log.class);
    conf.setJobName(”log”);
    conf.setOutputKeyClass(Text.class);//set the map output key type
    conf.setOutputValueClass(Text.class);//set the map output value type

    conf.setMapperClass(MapClass.class);
    //conf.setCombinerClass(Reduce.class);//set the combiner class ,if havenot, use Recuce class for default
    conf.setReducerClass(Reduce.class);
    conf.setInputFormat(SequenceFileInputFormat.class);//necessary if use compress

    接下来的处理与非压缩格式的处理一样

本文出自:http://rdc.taobao.com/blog/dw/archives/207

<think>好的,我现在需要回答用户关于如何使用Hadoop的`hadoop fs -put`命令上传文件HDFS的问题。首先,我需要确保自己正确理解命令的语法和参数。根据用户提供的引用,特别是引用[2]和引用[3],用户已经给出了一些示例,但可能需要更详细的解释。 首先,我应该回顾`hadoop fs -put`的基本用法。根据引用[2],命令结构是`hadoop fs -put <本地路径> <HDFS目标路径>`。例如,`hadoop fs -put Desktop/testfile.txt /user/root/dir1/`。用户可能需要知道是否需要指定文件名,或者是否可以上传多个文件。 接下来,我需要考虑参数。引用[3]提到了`-p`选项用于保留状态,比如时间戳和权限。这可能是一个重要的细节,用户可能需要了解如何保留文件属性。另外,是否还有其他参数,比如覆盖文件时的选项,比如`-f`,这在其他HDFS命令中常见,例如引用[1]中的`-get`命令使用了`-f`。但不确定`-put`是否也有同样的参数,需要确认。 然后,是否需要处理目录上传?用户可能想知道如何上传整个目录到HDFS。例如,使用`-put`本地目录 HDFS目录,是否会递归上传? 另外,错误处理也很重要。例如,如果目标路径已存在文件,是否会覆盖?是否需要使用`-f`来强制覆盖?引用中可能没有明确说明,需要根据Hadoop文档补充这一点。 还有,用户可能需要示例,比如上传多个文件或目录的情况。例如,`hadoop fs -put file1.txt file2.txt /hdfs/dir`,或者上传整个目录`hadoop fs -put local_dir/ /hdfs/dir/`。 最后,注意事项方面,需要提到路径的正确性,权限问题,以及HDFS服务是否正常运行。例如,用户是否有写入权限,HDFS是否在运行状态。 总结步骤: 1. 基本命令结构 2. 参数解释(-p, -f等) 3. 单文件上传示例 4. 多文件上传示例 5. 目录上传示例 6. 注意事项(覆盖、权限、路径存在性等) 需要确保所有信息准确,并引用提供的参考资料,比如引用[2]和引用[3]中的示例。同时,检查是否有其他相关引用,比如引用[1]中的`-get`命令的参数是否与`-put`有相似之处,但可能不需要提及,除非用户问及。 可能还需要提到`-put`和`-copyFromLocal`的区别,因为引用[3]提到了`copyFromLocal`,但用户问的是`-put`。需要指出它们功能相似,但`-put`可以处理非本地路径吗?或者是否两者完全相同?根据Hadoop文档,`-put`和`-copyFromLocal`的区别在于前者可以从任何文件系统(包括本地)复制到HDFS,而后者仅限于本地文件系统。不过可能用户不需要这么详细,但如果有必要可以简要说明。 最后,生成相关问题,例如如何检查上传后的文件,如何递归上传目录,如何处理大文件上传,或者如何设置权限等。</think>### Hadoop FS -put 命令用法详解 #### 1. 基础语法格式 ```bash hadoop fs -put [-f] [-p] <本地源路径1> <本地源路径2> ... <HDFS目标路径> ``` - **`-f`**:覆盖已存在的目标文件(若未指定,重复上传同名文件会报错)[^3] - **`-p`**:保留文件属性(包括访问时间、修改时间、权限等) #### 2. 单文件上传示例 将本地文件 `testfile.txt` 上传HDFS 的 `/user/root/dir1/` 目录: ```bash hadoop fs -put Desktop/testfile.txt /user/root/dir1/ [^2] ``` #### 3. 多文件上传示例 上传本地目录下的 `file1.txt` 和 `file2.txt` 到 HDFS 的 `/data/inputs/`: ```bash hadoop fs -put /local/path/file1.txt /local/path/file2.txt /data/inputs/ ``` #### 4. 递归上传目录 上传整个本地目录 `local_dir` 到 HDFS(自动创建同名目录): ```bash hadoop fs -put /local/path/local_dir/ /hdfs/target/path/ ``` #### 5. 强制覆盖与保留属性 强制覆盖 HDFS 上的现有文件,并保留原始属性: ```bash hadoop fs -put -f -p /local/file.csv /hdfs/backup/ ``` #### 6. 注意事项 - **路径验证**:确保本地文件存在且 HDFS 目标路径有写入权限。 - **目录存在性**:若 HDFS 目标目录不存在,需先使用 `hadoop fs -mkdir` 创建。 - **性能优化**:上传文件时建议禁用校验(通过 `-Ddfs.checksum.combine.mode=IGNORE_CRC`)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值