博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop 之 Sqoop 安装配置与示例
阅读量:5896 次
发布时间:2019-06-19

本文共 3826 字,大约阅读时间需要 12 分钟。

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

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

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

一、下载安装包

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

下载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.6export 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 '\t'   //指定列的分隔符,这个很关键,在导入导出时最好指定

#增量导入

--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.1\SQL2008 

  • 一直报错,导出不成功
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

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

 

 

 

转载于:https://www.cnblogs.com/kcen/p/8205334.html

你可能感兴趣的文章
C++ Tip: How To Get Array Length | Dev102.com
查看>>
Python Socket学习 - garfieldtom - 博客园
查看>>
配置oracle账号密码永不过期
查看>>
Fluent NHibernate之旅
查看>>
android DDMS 连接真机(己ROOT),用file explore看不到data/data文件夹的解决办法
查看>>
sql server(常用)
查看>>
大数据项目实践(四)——之Hive配置
查看>>
js 调试接口
查看>>
Thread类源码解读(1)——如何创建和启动线程
查看>>
vue 实现数字滚动增加效果
查看>>
[LeetCode] Convert Sorted List to Binary Search Tree
查看>>
Bootstrap清除浮动的实现原理
查看>>
全球首届APMCon,带你给“应用性能”把把脉
查看>>
用户超5亿,三年投10亿,开发者如何抢滩支付宝小程序蓝海?
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
AVL树 & 重平衡概念
查看>>
NG-ZORRO-MOBILE 0.11.9 发布,基于 Angular 7 的 UI 组件
查看>>
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>