我在速度极快的 SAN 磁盘中有大量文件,我喜欢对它们进行 Hive 查询。
一个明显的选择是使用如下命令将所有文件复制到 HDFS 中:
hadoop dfs -copyFromLocal /path/to/file/on/filesystem /path/to/input/on/hdfs
但是,我不想创建我的文件的第二个副本,只是为了在其中进行 Hive 查询。
有什么方法可以将 HDFS 文件夹指向本地文件夹,以便 Hadoop 将其视为实际的 HDFS 文件夹?文件不断添加到 SAN 磁盘,因此 Hadoop 需要在添加新文件时查看它们。
这类似于 Azure 的 HDInsight 方法,您将文件复制到 blob 存储中,HDInsight 的 Hadoop 通过 HDFS 查看它们。
最佳答案
使用本地文件系统处理小文件可能没问题,但我不会出于任何其他目的这样做。
将文件放入 HDFS 意味着它被分割成 block ,这些 block 被复制和分发。
这会在以后为您提供性能和可用性。
可以使用 file:///
将 [外部] 表的位置定向到本地文件系统。
无论它运行顺利还是您会开始遇到各种错误,这都是有待观察的。
请注意,对于演示,我在这里做了一个小技巧来将位置定向到特定文件,但您的基本用途可能是目录。
演示
create external table etc_passwd
(
Username string
,Password string
,User_ID int
,Group_ID int
,User_ID_Info string
,Home_directory string
,shell_command string
)
row format delimited
fields terminated by ':'
stored as textfile
location 'file:///etc'
;
alter table etc_passwd set location 'file:///etc/passwd'
;
select * from etc_passwd limit 10
;
+----------+----------+---------+----------+--------------+-----------------+----------------+
| username | password | user_id | group_id | user_id_info | home_directory | shell_command |
+----------+----------+---------+----------+--------------+-----------------+----------------+
| root | x | 0 | 0 | root | /root | /bin/bash |
| bin | x | 1 | 1 | bin | /bin | /sbin/nologin |
| daemon | x | 2 | 2 | daemon | /sbin | /sbin/nologin |
| adm | x | 3 | 4 | adm | /var/adm | /sbin/nologin |
| lp | x | 4 | 7 | lp | /var/spool/lpd | /sbin/nologin |
| sync | x | 5 | 0 | sync | /sbin | /bin/sync |
| shutdown | x | 6 | 0 | shutdown | /sbin | /sbin/shutdown |
| halt | x | 7 | 0 | halt | /sbin | /sbin/halt |
| mail | x | 8 | 12 | mail | /var/spool/mail | /sbin/nologin |
| uucp | x | 10 | 14 | uucp | /var/spool/uucp | /sbin/nologin |
+----------+----------+---------+----------+--------------+-----------------+----------------+
关于hadoop - 是否有任何可行且简单的选项将本地文件夹用作 Hadoop HDFS 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140658/