1.hadoop目录查询指令
hadoop集群中使用了hdfs作为文件存储方式
hadoop fs –ls /user/hive/warehouse
2.hadoop数据迁移指令
hadoop distcp hdfs://nn1:8020/user/hive/warehouse/foo hdfs://nn2:8020/user/hive/warehouse
nn1是数据源的ip或集群中的命名,nn2是迁移到的目标ip。
foo是hdfs存放元数据的根目录,同时也是impala表的表名(下面会提到)。迁移的时候目录会从nn1的集群复制迁移到nn2的warehouse目录下。
迁移完成后,通过1的指令查看目标底下是否存在目录和数据,验证数据迁移是否成功。
3.创建impala数据表结构
集群使用impala作为hdfs的大数据查询工具。Impala按照SQL的标准来进行数据库表搜索。
(1) 首先在nn1上找到建表语句
impala-shell 指令进入到impala的命令行
use default; 使用default数据库
show create table foo; 查看元数据的表结构
(2) 在nn2上创建同样的表结构
复制nn1的表结构,在nn2上创建。之后,验证源数据和目标数据是否一致,确保数据的完整性,迁移完成。使用以下impala语句。
select count(*) from foo;
select * from foo limit 10;
4. 迁移过程中遇到的问题
(1)内存占用过大,迁移工作卡顿
频繁的多开迁移数据会造成服务器压力过大。且迁移过程中占用的内存在迁移任务结束后也不会释放。影响迁移效率。
因此需要频繁的清空服务器集群中缓存,指令如下。
sync
echo 3 > /proc/sys/vm/drop_caches
(2)cdh版本不同
nn1的集群和nn2的集群所安装的cdh的版本是不一样的。
这个问题主要出现在数据量超过千万的表迁移的时候,需要在迁移的时候加如下2个参数,以及nn2下新增的目录foo。
hadoop distcp –skipcrccheck -update hdfs://nn1:8020/user/hive/warehouse/foo hdfs://nn2:8020/user/hive/warehouse/foo
(3)十亿条以上记录的表迁移失败
解决方法使用通配符*进行分批迁移,视情况分多少批。
如test_table表内有21e数据,表内是按照day进行分区
第一次将数据分成18年和19年2部分进行迁移,失败了。
hadoop distcp
hdfs://nn1:8020/user/hive/warehouse/test_table/day=2018*
hdfs://nn2:8020/user/hive/warehouse/test_table
第二次将数据按照月份进行迁移,部分成功。
hadoop distcp
hdfs://nn1:8020/user/hive/warehouse/test_table/day=201801*
hdfs://nn2:8020/user/hive/warehouse/test_table
5.可能提升迁移效率的方法
清空垃圾回收站,在hadoop集群中迁移失败而删除的文件都会保存在.Trash目录中。方便找回,占用资源。通过以下指令进行删除。
hadoop fs -rmr .Trash