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集群拓扑
- 二、做好准备工作
- 三、以--master=local[*]方式启动spark-shell
- 四、以--master=spark://master:7077方式启动spark-shell
- 五、小结
一、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系统文件?