准备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时,配置项较多。
命令:安全
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>
命令
1 # start job -name jobName 2 start job -name test1
如下问题均是建立完link和job后,开始启动job时报的错。
错误缘由:
这问题表示主机10.25.40.37没有受权外部访问其MySQL
解决方案:
将链接的MySQL主机中的受权信息改了
1 mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; 2 mysql> FLUSH PRIVILEGES;
详细操做步骤可自行百度。
错误缘由:
该错误是由于在安装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>
输入输出目录有问题,检查HDFS中是否存在相应目录便可
错误缘由:
启动job的时候报的错,这应该是datanode节点数据的问题
解决方案:
参考至:
http://blog.sina.com.cn/s/blog_61d8d9640102whof.html
最后我使用了1解决方案后问题解决了,可是不知道之后会不会有其余问题。
问题缘由:
报错信息提示,在访问端口 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
错误缘由:
输入或者输出目录不是空目录,本示例的错误缘由是以前启动job后,在HDFS里已经导入过一些数据进去。没删除,因此报这个错。
解决方案:
删除该目录下的内容便可
清空上方建立job时指定的output目录(/root/test)中内容便可。
查看HDFS中的/root/test/目录中的数据,共出现了2个文件
查看文件内容 能够看到2ea38d69-e9e4-4364-adfc-67d88f5c8153.txt文件中已经存在了导入的数据,而8962bce1-08e7-4ebc-939e-4839d05eb145.txt是个空文件。