HDFS和本地文件系统文件互导

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS和本地文件系统文件互导相关的知识,希望对你有一定的参考价值。

参考技术A 初步了解一下情况,后续根据给出案例

一、从本地文件系统到HDFS

使用hdfs自带的命令

命令:hdfs dfs -copyFromLocal inputPath outputPath

inputPath:本地文件目录的路径

outputPath:hdfs文件目录路径,即存储路径

二、从HDFS到本地文件系统

命令:hdfs dfs -copyToLocal inputPath outputPath

inputPath:hdfs文件目录

outputPath:本地文件文件目录,即本地存储路径

因为Hbas和Hive都在存储在HDFS中,所以可以通过该条命令可以把Hbase和Hive存储在HDFS中的文件复制出来。但是经过实践,通过这种方式复制出来的Hbase文件是乱码。Hive里的文件有时候也会乱码,这取决于Hive数据的插入方式。

三、文件在HDFS内的移动

1、从Hbase表导出数据到HDFS

命令:hbase org.apache.hadoop.hbase.mapreduce.Export tableName outputPaht

例子:hbase org.apache.hadoop.hbase.mapreduce.Export test /user/data

test为需要从Hbase中导出的表,/user/data为hdfs上的路径,即存储路径,如果最后一个参数有前缀file:// 则为本地上的文件存储系统

2、从HDFS导入到Hbase表中,需要事先建立好表结构

命令:hbase org.apache.hadoop.hbase.mapreduce.Export tableName inputPaht

例子:hbase org.apache.hadoop.hbase.mapreduce.Import test1 /temp/part-m-00000

案列:

两个不同环境数据,数据导入

过程描述:

            导出正式环境数据到hdfs中,然后从hdfs中导出到本地,本地传到测试环境主机,然后从本地导入到hdfs中,再从hdfs中导入到hbase中。

处理过程:

1、注意事项:1、权限问题使用hdfs:sudo -u hdfs ;

                      2、存放上传路径最好不要在root下

                      3、上传完成后,查看是否在使用,数据已经插入。

1、sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Export ** /hbase/**_bak  (导出到hdfs中的**_bak)

2、hdfs dfs -copyToLocal /hbase/sw_bak /test  (导出hdfs中文件到本地test,注:提前建好目录)

3、scp -r test_bak root@192.168.90.**:/root/test  (传送目录到测试环境主机目录下,注:传到测试环境后,把文件不要放到root的目录下,换家目录下)

4、sudo -u hdfs hdfs dfs -copyFromLocal /chenzeng/text_bak /data (把sw传到hdfs 中,注意上传时,文件路径要对,放在data路径下比较好)

5、sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Import test /data/test_bak/part-m-0000 (注意上次文件)

6、在hbase shell 中查看test :count 'test' 确认是否上传成功

优化:

truncate ‘’

正式环境导入至hdfs中时,

可以直接在另一个环境的执行sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Import test hdfs://server243:8020/hbase****  可以直接加主机和对应路径进行put。

sc.textFile()默认读取本地系统文件还是HDFS系统文件?

文章目录

一、Spark集群拓扑

二、做好准备工作

(一)准备本地系统文件

  • /home目录里创建test.txt

(二)准备HDFS系统文件

  • test.txt上传到HDFS系统的/park目录里

(三)启动HDFS服务

  • 执行命令:start-dfs.sh

三、以–master=local[*]方式启动spark-shell

(一)尝试读取本地系统文件和HDFS系统上的文件

  • --master=local[*]方式启动spark-shell

1、读取本地系统/home/test.txt文件创建RDD,不加file://

  • 执行命令:val rdd = sc.textFile("/home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容

2、读取本地系统/home/test.txt文件创建RDD,加上file://

  • 执行命令:val rdd = sc.textFile("file:///home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 执行命令::quit,退出spark-shell

3、读取HDFS系统上的文件/park/test.txt,不加hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("/park/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 报错,因为读取的不是HDFS系统上的文件/park/test.txt,而是本地系统文件/park/test.txt,显然这个文件是不存在的

4、读取HDFS系统上的文件/park/test.txt,加上hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("hdfs://master:9000/park/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容

(二)根据上述尝试得到结论

  • --master=local[*]方式启动spark-shell,sc.textFile()默认读取本地系统文件,比如sc.textFile("/home/test.txt")就相当于sc.textFile("file:///home/test.txt"),要访问HDFS系统上的/park/test.txt,必须要写成sc.textFile("hdfs://master:9000/park/test.txt")

四、以–master=spark://master:7077方式启动spark-shell

(一)尝试读取本地系统文件和HDFS系统上的文件

  • --master=spark://master:7077方式启动spark-shell

1、读取本地系统/home/test.txt文件创建RDD,不加file://

  • 执行命令:val rdd = sc.textFile("/home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 报错,因为读取的是HDFS系统上的文件/home/test.txt,文件不存在

2、读取本地系统/home/test.txt文件创建RDD,加上file://

  • 执行命令:val rdd = sc.textFile("file:///home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 报错,加上file://,依然说文件/home/test.txt不存在

3、读取HDFS系统上的文件/park/test.txt,不加hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("/park/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容

4、读取HDFS系统上的文件/park/test.txt,加上hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("hdfs://master:9000/park/test.txt")

  • 执行命令:rdd.collect(),查看RDD的内容

  • 执行命令::quit,退出spark-shell

(二)根据上述尝试得出结论

  • --master=spark://master:7077方式启动spark-shell,sc.textFile()不能访问本地系统文件,只能读取HDFS系统文件,对于文件/park/test.txt,必须写成hdfs://master:9000/park/test.txt才能访问,否则会报错。

五、小结

  • 如果以 spark-shell --master spark://master:7077方式启动spark-shell,只能读取HDFS系统上的文件,不能读取本地系统文件,而以spark-shell --master=local[*]方式启动spark-shell,既可以读取本地系统文件,加不加file://都可以,还可以访问HDFS系统上的文件,但是必须加上hdfs://master:9000

以上是关于HDFS和本地文件系统文件互导的主要内容,如果未能解决你的问题,请参考以下文章

sc.textFile()默认读取本地系统文件还是HDFS系统文件?

请问hadoop的hdfs文件系统和本地windows文件系统或linux文件系统是啥关系啊,谢谢

HDFS-NFS-网关

如何将文件从 HDFS 复制到本地文件系统

将文件/块从 HDFS 复制到从节点的本地文件系统

通过 Apache Flume 将日志文件从本地文件系统移动到 HDFS 时出错