我正在研究一个用例,我必须将数据从RDBMS传输到HDFS.我们使用sqoop对此案例进行了基准测试,发现我们能够在6-7分钟内传输大约20GB的数据.
当我尝试使用Spark SQL时,性能非常低(1 GB的记录从netezza转移到hdfs需要4分钟).我正在尝试进行一些调整并提高其性能,但不太可能将其调整到sqoop的水平(1分钟内大约3 Gb的数据).
我同意spark主要是一个处理引擎这一事实,但我的主要问题是spark和sqoop都在内部使用JDBC驱动程序,所以为什么性能上有太大差异(或者可能是我遗漏了一些东西).我在这里发布我的代码.
object helloWorld {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Netezza_Connection").setMaster("local")
val sc= new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.read.format("jdbc").option("url","jdbc:netezza://hostname:port/dbname").option("dbtable","POC_TEST").option("user","user").option("password","password").option("driver","org.netezza.Driver").option("numPartitions","14").option("lowerBound","0").option("upperBound","13").option("partitionColumn", "id").option("fetchSize","100000").load().registerTempTable("POC")
val df2 =sqlContext.sql("select * from POC")
val partitioner= new org.apache.spark.HashPartitioner(14)
val rdd=df2.rdd.map(x=>(String.valueOf(x.get(1)),x)).partitionBy(partitioner).values
rdd.saveAsTextFile("hdfs://Hostname/test")
}
}
Run Code Online (Sandbox Code Playgroud)
我检查了很多其他帖子,但无法得到sqoop内部工作和调优的明确答案,也没有得到sqoop vs spark sql基准测试.有助于理解这个问题.
需要有关Sqoop增量进口的建议.假设我在第1天有一个策略1的客户,我在第1天在HDFS中导入了这些记录,我在Part Files中看到它们.
在第2天,同一客户添加了策略2,在增量导入sqoop运行之后,我们是否只在部件文件中获得新记录?在这种情况下,如何使用Sqoop获取旧的和增量的附加/最后修改记录?
在带有Sqoop 1.4.6的HDP 2.3.2上,我正在尝试从SQL Server 2008导入表.
我能够成功连接到SQL Server,因为我可以列出数据库和表等.
但是,在导入过程中每次遇到以下错误:
错误:java.lang.RuntimeException:java.lang.RuntimeException:com.microsoft.sqlserver.jdbc.SQLServerException:与主机xxxx,端口1433的TCP/IP连接失败.错误:"连接超时.验证连接属性.确保主机上正在运行SQL Server实例并接受端口上的TCP/IP连接.确保防火墙不阻止与端口的TCP连接. ".
我再次实际上能够从SQL Server成功导入,但只能在几次重试后才能成功导入.但是,无论导入成功还是失败,我总是得到上面提到的错误,我想知道是什么原因导致了这个问题?每当失败时必须继续重复导入是相当麻烦的.
我已经关闭了SQL Server上的连接超时,虽然来自Hadoop集群和SQL Server的连接通过我们的公司防火墙,但是我们的管理员告诉我防火墙上的超时是3600秒.在达到该标记附近之前,进口失败.
只是我使用的一个sqoop命令的示例:
sqoop import \
--connect "jdbc:sqlserver://x.x.x.:1433;database=CEMHistorical" \
--table StreamSummary --username hadoop \
--password-file hdfs:///user/sqoop/.adg.password --hive-import \
--hive-overwrite --create-hive-table --split-by OfferedTime \
--hive-table develop.streamsummary --map-column-hive Call_ID=STRING,Stream_ID=STRING,OriginalCall_ID=STRING,TransactionID=TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
更新:
在与我们的网络团队取得联系后,似乎这绝对是一个网络问题.要添加上下文,Hadoop集群与SQL Server位于不同的VLAN上,并且它通过许多防火墙.为了测试,我尝试从与Hadoop集群相同的VLAN内的不同SQL Server导入,但我根本没有遇到此异常.
我无法理解sqoop中以下命令之间的区别.如果有人可以用小例子来解释,那会更好.
--warehouse-dir and --target-dir
Run Code Online (Sandbox Code Playgroud)
谢谢
我试图通过Sqoop将一个包含3200万条记录的表从SQL Server导入Hive.连接是SQL Server成功的.但Map/Reduce作业无法成功执行.它给出以下错误:
18/07/19 04:00:11 INFO client.RMProxy: Connecting to ResourceManager at /127.0.0.1:8032
18/07/19 04:00:27 DEBUG db.DBConfiguration: Fetching password from job credentials store
18/07/19 04:00:27 INFO db.DBInputFormat: Using read commited transaction isolation
18/07/19 04:00:27 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound '1=1' and upper bound '1=1'
18/07/19 04:00:28 INFO mapreduce.JobSubmitter: number of splits:1
18/07/19 04:00:29 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1531917395459_0002
18/07/19 04:00:30 INFO impl.YarnClientImpl: Submitted application application_1531917395459_0002
18/07/19 04:00:30 INFO mapreduce.Job: The url to track the job: http://quickstart.cloudera:8088/proxy/application_1531917395459_0002/ …Run Code Online (Sandbox Code Playgroud) 要在Sqoop中安装MySQL连接器,我需要将jar文件放在Sqoop目录中,但我找不到它(它不在/usr/lib/sqoop).我在多台机器上安装了Cloudera的Sqoop.
我在哪里可以找到其中一台机器上的Sqoop目录?
摘要:
是否有可能:
- 使用«MongoDB Connector for Hadoop»将数据导入Hadoop.
- 使用Hadoop MapReduce处理它.
- 在单个事务中使用Sqoop导出它.
我正在使用MongoDB构建一个Web应用程序.虽然MongoDB适用于大多数工作,但在某些部分我需要更强的事务保证,我使用MySQL数据库.
我的问题是我想读取一个用于数据分析的大型MongoDB集合,但是集合的大小意味着分析工作需要很长时间才能处理.不幸的是,MongoDB的内置map-reduce框架不适合这项工作,所以我更愿意用Apache Hadoop进行分析.
我知道可以通过使用«MongoDB Connector for Hadoop»从MongoDB中读取数据,它从MongoDB读取数据,在Hadoop中使用MapReduce处理它,最后将结果输出回MongoDB数据库.
问题是我希望MapReduce的输出进入MySQL数据库而不是MongoDB,因为结果必须与其他MySQL表合并.
为此,我知道Sqoop可以将Hadoop MapReduce的结果导出到MySQL中.
最后,我想读取MongoDB数据,然后用Hadoop处理它,最后将结果输出到MySQL数据库中.
这可能吗?有哪些工具可以做到这一点?
我们正在使用Cloudera CDH 4,并且能够按预期将表从Oracle数据库导入到HDFS仓库中。问题是我们的数据库中有成千上万个表,而sqoop只支持一次导入一个表。
哪些选项可用于将多个表导入HDFS或Hive?例如,一次将200个表从oracle导入到HDFS或Hive的最佳方法是什么?
到目前为止,我看到的唯一解决方案是为每个表导入创建一个sqoop作业,然后分别运行它们。由于Hadoop设计用于处理大型数据集,因此似乎应该有更好的方法。
使用Sqoop将数据从oracle导入到hive,它的工作正常但它在hive中只创建了2个dataTypes String和Double.我想使用timeStamp作为某些列的数据类型.我该怎么做.
bin/sqoop import --table TEST_TABLE --connect jdbc:oracle:thin:@HOST:PORT:orcl --username USER1 -password password -hive-import --hive-home /user/lib/Hive/
Run Code Online (Sandbox Code Playgroud) 作为开发人员,我通过使用现有MySQL表导入数据为我们的项目创建了HBase表sqoop job.问题是我们的数据分析师团队熟悉MySQL语法,暗示他们可以HIVE轻松查询表.对他们来说,我需要在HIVE中公开HBase表.我不想通过在HIVE中再次填充数据来复制数据.此外,复制数据将来可能会出现一致性问题.
我可以在没有重复数据的情况下暴露HIVE中的HBase表吗?如果是,我该怎么办?另外,如果insert/update/delete我的HBase表中的数据将更新数据出现在HIVE中而没有任何问题?
有时,我们的数据分析团队会在HIVE中创建表格并填充数据.我可以将它们暴露给HBase吗?如果有,怎么样?