zoukankan      html  css  js  c++  java
  • Sqoop1.99.7将MySQL数据导入到HDFS中

     准备

    本示例将实现从MySQL数据库中将数据导入到HDFS中 
    参考文档: 
    http://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html 
    http://blog.csdn.net/m_signals/article/details/53190965 
    http://blog.csdn.net/lazythinker/article/details/52064165 
    http://blog.sina.com.cn/s/blog_61d8d9640102whof.html 
    mysql数据库信息: 
    test库中user表中的记录(共1条) 

    HDFS数据情况 

    创建了一个/root/test的空目录 
    实现目标: 
    本示例需要实现将上方MySQL数据库中的数据导入到HDFS中

    开始

    启动Hadoop,启动sqoop,命令行进入sqoop

    1 # 设置交互的命令行打印更多信息,打印的异常信息更多
    2 set option --name verbose --value true
    3 # 连接sqoop,其中hadoop1是需要连接的sqoop的主机名
    4 set server --host hadoop1 --port 12000--webapp sqoop
    5 # 查看连接
    6 show version --all

    如果需要使用sqoop进行导入导出操作,需要先创建连接。 
    使用show conncetor命令可以查看sqoop支持的连接器。 
    而sqoop中默认提供了如下几种连接。 

    本例实现mysql-->hdfs的数据导入操作,所以需要创建一个mysql的link和hdfs的link。 
    注意:在创建mysql-link的时候需要将mysql的jar包放入到$SQOOP2_HOME/server/lib/extra-lib目录中 
    首先创建mysql-link,过程如下

     1 sqoop:000> create link -connector generic-jdbc-connector
     2 Creating link for connector with name generic-jdbc-connector
     3 Please fill following values to create new link object
     4 Name: mysql-link
     5 Database connection
     6 Driverclass: com.mysql.jdbc.Driver
     7 ConnectionString: jdbc:mysql://10.25.40.37/test
     8 Username: root
     9 Password:*********
    10 FetchSize:
    11 ConnectionProperties:
    12 There are currently 0 values in the map:
    13 entry# protocol=tcp
    14 There are currently 1 values in the map:
    15 protocol = tcp
    16 entry#
    17 SQL Dialect
    18 Identifier enclose:
    19 New link was successfully created with validation status OK and name mysql-link
    20 sqoop:000>

    以上输入项说明,下图中红色的表示需要输入的内容。 

    注意Identifier enclose项需要输入一个空格,然后回车 

    创建HDFS的link的配置就比较简单,配置HDFS访问地址和hadoop配置文件目录路径即可

     1 sqoop:000> create link -connector hdfs-connector
     2 Creating link for connector with name hdfs-connector
     3 Please fill following values to create new link object
     4 Name: hdfs-link
     5 HDFS cluster
     6 URI: hdfs://hadoop1:9000
     7 Conf directory:/usr/local/hadoop/hadoop-2.7.4/etc/hadoop
     8 Additional configs::
     9 There are currently 0 values in the map:
    10 entry#
    11 New link was successfully created with validation status OK and name hdfs-link
    12 sqoop:000>

    创建job

    创建job时,配置项较多。 
    命令:

    1 # create job -f formLinkName -t toLinkName
    2 create job -f mysql-link -t hdfs-link

    注意下面红色部分 
    sqoop:000> create job -f mysql-link -t hdfs-link 
    Creating job for links with from name mysql-link and to name hdfs-link 
    Please fill following values to create new job object 
    Name: test1(job名称)

    Database source

    Schema name: test(数据库的schema名称) 
    Table name: user(数据库表名) 
    SQL statement: 
    Column names: 
    There are currently 0 values in the list: 
    element# 
    Partition column: 
    Partition column nullable: 
    Boundary query:

    Incremental read

    Check column: 
    Last value:

    Target configuration

    Override null value: 
    Null value: 
    File format: 
    0 : TEXT_FILE 
    1 : SEQUENCE_FILE 
    2 : PARQUET_FILE 
    Choose: 0(选择文本文件) 
    Compression codec: 
    0 : NONE 
    1 : DEFAULT 
    2 : DEFLATE 
    3 : GZIP 
    4 : BZIP2 
    5 : LZO 
    6 : LZ4 
    7 : SNAPPY 
    8 : CUSTOM 
    Choose: 0(选择NONE) 
    Custom codec: 
    Output directory: /root/test(这里输入HDFS文件的目录,需要是空目录) 
    Append mode:

    Throttling resources

    Extractors: 2(这里是参考官网填的2) 
    Loaders: 2(这里是参考官网填的2)

    Classpath configuration

    Extra mapper jars: 
    There are currently 0 values in the list: 
    element# 
    New job was successfully created with validation status OK and name test1 
    sqoop:000>

    启动job

    命令

    1 # start job -name jobName
    2 start job -name test1

    期间遇到的问题及解决方案

    以下问题均是创建完link和job后,开始启动job时报的错。

    Host '10.25.40.37' is not allowed to connect to this MySQL server


    错误原因: 
    这问题表示主机10.25.40.37没有授权外部访问其MySQL 
    解决方案: 
    将连接的MySQL主机中的授权信息改了

    1. 直接改mysql库中user表root的那条记录,将其值改为%(表示任何主机都可访问) 
    2. 使用授权命令,授权指定的主机可访问该数据库(推荐:更安全)
    1 mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
    2 mysql> FLUSH PRIVILEGES;

    详细操作步骤可自行百度。

    User: root is not allowed to impersonate root


    错误原因: 
    该错误是因为在安装sqoop时,在hadoop的core-site.xml配置文件中配置的用户权限错误 
    在之前的sqoop安装文章里,按照官网的配置如下。其中hadoop.proxyuser.sqoop2.hosts中的sqoop2是用户的意思,同理hadoop.proxyuser.sqoop2.groups中的sqoop2是用户组的意思。

    1 <property>
    2 <name>hadoop.proxyuser.sqoop2.hosts</name>
    3 <value>*</value>
    4 </property>
    5 <property>
    6 <name>hadoop.proxyuser.sqoop2.groups</name>
    7 <value>*</value>
    8 </property>

    解决方案: 
    将sqoop2改为root即可,改完后如下:(PS:这里的解决方案感觉还是有问题不完美,没有深入了解)

    1 <property>
    2 <name>hadoop.proxyuser.root.hosts</name>
    3 <value>*</value>
    4 </property>
    5 <property>
    6 <name>hadoop.proxyuser.root.groups</name>
    7 <value>*</value>
    8 </property>

    GENERIC_HDFS_CONNECTOR_0007:Invalid input/output directory - Unexpected exception

    输入输出目录有问题,检查HDFS中是否存在相应目录即可

    There are 0 datanode(s) running and no node(s) are excluded in this operation


    错误原因: 
    启动job的时候报的错,这应该是datanode节点数据的问题 
    解决方案:

    1. 配置dfs.datanode.data.dir和core-site.xml里面的hadoop.tmp.dir一致 
      hdfs-site.xml里面的 
      dfs.datanode.data.dir 
      /tmp/hdfs_tmp 
      与core-site.xml里面的 
      hadoop.tmp.dir 
      /tmp/hdfs_tmp 
      两个配置应该是指向同一个目录地址,而且必须是一个已经存在的linux目录(不存在目录的话,在启动hadoop时,必须手动创建,否则put文件到hdfs系统时就会报错),今天报这个错就是因为两个配置没有指向同一个目录地址,且两个地址还不存在对应的目录

    参考至: 
    http://blog.sina.com.cn/s/blog_61d8d9640102whof.html

    1. 删除dfs.namenode.data.dir中的current文件夹中的内容,格式化namenode,重新启动hadoop 
      参考至: 
      http://blog.csdn.net/qiruiduni/article/details/50280943

    最后我使用了1解决方案后问题解决了,但是不知道以后会不会有其他问题。

    Call From hadoop1/192.168.56.110 to 0.0.0.0:10020 failed on connection exception


    问题原因: 
    报错信息提示,在访问端口 100020的时候出错,这表示DataNode 需要访问 MapReduce JobHistory Server,而默认值是: 0.0.0.0:10020 。 
    解决方案: 
    找到{HADOOP_HOME}/etc/hadoop/mapred-site.xml配置文件 ,增加如下配置:

    1 <property>
    2 <name>mapreduce.jobhistory.address</name>
    3 <!-- 配置实际的主机名和端口-->
    4 <value>{namenode}:10020</value>
    5 </property>

    这里我的主机名是hadoop1,所以配置的值是hadoop1:10020 
     

    然后启动JobHistory服务即可:

    命令:mr-jobhistory-daemon.sh start historyserver

    {hadoop_home}/sbin/mr-jobhistory-daemon.sh start historyserver


    参考至: 
    http://blog.csdn.net/lazythinker/article/details/52064165

    GENERIC_HDFS_CONNECTOR_0007:Invalid input/output directory - Output directory is not empty


    错误原因: 
    输入或者输出目录不是空目录,本示例的错误原因是之前启动job后,在HDFS里已经导入过一些数据进去。没删除,所以报这个错。 
    解决方案: 
    删除该目录下的内容即可 
    清空上方创建job时指定的output目录(/root/test)中内容即可。

    验证是否导入成功

    查看HDFS中的/root/test/目录中的数据,共出现了2个文件 

    查看文件内容 

    可以看到2ea38d69-e9e4-4364-adfc-67d88f5c8153.txt文件中已经存在了导入的数据,而8962bce1-08e7-4ebc-939e-4839d05eb145.txt是个空文件。

  • 相关阅读:
    (1)一步一步开发一个简单二维CAD之基本框架
    weekly review 200844: Lazy
    《理解专业程序员》读书笔记
    weekly review 200843: House M.D.
    weekly review 200846: table tennis
    weekly review 200845: Work Hard Not Enough
    Change Your Mind and Your Life Will Follow
    weekly review 200847: tdd
    爱心·王搏计划“走出地震”影展需要志愿者(11月24日——11月26日)
    read_notes
  • 原文地址:https://www.cnblogs.com/meet/p/7682801.html
Copyright © 2011-2022 走看看