Sqoop1.99.7将MySQL数据导入到HDFS中

 准备html

本示例将实现从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中node

开始

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

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中默认提供了以下几种链接。 
linux

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

 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>

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

注意Identifier enclose项须要输入一个空格,而后回车 
数据库

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

 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名称)app

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是个空文件。

相关文章
相关标签/搜索