• 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
    View Code

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

    最后一次尝试:

    我使用rowname(即主键)作为split by的依据,只分了两个 map tasks,发现速度快了一些.比默认的6个快.

    但看其输出日志有一部分,强烈建议使用整型的列作为分隔方式,而且如果是char类型的,若数据是大小写不敏感,有可能产生重复取值.这点也是大家需要注意的.

       

    Looking for a job working at Home about MSBI
  • 相关阅读:
    功能检查和降级
    蓄水池问题
    Linux删除大于/小于固定大小的文件等
    理解Faster-RCNN 中的Anchor
    【转】DBSCAN密度聚类算法
    ROC曲线和PR曲线
    LSTM比较RNN
    【转】ROI Pooling
    【转】VGG网络结构及参数
    面试知识点准备(各方面)
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/3495242.html
Copyright © 2020-2023  润新知