问题描述
HDFS的DataNode节点,节点名称为主机名,非IP。
Spark Standalone模式下,Worker列表中,Address信息为IP,不是主机名。
这会导致Spark处理HDFS上的数据时,无法精准分发任务,大数据量下会有性能问题。
解决方案
修改sbin/start-slave.sh
下的start_instance
方法。
默认为:
function start_instance {
WORKER_NUM=$1
shift
if [ "$SPARK_WORKER_PORT" = "" ]; then
PORT_FLAG=
PORT_NUM=
else
PORT_FLAG="--port"
PORT_NUM=$(( $SPARK_WORKER_PORT + $WORKER_NUM - 1 ))
fi
WEBUI_PORT=$(( $SPARK_WORKER_WEBUI_PORT + $WORKER_NUM - 1 ))
"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS $WORKER_NUM \
--webui-port "$WEBUI_PORT" $PORT_FLAG $PORT_NUM $MASTER "$@"
}
修改为:
function start_instance {
WORKER_NUM=$1
shift
if [ "$SPARK_WORKER_PORT" = "" ]; then
PORT_FLAG=
PORT_NUM=
else
PORT_FLAG="--port"
PORT_NUM=$(( $SPARK_WORKER_PORT + $WORKER_NUM - 1 ))
fi
WEBUI_PORT=$(( $SPARK_WORKER_WEBUI_PORT + $WORKER_NUM - 1 ))
HOSTNAME=$(ping `hostname` | head -n 1 | awk '{print $2}')
"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS $WORKER_NUM \
--webui-port "$WEBUI_PORT" $PORT_FLAG $PORT_NUM $MASTER "$@" -h $HOSTNAME
}
启动Worker时,先获取该节点的主机名,然后通过-h参数传递过去就可以了。
Be the first person to leave a comment!