• Hadoop 之 Sqoop 安装配置与示例


    Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。

    接下来我们看一下如何安装与做简单示例

    要安装Sqoop与简单应用,当然需要先安装好Hadoop,Hive, 相关的数据库,如Mysql,Sql Server

    一、下载安装包

    1、 下载地址:选择CDH相应版本下的

    http://archive.cloudera.com/cdh5/cdh/5/

    下载sqoop-1.4.5-cdh5.3.6.tar.gz安装包

    2、解压sqoop-1.4.5-cdh5.3.6.tar.gz至指定目录,如:/opt

           mv sqoop-1.4.5-cdh5.3.6.tar.gz  /opt

           tar -zxvf sqoop-1.4.5-cdh5.3.6.tar.gz

    二、配置环境变量

          /etc/profile

    #sqoop enviroment 
    export SQOOP_HOME=/opt/sqoop-1.4.5-cdh5.3.6
    export PATH=$PATH:$SQOOP_HOME/bin

    三、Sqoop配置项更改

     1、$HIVE_HOME/conf/hive-env.sh

      example,这里具体值是我本地测试目录,可自行更改,如果数据操作不涉及Hbase,那么相关Hbase的配置可以不配,如果没有独立的ZooKeeper集群,那么ZooKeeper不用配置

    export HADOOP_COMMON_HOME=/opt/hadoop/hadoop-2.7.3
    #Set path to where hadoop-*-core.jar is available
    #export HADOOP_MAPRED_HOME=
    export HADOOP_MAPRED_HOME=/opt/hadoop/hadoop-2.7.3
    
    #set the path to where bin/hbase is available
    #export HBASE_HOME=
    
    #Set the path to where bin/hive is available
    #export HIVE_HOME=
    export HIVE_HOME=/opt/hive/apache-hive-2.1.1.bin

    2、配置jdbc驱动包

    下载mysql的jdbc驱动包mysql-connector-java-5.1.6-bin.jar放入sqoop的lib目录下$SQOOP_HOME/lib

    下载sqlserver的jdbc驱动包sqljdbc4.jar放入sqoop的lib目录下$SQOOP_HOME/lib

    四、连接数据库与表命令

        因本地Sql server数据库的表有数据,就以Sql Server为例,mysql相似

        1、连接数据库,查看数据库列表  

    sqoop list-databases
     --connect 'jdbc:sqlserver://10.10.0.1:1433;instanceName=SQL2008;username=test;password=test;database=testDB'

      2、连接sqlserver列出数据库在表    

    sqoop list-tables 
    --connect
    'jdbc:sqlserver:// 10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=testDB’

      3、导入数据库中查询的结果到指定的hdfs中目录 

    sqoop import 
    --connect 'jdbc:sqlserver://10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=TestDB' 
    - -query 'select CustomerID,UserName from Customer where $CONDITIONS  ' 
    --target-dir /user/hive/warehouse/tmp2 
    --num-mappers 1

    可选参数

    --table  //指定表名

    --as-parquetfile //指定文件格式

    --columns id,account  //指定表的列

    指定压缩

    --compress

    --compression-codec org.apache.hadoop.io.compress.SnappyCodec

     --fields-terminated-by ' '   //指定列的分隔符,这个很关键,在导入导出时最好指定

    #增量导入

    --incremental append

    - -check-column id  //以哪个字段为依据,如id字段

    --last-value 4

    4、从sql server中导入到hive数据库中

    sqoop import 
    --connect 'jdbc:sqlserver://10.0.0.1:1433;instance=SQL2008;username=test;password=test;database=TestDB' 
    --table Customer 
    --fields-terminated-by ',' 
    --num-mappers 1 
    --hive-import 
    --hive-database mydatabase 
    --hive-table test_table

    5、从HDFS中将数据导入Sql Server数据库

    sqoop export 
    --connect 'jdbc:sqlserver://10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=TestDB' 
    --table ken_test 
    --export-dir /user/hive/warehouse/tmp1/part-m-00000 
    --num-mappers 1

    本人遇到的问题:

    • 导出文件指定到文件名
    • Error :Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434

              当有多个数据库实例时,注意开放相应的端口

              如连接实例SQL2008,连接字符串中地址改为 sqlserver://10.0.0.1SQL2008 

    • 一直报错,导出不成功
    ERROR tool.ExportTool: Error during export: Export job failed!

         最后通过表的每一个字段类型分析,主键的自增类型字段是否影响数据导入,测试结果,确实如此,不能对自增长类型字段直接赋值,当然是限于当前的环境

        若是我们在数据库客户端是可以这样操作的

    附参数说明:

    --append

    添加到HDFS已存在数据记录中

     --as-sequencefile

    import序列化的文件

     --as-textfile

     plain文件 ,默认

    --columns <col,col,col…>

     指定列import,逗号分隔,如:--columns "id,name"

    --delete-target-dir

    若已存在的import目录,则删除

    --direct

    直连模式,速度更快(HBase不支持)

    --fetch-size <n>

    一次从数据库读取n条数据

    -m,--num-mappers <n>

    建立 n 个并发执行task import

     -e,--query <statement>

    表达式<statement>执行,一般有条件查询数据时用

     --split-by <column-name>

    根据column分隔实例

     --autoreset-to-one-mappe

    如果没有主键和split-by参数  one mapper import,此参数与split-by参数二选一

     --target-dir <d>

      HDFS中目标路径,如/user/hive/warehouse

     --warehouse-dir <d>

    HDFS 中表的父级目录

     --where <where clause>

     指定where从句,如果有双引号,注意转义 $CONDITIONS,一定要加上,不能用or,子查询,join

     -z,--compress

     开启压缩

     --null-string <null-string>

      string列为空指定为此值

     --null-non-string <null-string>

      非string列为空指定为此值,-null这两个参数可选 , 如果不设置,会指定为"null"

         --export-dir

         指定导出的文件位置,不是目录,具体化文件名

     

  • 相关阅读:
    微信小程序里自定义组件,canvas组件没有效果
    微信小程序填坑之路(三):布局适配方案(rpx、px、vw、vh)
    小程序checkbox调整大小
    css让文字竖着排列 writing-mode 属性
    微信小程序 位置定位position详解,相对定位relative,绝对定位absolute相关问题
    小程序国际化实现方式
    mybatis plus 学习
    cesium js学习一加载三维模型【转】
    cesiumjs学习笔记之三——cesium-navigation插件 【转】
    局域网Cesium离线影像及瓦片影像地图加载【转】
  • 原文地址:https://www.cnblogs.com/kcen/p/8205334.html
Copyright © 2020-2023  润新知