gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:29:25 25 4
gpt4 key购买 nike

我正在使用 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>

ma​​pper.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.
.........................
.........................
  1. 毕竟我的疑问是如何在处理文件后将数据保存在 Database 中?
  2. 我们可以在哪个文件(mapper.py/reducer.py?)中编写将数据写入数据库的代码
  3. 哪个命令用于运行 hadoop 以将数据保存到数据库中,因为当我删除 hadoop 命令中的输出文件夹路径时,它显示错误。

谁能帮我解决上面的问题......

已编辑

已处理已关注

  1. 如上所述创建了 mapperreducer 文件,它们读取 xml 文件并通过 hadoop 命令 在某个文件夹中创建文本文件

    例:下面是文本文件(用hadoop命令处理xml文件的结果)所在的文件夹

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

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

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

我已经用基本的 python 尝试过这个,但是需要一些 350 sec 来处理文本文件并保存到 mysql 数据库。

  1. 现在按照 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 中以供进一步处理。而且使用起来非常简单。你需要做的就是

  1. 下载并配置sqoop
  2. 创建你的 mysql 表模式
  3. 指定 hadoop hdfs 文件名、结果表名和列分隔符。

阅读此了解更多信息:http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html

优势 使用 sqoop 是我们现在可以将我们的 hdfs 数据转换为任何类型的关系数据库(mysql、derby、hive 等),反之亦然

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

映射器.py

#!/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

数据库

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

啪啪啪

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

注意:

  1. 请根据需要更改映射器
  2. 我在映射器和 sqoop 命令中都使用“:”作为列分隔符。根据需要进行更改。
  3. Sqoop 教程:我个人一直关注 Hadoop:权威指南 (Oreilly) 以及 http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html .

关于python - 如何使用python将数据从hadoop保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com