微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用python将数据从hadoop保存到数据库

我正在使用hadoop处理xml文件,所以我已经在python中编写了mapper文件,reducer文件.

假设需要处理的输入是test.xml

<report>
 <report-name name="ALL_TIME_KEYWORDS_PERFORMANCE_REPORT"/>
 <date-range date="All Time"/>
 <table>
  <columns>
   <column name="campaignID" display="Campaign ID"/>
   <column name="adGroupID" display="Ad group ID"/>
  </columns>
  <row campaignID="79057390" adGroupID="3451305670"/>
  <row campaignID="79057390" adGroupID="3451305670"/>
 </table>
</report>

mapper.py文件

import sys
import cStringIO
import xml.etree.ElementTree as xml

if __name__ == '__main__':
    buff = None
    intext = False
    for line in sys.stdin:
        line = line.strip()
        if line.find("<row") != -1:
        .............
        .............
        .............
        print '%s\t%s'%(campaignID,adGroupID )

reducer.py文件

import sys
if __name__ == '__main__':
    for line in sys.stdin:
        print line.strip()

我已经使用以下命令运行了hadoop

bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar 
- file /path/to/mapper.py file -mapper /path/to/mapper.py file 
-file /path/to/reducer.py file -reducer /path/to/reducer.py file 
-input /path/to/input_file/test.xml 
-output /path/to/output_folder/to/store/file

当我运行以上命令时,hadoop正在以我们在reducer.py文件中正确提及的格式与所需数据在输出路径中创建输出文件

现在毕竟我想做的是,当我运行上述命令时,我不想将输出数据存储在haddop认创建的文本文件中,而是想将数据保存到MysqL数据库

所以我在reducer.py文件中写了一些python代码,将数据直接写到MysqL数据库,并尝试通过删除如下所示的输出路径来运行上述命令

bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar 
- file /path/to/mapper.py file -mapper /path/to/mapper.py file 
-file /path/to/reducer.py file -reducer /path/to/reducer.py file 
-input /path/to/input_file/test.xml 

而且我收到以下类似的错误

12/11/08 15:20:49 ERROR streaming.StreamJob: Missing required option: output
Usage: $HADOOP_HOME/bin/hadoop jar \
          $HADOOP_HOME/hadoop-streaming.jar [options]
Options:
  -input    <path>     DFS input file(s) for the Map step
  -output   <path>     DFS output directory for the Reduce step
  -mapper   <cmd|JavaClassName>      The streaming command to run
  -combiner <cmd|JavaClassName> The streaming command to run
  -reducer  <cmd|JavaClassName>      The streaming command to run
  -file     <file>     File/dir to be shipped in the Job jar file
  -inputformat TextInputFormat(default)|SequenceFileAsTextInputFormat|JavaClassName Optional.
  -outputformat textoutputFormat(default)|JavaClassName  Optional.
   .........................
   .........................

>毕竟我怀疑在处理文件后如何将数据保存在数据库中?
>我们可以在哪个文件(mapper.py/reducer.py?)中编写将数据写入数据库代码
>该命令用于运行hadoop以将数据保存到数据库中,因为当我在hadoop命令中删除输出文件夹路径时,它显示一个错误.

谁能帮我解决以上问题………….

已编辑

已处理

>如上所述创建的映射器和化简器文件,可通过hadoop命令读取xml文件并在某个文件夹中创建文本文件

例如:文本文件(使用hadoop命令处理xml文件的结果)位于以下文件

/ home / local / user / Hadoop / xml_processing / xml_output / part-00000

这里的xml文件大小为1.3 GB,使用hadoop处理后,创建的文本文件的大小为345 MB

现在,我要做的就是读取上述路径中的文本文件,并尽快将数据保存到MysqL数据库中.

我已经使用基本的python进行了尝试,但是要花费350秒来处理文本文件并将其保存到MysqL数据库.

>现在,如nichole所示,下载了sqoop并解压缩到如下所示的某个路径

/home/local/user/sqoop-1.4.2.bin__hadoop-0.20

并输入到bin文件夹并键入./sqoop,我收到以下错误

sh-4.2$./sqoop
Warning: /usr/lib/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: $HADOOP_HOME is deprecated.

Try 'sqoop help' for usage.

我也在下面尝试过

./sqoop export --connect jdbc:MysqL://localhost/Xml_Data --username root --table PerformaceReport --export-dir /home/local/user/Hadoop/xml_processing/xml_output/part-00000 --input-fields-terminated-by '\t'

结果

Warning: /usr/lib/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: $HADOOP_HOME is deprecated.

12/11/27 11:54:57 INFO manager.MysqLManager: Preparing to use a MysqL streaming resultset.
12/11/27 11:54:57 INFO tool.CodeGenTool: Beginning code generation
12/11/27 11:54:57 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.MysqL.jdbc.Driver
java.lang.RuntimeException: Could not load db driver class: com.MysqL.jdbc.Driver
    at org.apache.sqoop.manager.sqlManager.makeConnection(sqlManager.java:636)
    at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)
    at org.apache.sqoop.manager.sqlManager.execute(sqlManager.java:525)
    at org.apache.sqoop.manager.sqlManager.execute(sqlManager.java:548)
    at org.apache.sqoop.manager.sqlManager.getColumnTypesForRawQuery(sqlManager.java:191)
    at org.apache.sqoop.manager.sqlManager.getColumnTypes(sqlManager.java:175)
    at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:262)
    at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1235)
    at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1060)
    at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:82)
    at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:64)
    at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:97)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:238)
    at com.cloudera.sqoop.Sqoop.main(Sqoop.java:57)

上面的sqoop命令对于读取文本文件并将其保存到数据库功能是否有用? ,因为我们必须处理文本文件并将其插入数据库

解决方法:

我用python编写了所有hadoop MR作业.我只是说您不需要使用python来移动数据.使用Sqoop:http://sqoop.apache.org/

Sqoop是一个开放源代码工具,允许用户将关系数据库中的数据提取到Hadoop中以进行进一步处理.并且其使用非常简单.您需要做的就是

>下载并配置sqoop
>创建您的MysqL表架构
>指定hadoop hdfs文件名,结果表名称和列分隔符.

阅读以获取更多信息:@L_502_2@

使用sqoop的优势在于,我们现在可以通过单行命令将hdfs数据转换为任何类型的关系数据库(MysqL,derby,hive等),反之亦然

对于您的用例,请进行必要的更改:

映射器

#!/usr/bin/env python

import sys
for line in sys.stdin:
        line = line.strip()
        if line.find("<row") != -1 :
            words=line.split(' ')
            campaignID=words[1].split('"')[1]
            adGroupID=words[2].split('"')[1]
            print "%s:%s:"%(campaignID,adGroupID)

流命令

bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar - file /path/to/mapper.py file -mapper /path/to/mapper.py file -file /path/to/reducer.py file -reducer /path/to/reducer.py file -input /user/input -output /user/output

MysqL

create database test;
use test;
create table testtable ( a varchar (100), b varchar(100) );

oop

./sqoop export --connect jdbc:MysqL://localhost/test --username root --table testNow --export-dir /user/output --input-fields-terminated-by ':'

注意 :

>请根据需要更改映射器
>我在映射器和sqoop命令中都使用了’:’作为列分隔符.根据需要进行更改.
> Sqoop教程:我个人遵循Hadoop:The Definitive Guide(Oreilly)以及@L_502_2@.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