MSBI BigData demo—sqoop import
--sp_readerrorlog 读取错误的信息记录 exec sys.sp_readerrorlog 0, 1, 'listening'查看端口号
首先hadoop环境要配置完毕,并检验可以正常启动并使用.
在hadoop的namenode上安装sqoop,并设置相关的环境变量.
如HADOOP_HOME也是需要先配置好的.
否则提示找不到hadoop,Error: /usr/lib/hadoop does not exist!
我的实验环境是apache hadoop 1.0.4 ,java 1.7, sqoop 1.4.
在本机上安装了三台centos的linux系统作为小集群测试,一个namenode,两个Datanodes.
下面这一步骤可以不操作,如果你的sqoop是1.4以后的,就已经支持了mssqlserver.不必再提供sqlserver的jdbc驱动了.
否则的话你是需要下载安装sqlserver的jdbc驱动.
http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=21599
解压后复制相应的jar包到sqoop/lib下即可.
[hadoop@namenode sqoop-sqlserver-1.0]$ install.sh
Starting 'Microsoft SQL Server - Hadoop' Connector installation ...
SQOOP_HOME set to: /home/hadoop/sqoop-1.4.3
SQOOP_CONF_DIR set to: /home/hadoop/sqoop-1.4.3/conf
Installing 'SQL Server - Hadoop' Connector library ...
Installed library
Installing 'SQL Server - Hadoop' Connector configuration ...
Installed configuration
'SQL Server - Hadoop' Connector Installation completed successfully.
[hadoop@namenode sqoop-sqlserver-1.0]$
注意在执行命令之前,确保你linux中的防火墙是关闭的,请检查.
我的sqlserver2008R2装在win7操作系统上,IP地址是192.168.1.100:1433
我遇到的第一个问题就是连接超时,我检查了linux的防火墙服务是没有运行的,我检查win7上的防火墙是开启的,我就暂时关闭了win7上的防火墙服务.
我把默认实例开启windows和sql混合验证模式,并创建了一个登录用户:mssql pwd:yaoxiaohua,给赋适当的权限.
下面的第一个截图是我当时遇到的又一个问题,我把sqljdbc.jar 和 sqljdbc4.jar 之类的复制到了lib folder下,造成sqoop引用
sqljdbc 但jre1.7又和它不匹配,造成错误,所以删除即可.

实验一:把testdata表中的数据导入到HDFS中去:
./sqoop import --connect 'jdbc:sqlserver://192.168.1.100;username=mssql;password=yaoxiaohua;database=testData' --table testdata --target-dir /user/hadoop/testdata

其实细看上面的某些参数,你会发现默认的使用了4个map tasks.我们可以指定更多的map tasks,但是如果数据量不是特别大,就没有必要指定过多的map tasks,否则效率反而会低,例如,以此例,我们指定5个,我观测值发现居然还多了几秒,这是正常的,多线程也是需要代价的.如果数据量太少,发挥不出他们的优势.
以下命令是以rowid为分割标准,使用五个map tasks进行工作.
./sqoop import --connect 'jdbc:sqlserver://192.168.1.100;username=mssql;password=yaoxiaohua;database=testData' --table testdata --target-dir /user/hadoop/testdata2 --split-by rowid -m 5

关于sqoop是如何发送命令获取sqlserver中的数据,我们可以通过sqlprofiler等工具捕获,因为我在sqoop命令中是使用mssql用户登录的,所以你可以在Eventfilter中把loginname like mssql.这样捕获到的是我们想要的.

从图中可以看出,它首先exec sp_prepexec @p1 output,NULL,N'SELECT t.* FROM [testdata] AS tWHERE 1=0'
获取了数据的schema. 然后先获取一下rowid的最大最小值,然后分成大概均匀的四份,根据 rowid 四次取完数据.
它是怎么知道用rowid进行分批获取的呢?
我细看追踪到的内容,发现有以下一句:
SELECT kcu.COLUMN_NAME FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
WHERE tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
AND tc.TABLE_NAME = kcu.TABLE_NAME
AND tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
AND tc.TABLE_SCHEMA = (SELECT SCHEMA_NAME())
AND tc.TABLE_NAME = 'testdata'
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
原来它是先获取主键约束.然后再去根据这个进行处理.
我没有去阅读其源码,所以现在所做的一些只是通过实验尝试去猜去工作原理.然后我就创建了一个堆表进行测试.
create table mytable(rowname char(20),insertdate datetime default getdate())
declare @loopcount int =1
while @loopcount<10000
begin
insert into mytable(rowname) values('mycolumn'+CAST(@loopcount as CHAR));
set @loopcount +=1;
end
select * from mytable
执行:./sqoop import --connect 'jdbc:sqlserver://192.168.1.100;username=mssql;password=yaoxiaohua;database=testData' --table mytable --target-dir /user/hadoop/mytable
13/12/28 12:29:47 ERROR tool.ImportTool: Error during import: No primary key could be found for table mytable. Please specify one with --split-by or perform a sequential import with '-m 1'.
发现其运行报错了,找不到主键,则需要指定1个map task.
然后在前面的命令后面加上 -m 1之后运行正常.
然后我又做了一次尝试,把这个表添加主键,主键是char.
--drop table mytable
create table mytable(rowname char(20) primary key,insertdate datetime default getdate())
declare @loopcount int =1
while @loopcount<10000
begin
insert into mytable(rowname) values('mycolumn'+CAST(@loopcount as CHAR));
set @loopcount +=1;
end
select * from mytable

