Hadoop分布式文件系统——导入和导出数据

    一、使用hadoop shell命令导入和导出数据到HDFS
        →1、创建新目录:hadoop fs -mkdir /data/logs/
        →2、从本地复制到HDFS的新目录:hadoop fs -copyFromLocal entries.log /data/logs
        →3、列出HDFS上entries.log文件信息:hadoop fs -ls /data/logs/entries.log
        →4、将HDFS上的entries.log复制到本地当前目录下:hadoop fs -copyToLocal /data/logs/entries.log ./entries.log
        →5、copyFromLocal与put命令类似,put更通用;copyToLocal与get命令的实现完全一样。
        →6、MapReduce的输出结果可能是一个或者多个,最终输出结果的文件个数是由mapred.reduce.tasks的值决定的。可以通过Jobconf类中的setNumReduceTasks()方法来设置。该参数是客户端参数,非集群参数,默认值为1。官方推荐的设置公式为:0.95 * NUMBER_OF_NODES * mapred.tasktracker.reduce.maximum,或者是1.75 * NUMBER_OF_NODES * mapred.tasktracker.reduce.tasks.maximum。0.95可以保证在map结束后可以立即望去所有的reduce;1.75使得运行比较快的reducer能够再执行第二波reduce,保证两波reduce就能完成作业,使作业整体的负载均衡保持得比较好。
        →原理简析:Hadoop shell非常轻量地封装在HDFS FileSystem API之上。在执行hadoop命令时,如果传进去的参数是fs,实际上执行的是org.apache.hadoop.fs.FsShell这个类。在0.20.2版本中FsShell实例化了一个org.apache.hadoop.fs.FileSystem对象,并且将命令行参数与方法映射起来。比如,执行hadoop fs -mkdir /data/logs/相当于调用了FileSystem.mkdirs(new Path(“/data/logs/”))。

    二、使用distcp实现集群间数据复制
        distcp是通过启动MapReduce实现数据复制的。使用MapReduce的好处包含可并行性、高容错性、作业恢复、日志记录、进度汇报。
        操作前,最好关闭复制源集群map任务的推测机制,可以在配置文件mapred-site.xml中将mapred.map.tasks.speculative.execution的值设置为false来实现。同时,要保证两个集群之间的hadoop版本完全一致,即保证RPC协议必须一致。
        →1、将集群A的logs文件夹复制到集群B上:hadoop distcp hdfs://namenodeA/data/logs hdfs://namenodeB/data/logs
        →2、将集群A的logs文件夹得到集群B上,并覆盖已存在的文件:hadoop distcp -overwrite hdfs://namenodeA/data/logs hdfs://namenodeB/logs
        →3、同步集群A和集群B之间的logs文件夹:hadoop distcp -update hdfs://namenodeA/data/logs hdfs://namenodeB/data/logs
        →注意,如果要在运行的hadoop版本不一的两个集群之间进行数据复制,一般在复制源集群使用HftpFileSystem。HftpFileSystem是一个只读的文件系统。相应的distcp命令只能在目标服务器上运行:hadoop distcp hftp://namenodeA:port/data/logs hdfs://namenodeB/data/logs。小心,这条命令中的port值要与配置文件hdfs-site.xml中的dfs.http.address属性的端口值一致。
        →原理简析:在源集群,文件夹中的内容将被复制为一个临时的大文件。将会启动一个只有map(map-only)的MapReduce作业来实现两个集群间的数据复制。默认情况下,每个map将会分配到一个256MB的数据块文件。distcp复制可通过设置参数手动启动map的数量,如hadoop distcp -m 10 hdfs://a/ hdfs://b/

    三、使用Sqoop从MySQL数据库导入数据到HDFS
        Sqoop是Apache基金下的一个项目,是庞大hadoop生态圈中的一部分。与distcp类似,都是建立在MapReduce之上的,利用了MapReduce的并行性和容错性。与集群间的数据复制不同,Sqoop设计通过JDBC驱动连接实现hadoop集群与关系数据库之间的数据复制。
        →1、将MySQL JDBC驱动包复制到$SQOOP_HOME/libs目录下。
        →2、在MySQL实例中创建一个新数据库:create database logs。
        →3、创建并载入表web_logs:
          use logs;
          create table web_logs (md5 varchar(32), url varchar(64), request_date date, request_time time, ip varchar(15));
          load data infile ‘/path/entries.log’ into table web_logs fields terminated by ‘\t’ lines terminated by ‘\r\n’。
        →4、查询web_logs表的行数:mysql > select count(*) from web_logs
        →5、将MySQL数据导出到HDFS:sqoop import -m 1 –connect jdbc:mysql://:/logs –username hdp_usr –password 123456 –table web_logs –target-dir /data/logs/import
        →工作原理:默认情况下,导入的数据将按主键进行分割。如果导入的表并不包含主键,必须指定-m或者–split-by参数决定导入的数据如何分割。Sqoop利用数据库中存储的元数据生成每一列的DBWritable类,这些类使用了DBInputFormat。DBInputFormat是Hadoop用来格式化读取数据库任意查询的结果。

    四、使用Sqoop从HDFS导出数据到MySQL
        →1、在MySQL实例中创建一个新数据库:create database logs;
        →2、创建表web_logs_from_hdfs:
          use logs;
          create table web_logs_from_hdfs (md5 varchar(32), url varchar(64), request_date date, request_time time, ip varchar(15));
        →3、从HDFS导出entries.log文件到MySQL:sqoop export -m 1 –connect jdbc:mysql://:/logs –username hdp_usr –password 123456 –table web_logs_from_hdfs –export-dir /data/logs/ –input-fields-terminated-by ‘\t’ –mysql-delmiters
        →Sqoop export默认情况下是创建新增语句。如果–update-key参数被设置,则将是创建更新语句。如果–update-key设置的值并没找到,可以设置–update-mode为allowinsert允许新增这行数据。-m参数决定将配置几个mapper来读取HDFS上文件块。设置参数–staging-table,会促使任务将数据插入一个临时表,等待一个事务完成再将数据从临时表复制到–table参数配置的表中。临时表必须是一个空表,否则需要配置参数–clear-staging-table。

    五、从HDFS导出数据到MongoDB
        先从github上克隆Mongo-Hadoop工程,并且将该工程编译到一个特定的Hadoop版本,编译完的JAR文件需要复制到Hadoop集群每个节点的

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值