我是用HDP按的Hadoop,Spark集群
1.我在服务器上跑的Spark程序,启动脚本如下
/usr/hdp/2.4.0.0-169/spark/bin/spark-submit --class com.lwb.streamingtest.steaming_sql.Spark_Stream_SQL_Test2 --master yarn --files /usr/hdp/2.4.0.0-169/spark/conf/hive-site.xml,/usr/hdp/2.4.0.0-169/hbase/conf/hbase-site.xml /alwb_test/SparkTest-0.0.1-SNAPSHOT-allinone.jar > aaa.log 2>&1 &
不加载hive-site.xml的时候会报一个异常。
2.我在启动脚本里设置了master是yarn意思是在yarn上执行,但是程序里的master设置是优先于启动脚本的。
我之前在程序里设置了SparkConf conf = new SparkConf().setAppName("lwb_sql1").setMaster("local[2]");
这个时候就是在本地执行,然后我就不会停止任务了。如果是在yarn上运行,关闭命令是
yarn application -kill applicationId ,但是在本地运行不是在yarn上运行这个命令就不好用了,我实验了半天。
最后我是先敲Linux命令jps,这是个java命令,可以查看用用java启动的进程,我也是突然想试一试才出来的。之后有两个名字一样的进程名字大概是Spark Submit,前边就是进程号,直接敲入 Linux 命令 kill 进程号,就杀掉了。
3.今天研究了一天sparksql的DataFrame的join函数遇到问题如下
我现在生成了两个DataFrame 一个数据来自 Oracle,一个数据来自Hive
我现在想将两张表进行内连接或者左连接
我是用JAVA语言实现的,之前的写法如下
dfHive.join(dfOracle,"vin").show();//这样是可以连接出来的(其实后来我才发现这么写就是内连接,那么我想左连接就需要用3个参数的写法了)
我想用左联的话需要使用3个参数的join,找了一天,都是scala的写法,没找到java的,官网我都没找到例子,也许是没找对地方吧,最后自己试出来的代码如下,谁能想到一个Column去equalTo另外一个Column,返回的居然还是Column类型。。。
df.join(jdbcDF,df.col("vin").equalTo(jdbcDF.col("VIN")),"left").show();
完整java代码如下:
import java.util.HashMap;
import java.util.Map;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.sql.Column;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.hive.HiveContext;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka.KafkaUtils;
import scala.Tuple2;
import com.alibaba.fastjson.JSONObject;
public class Spark_Stream_SQL_Test2 {
static final String ZK_QUORUM = "devhadoop3.reachauto.com:2181,devhadoop2.reachauto.com:2181,devhadoop1.reachauto.com:2181";
static final String GROUP = "spark_json_test_group";
static final String TOPICSS = "spark_sql_lwb_1";
static final String NUM_THREAD = "5";
@SuppressWarnings("serial")
public static void main(String[] args) throws Exception {
System.setProperty("HADOOP_USER_NAME", "spark");
SparkConf conf = new SparkConf().setAppName("lwb_sql1");//.setMaster("local[2]");
conf.set("spark.testing.memory", "2147480000");// 后面的值大于512m即可
JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(10));
/**
* 查询oracle
*/
SQLContext sqlContext = new SQLContext(jssc.sparkContext());
System.out.println("================" + sqlContext.getSQLDialect());
Map options = new HashMap();
options.put("user", "root");
options.put("password", "123456");
options.put("url", "jdbc:oracle:thin:@10.10.171.167:1521:ORCL");
options.put("dbtable", "test1");
// 一次取多少行数据
// options.put("fetchSize", "10");
options.put("driver", "oracle.jdbc.driver.OracleDriver");
final DataFrame jdbcDF = sqlContext.read().format("jdbc").options(options).load();
jdbcDF.show();
/**
* 查询hive
*/
final HiveContext hiveContext = new HiveContext(jssc.sparkContext());
int numThreads = Integer.parseInt(NUM_THREAD);
Map topicMap = new HashMap();
String[] topics = TOPICSS.split(",");
for (String topic : topics) {
topicMap.put(topic, numThreads);
}
JavaPairReceiverInputDStream messages = KafkaUtils.createStream(jssc, ZK_QUORUM, GROUP, topicMap);// 取出数据
JavaDStream lines = messages.map(new Function, String>() {// 只获取kafka的value实际值
public String call(Tuple2 tuple2) {
return tuple2._2();
}
});
lines.foreachRDD(new VoidFunction>() {
@Override
public void call(JavaRDD rdd) throws Exception {
for (String jsonStr : rdd.collect()) {
System.out.println("接收到数据:" + jsonStr);
JSONObject obj = JSONObject.parseObject(jsonStr);
String sql = obj.getString("sql");
System.out.println(sql);
DataFrame df = hiveContext.sql(sql);
df.join(jdbcDF,df.col("vin").equalTo(jdbcDF.col("VIN")),"left").show();
// df.join(jdbcDF,"vin").show();
}
}
});
jssc.start();//
jssc.awaitTermination();//
}
}