看执行情况,它给了6个map tasks.

最后一次尝试:
我使用rowname(即主键)作为split by的依据,只分了两个 map tasks,发现速度快了一些.比默认的6个快.
但看其输出日志有一部分,强烈建议使用整型的列作为分隔方式,而且如果是char类型的,若数据是大小写不敏感,有可能产生重复取值.这点也是大家需要注意的.

MSBI BigData demo—sqoop import的更多相关文章
- Hive学习之七《 Sqoop import 从关系数据库抽取到HDFS》
一.什么是sqoop Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL ...
- sqoop import/export使用经验
一.先创建一个小表(test_01)进行测试(主节点IP:169.254.109.130/oracle服务器IP:169.254.109.100) 1.测试连接oracle; sqoop list-t ...
- Sqoop Import HDFS
Sqoop import应用场景——密码访问 注:测试用表为本地数据库中的表 1.明码访问 sqoop list-databases \ --connect jdbc:mysql://202.193. ...
- Sqoop Import数据库时中文乱码解决方案
首先查看数据库参数编码: mysql> show variables like 'character%'; +--------------------------+--------------- ...
- (MySQL里的数据)通过Sqoop Import Hive 里 和 通过Sqoop Export Hive 里的数据到(MySQL)
Sqoop 可以与Hive系统结合,实现数据的导入和导出,用户需要在 sqoop-env.sh 中添加HIVE_HOME的环境变量. 具体,见我的如下博客: hadoop2.6.0(单节点)下Sqoo ...
- (MySQL里的数据)通过Sqoop Import HDFS 里 和 通过Sqoop Export HDFS 里的数据到(MySQL)(五)
下面我们结合 HDFS,介绍 Sqoop 从关系型数据库的导入和导出 一.MySQL里的数据通过Sqoop import HDFS 它的功能是将数据从关系型数据库导入 HDFS 中,其流程图如下所示. ...
- Sqoop Import原理和详细流程讲解
Sqoop Import原理 Sqoop Import详细流程讲解 Sqoop在import时,需要指定split-by参数.Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域 ...
- (MySQL里的数据)通过Sqoop Import HBase 里 和 通过Sqoop Export HBase 里的数据到(MySQL)
Sqoop 可以与HBase系统结合,实现数据的导入和导出,用户需要在 sqoop-env.sh 中添加HBASE_HOME的环境变量. 具体,见我的如下博客: hadoop2.6.0(单节点)下Sq ...
- sqoop import mysql to hive table:GC overhead limit exceeded
1. Scenario description when I use sqoop to import mysql table into hive, I got the following error: ...
随机推荐
- 详细讲解PHP中缓存技术的应用
PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2 ...
- Redis持久化-数据丢失及解决
Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的. 异步回写即BGSA ...
- Mysql的简单使用(三)
接上文Mysql的简单使用(二) mysql中结构相同的两个表进行合并:(注意需要两个表的结构是一样的) 有如下结构的两个表father和person. 合并的步骤为: 1.把person表和fath ...
- 【Effective Java】2、构造参数过多的时候
package cn.xf.cp.ch02.item2; /** * * 功能:当我们的构造参数有很多,超出可控范围的时候,用build模式 时间:下午8:25:05 文件:NutritionFact ...
- 设计模式总结篇系列:命令模式(Command)
在程序设计中,经常会遇到一个对象需要调用另外一个对象的某个方法以达到某种目的,在此场景中,存在两个角色:请求发出者和请求接收者.发出者发出请求,接收者接收请求并进行相应处理.有时候,当需要对请求发出者 ...
- Head First Design Patterns学习笔记-观察者模式
认识观察者模式 首先来看看报纸订阅的过程 1.报社的业务就是出版报纸 2.向某家报社订阅报纸,只要他们有新报纸出版,就会送过来,只要你是他们的订户 3.当你不想再看报纸的时候,取消订阅,他们就不会再送 ...
- SilverLight MD5加密
效果体验:http://keleyi.com/tool/md5.htm 嵌入页面的代码: <div style="width:400px;height:230px"> ...
- SQLSERVER数据库表各种同步技术
1 --SQLSERVER数据库表各种同步技术 减少SQLServer中每次的同步数据量 2 3 --说到数据库,我就不由地想到同步数据,如何尽可能地减少每次的同步数据量,以此来提高同步效率,降低对网 ...
- javascript --- 子对象访问父对象的方式
在传统面向对象的编程语言里,都会提供一种子类访问父类的特殊语法,引文我们在实现子类方法往往需要父类方法的额外辅助.在这种情况下,子类通常会调用父类中的同名方法,最终以便完成工作. javascript ...
- 微信CRM六大模块的详解
微信团队一直强调企业微信的主要功能是服务而非营销工具,微信5.0将公众号区分为服务号和订阅号,10月底平台为服务号开放高级接口,包括客服接口.网页授权等,可见服务是微信公众号的核心价值和方向.前一阵很 ...