我需要使用tableau对一些数据进行bi分析。数据存储在cassandra数据库中,其中有一列包含动态json数据,不能通过tableau直接解析。
spark作业将使用java运行,连接到cassandra数据库,从而执行所需的计算,将每个json类型Map到一个新表,该表将被存储。
我已经设法启动了一个节俭服务器,并使用tableau连接到它,这里没有问题
问题:虽然我确实存储了表,并且能够在java输出控制台中看到它们,但是在连接到thrift服务器的tableau上查找它们时,我实际上看不到创建的表。
经过一段时间的阅读,我终于发现thrift server和这些spark作业都需要连接到同一个远程Hive,但我似乎找不到我必须应用的设置。这是因为thrift服务器shell脚本是在一个上下文中执行的,而java代码是在另一个上下文中执行的(尽管在同一台机器中),所以我猜hdfs目录是不同的。
一些代码:
public static void main(String[] args) {
SparkConf config = new SparkConf()
.setMaster("spark://Andres-MacBook-Air.local:7077")
.set("spark.sql.warehouse.dir", "/tmp/spark-tests")
.setAppName("tests");
SparkContext ctx = new SparkContext(config);
SparkSession session = new SparkSession(ctx);
SQLContext sqlCtx = new SQLContext(session);
Dataset<Row> emptyDataSet = session.createDataFrame(new ArrayList<>(), getSchema());
emptyDataSet.show();
sqlCtx.registerDataFrameAsTable(emptyDataSet, "tests");
emptyDataSet.cache();
System.out.println("*******");
Dataset<Row> row = sqlCtx.sql("SHOW TABLES IN `default`");
row.show();
while (true) {
}
}
private static StructType getSchema() {
String schemaString = "column1 column2 column3 column4 column5";
List<StructField> fields = new ArrayList<>();
StructField indexField = DataTypes.createStructField("column0", DataTypes.LongType, true);
fields.add(indexField);
for (String fieldName : schemaString.split(" ")) {
StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
fields.add(field);
}
StructType schema = DataTypes.createStructType(fields);
return schema;
}
spark thrift服务器连接到同一个spark主机,我发出以下命令来启动它:
sbin/start-thriftserver.sh --master spark://Andres-MacBook-Air.local:7077 --conf spark.sql.warehouse.dir=/tmp/spark-tests --hiveconf hive.server2.thrift.port=10000
以下是我在maven项目中使用的依赖项:
<dependencies>
<!-- Apache Spark -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.1</version>
</dependency>
<!-- Spark - Cassandra connector -->
<dependency>
<groupId>com.datastax.spark</groupId>
<artifactId>spark-cassandra-connector_2.11</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
我正在使用osx并在本地运行spark:spark-2.2.1-bin-hadoop2.7
提前谢谢。
1条答案
按热度按时间hwamh0ep1#
获取mysql db(端口3306),启动hive metastore进程(端口9083),启动hiveserver2进程(端口10000),然后将hive-site.xml从hive文件夹复制到spark文件夹,并启动spark thrift server进程(端口10002)。mysql需要存储配置单元表的元数据(模式/表/列名、数据类型、分区)。
这些链接可以帮助:
https://mapr.com/docs/52/spark/sparksqlthriftserver.htmlhttps://www.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_hive_metastore_configure.htmlhttpshttp://heshamrafi.wordpress.com/2017/08/16/install-hive-and-configure-mysql-for-metadata/https://www.guru99.com/installation-configuration-hive-mysql.htmlhttpshttp://developer.ibm.com/hadoop/2016/08/22/如何通过thrift server使用jdbc在spark sql上运行查询/